형식화된 데이터 세트의 Tableadapter에 대한 기존 저장 프로시저 사용(C#)
로 스콧 미첼
이전 자습서에서는 TableAdapter 마법사를 사용하여 새 저장 프로시저를 생성하는 방법을 알아보았습니다. 이 자습서에서는 동일한 TableAdapter 마법사가 기존 저장 프로시저에서 작동하는 방법을 알아봅니다. 또한 데이터베이스에 새 저장 프로시저를 수동으로 추가하는 방법도 알아봅니다.
소개
이전 자습서에서는 임시 SQL 문이 아닌 저장 프로시저를 사용하여 데이터에 액세스하도록 Typed DataSet의 TableAdapters를 구성하는 방법을 알아보았습니다. 특히 TableAdapter 마법사가 이러한 저장 프로시저를 자동으로 만드는 방법을 검토했습니다. 레거시 애플리케이션을 ASP.NET 2.0으로 포팅하거나 기존 데이터 모델을 중심으로 ASP.NET 2.0 웹 사이트를 빌드할 때 데이터베이스에 필요한 저장 프로시저가 이미 포함되어 있을 수 있습니다. 또는 저장 프로시저를 자동으로 생성하는 TableAdapter 마법사 이외의 도구를 통해 직접 또는 일부 도구를 통해 저장 프로시저를 만드는 것이 좋습니다.
이 자습서에서는 기존 저장 프로시저를 사용하도록 TableAdapter를 구성하는 방법을 살펴봅니다. Northwind 데이터베이스에는 작은 기본 제공 저장 프로시저 집합만 있으므로 Visual Studio 환경을 통해 데이터베이스에 새 저장 프로시저를 수동으로 추가하는 데 필요한 단계도 살펴보겠습니다. 시작해 보겠습니다!
참고 항목
트랜잭션 자습서 내의 데이터베이스 수정 래핑 자습서에서는 트랜잭션(BeginTransaction
CommitTransaction
등)을 지원하기 위해 TableAdapter에 메서드를 추가했습니다. 또는 데이터 액세스 계층 코드를 수정할 필요가 없는 저장 프로시저 내에서 트랜잭션을 완전히 관리할 수 있습니다. 이 자습서에서는 트랜잭션 범위 내에서 저장 프로시저 문을 실행하는 데 사용되는 T-SQL 명령을 살펴봅니다.
1단계: Northwind 데이터베이스에 저장 프로시저 추가
Visual Studio를 사용하면 데이터베이스에 새 저장 프로시저를 쉽게 추가할 수 있습니다. 특정 CategoryID
값이 있는 열에 대해 테이블의 모든 열을 Products
반환하는 새 저장 프로시저를 Northwind 데이터베이스에 추가해 보겠습니다. 서버 탐색기 창에서 해당 폴더(데이터베이스 다이어그램, 테이블, 뷰 등)가 표시되도록 Northwind 데이터베이스를 확장합니다. 이전 자습서에서 보았듯이 저장 프로시저 폴더에는 데이터베이스의 기존 저장 프로시저가 포함되어 있습니다. 새 저장 프로시저를 추가하려면 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 새 저장 프로시저 추가 옵션을 선택하기만 하면 됩니다.
그림 1: 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 새 저장 프로시저 추가(전체 크기 이미지를 보려면 클릭)
그림 1과 같이 새 저장 프로시저 추가 옵션을 선택하면 저장 프로시저를 만드는 데 필요한 SQL 스크립트의 개요가 포함된 스크립트 창이 Visual Studio에서 열립니다. 이 스크립트를 구체화하고 실행하는 것이 우리의 작업이며, 이 시점에서 저장 프로시저가 데이터베이스에 추가됩니다.
다음 스크립트를 입력합니다.
CREATE PROCEDURE dbo.Products_SelectByCategoryID
(
@CategoryID int
)
AS
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE CategoryID = @CategoryID
이 스크립트를 실행하면 Northwind 데이터베이스 Products_SelectByCategoryID
에 새 저장 프로시저가 추가됩니다. 이 저장 프로시저는 단일 입력 매개 변수(@CategoryID
형식 int
)를 허용하며 일치하는 CategoryID
값을 가진 해당 제품에 대한 모든 필드를 반환합니다.
이 CREATE PROCEDURE
스크립트를 실행하고 데이터베이스에 저장 프로시저를 추가하려면 도구 모음에서 저장 아이콘을 클릭하거나 Ctrl+S를 누릅니다. 이렇게 하면 저장 프로시저 폴더가 새로 고쳐지고 새로 만든 저장 프로시저가 표시됩니다. 또한 창의 스크립트는 미묘하게 CREATE PROCEDURE dbo.Products_SelectProductByCategoryID
ALTER PROCEDURE
dbo.Products_SelectProductByCategoryID
변경됩니다. CREATE PROCEDURE
는 기존 저장 프로시저를 업데이트하는 동안 ALTER PROCEDURE
데이터베이스에 새 저장 프로시저를 추가합니다. 스크립트의 시작이 변경 ALTER PROCEDURE
되었으므로 저장 프로시저 입력 매개 변수 또는 SQL 문을 변경하고 저장 아이콘을 클릭하면 저장 프로시저가 이러한 변경 내용으로 업데이트됩니다.
그림 2는 저장 프로시저를 저장한 Products_SelectByCategoryID
후 Visual Studio를 보여줍니다.
그림 2: 저장 프로시저 Products_SelectByCategoryID
가 데이터베이스에 추가되었습니다(전체 크기 이미지를 보려면 클릭).
2단계: 기존 저장 프로시저를 사용하도록 TableAdapter 구성
Products_SelectByCategoryID
이제 저장 프로시저가 데이터베이스에 추가되었으므로 해당 메서드 중 하나가 호출될 때 이 저장 프로시저를 사용하도록 데이터 액세스 계층을 구성할 수 있습니다. 특히 방금 만든 저장 프로시저를 호출하는 ProductsTableAdapter
NorthwindWithSprocs
형식화된 데이터 세트의 메서드를 Products_SelectByCategoryID
추가 GetProductsByCategoryID(categoryID)
합니다.
먼저 DataSet을 NorthwindWithSprocs
여세요. 마우스 오른쪽 단추를 클릭하고 ProductsTableAdapter
쿼리 추가를 선택하여 TableAdapter 쿼리 구성 마법사를 시작합니다. 이전 자습서에서는 TableAdapter에서 새 저장 프로시저를 만들도록 선택했습니다. 그러나 이 자습서에서는 새 TableAdapter 메서드를 기존 Products_SelectByCategoryID
저장 프로시저에 연결하려고 합니다. 따라서 마법사의 첫 번째 단계에서 기존 저장 프로시저 사용 옵션을 선택하고 다음을 클릭합니다.
그림 3: 기존 저장 프로시저 사용 옵션 선택(전체 크기 이미지를 보려면 클릭)
다음 화면에서는 데이터베이스 저장 프로시저로 채워진 드롭다운 목록을 제공합니다. 저장 프로시저를 선택하면 왼쪽의 입력 매개 변수와 오른쪽에 반환된 데이터 필드(있는 경우)가 나열됩니다. Products_SelectByCategoryID
목록에서 저장 프로시저를 선택하고 다음을 클릭합니다.
그림 4: 저장 프로시저 선택 Products_SelectByCategoryID
(전체 크기 이미지를 보려면 클릭)
다음 화면에서는 저장 프로시저에서 반환되는 데이터 종류를 묻고 여기에 대한 답변은 TableAdapter 메서드에서 반환되는 형식을 결정합니다. 예를 들어 테이블 형식 데이터가 반환되었음을 나타내는 경우 메서드는 저장 프로시저에서 반환된 레코드로 채워진 인스턴스를 반환 ProductsDataTable
합니다. 반면, 이 저장 프로시저가 단일 값을 반환한다고 표시하면 TableAdapter는 저장 프로시저에서 반환된 첫 번째 레코드의 첫 번째 열에 할당된 값을 반환 object
합니다.
저장 프로시저는 Products_SelectByCategoryID
특정 범주에 속하는 모든 제품을 반환하므로 첫 번째 답변인 테이블 형식 데이터를 선택하고 다음을 클릭합니다.
그림 5: 저장 프로시저가 테이블 형식 데이터를 반환함을 나타냅니다(전체 크기 이미지를 보려면 클릭).
이 메서드의 이름 뒤에 사용할 메서드 패턴을 나타내기만 하면 됩니다. DataTable 채우기 및 DataTable 반환 옵션을 모두 선택한 상태로 두고 메서드 FillByCategoryID
GetProductsByCategoryID
이름을 바꿉니다. 그런 다음 다음을 클릭하여 마법사가 수행할 작업의 요약을 검토합니다. 모든 항목이 올바르게 표시되면 마침을 클릭합니다.
그림 6: 메서드 FillByCategoryID
이름을 지정하고 GetProductsByCategoryID
(전체 크기 이미지를 보려면 클릭)
참고 항목
방금 만든 FillByCategoryID
TableAdapter 메서드는 GetProductsByCategoryID
형식 int
의 입력 매개 변수를 예상합니다. 이 입력 매개 변수 값은 해당 매개 변수를 통해 @CategoryID
저장 프로시저에 전달됩니다. 저장 프로시저의 매개 변수를 Products_SelectByCategory
수정하는 경우 이러한 TableAdapter 메서드에 대한 매개 변수도 업데이트해야 합니다. 이전 자습서에서 설명한 것처럼 매개 변수 컬렉션에서 매개 변수를 수동으로 추가하거나 제거하거나 TableAdapter 마법사를 다시 실행하여 두 가지 방법 중 하나로 이 작업을 수행할 수 있습니다.
3단계: BLL에 메서드 추가GetProductsByCategoryID(categoryID)
DAL 메서드가 GetProductsByCategoryID
완료되면 다음 단계는 비즈니스 논리 계층에서 이 메서드에 대한 액세스를 제공하는 것입니다. ProductsBLLWithSprocs
클래스 파일을 열고 다음 메서드를 추가합니다.
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetProductByCategoryID(int categoryID)
{
return Adapter.GetProductsByCategoryID(categoryID);
}
이 BLL 메서드는 단순히 s GetProductsByCategoryID
메서드에서 반환된 값을 ProductsTableAdapter
반환 ProductsDataTable
합니다. 이 특성은 DataObjectMethodAttribute
ObjectDataSource의 데이터 원본 구성 마법사에서 사용하는 메타데이터를 제공합니다. 특히 이 메서드는 SELECT 탭의 드롭다운 목록에 표시됩니다.
4단계: 범주별 제품 표시
새로 추가 Products_SelectByCategoryID
된 저장 프로시저와 해당 DAL 및 BLL 메서드를 테스트하려면 DropDownList 및 GridView가 포함된 ASP.NET 페이지를 만들어 보겠습니다. DropDownList는 데이터베이스의 모든 범주를 나열하고 GridView는 선택한 범주에 속하는 제품을 표시합니다.
참고 항목
이전 자습서에서는 DropDownLists를 사용하여 마스터/세부 인터페이스를 만들었습니다. 이러한 마스터/세부 정보 보고서 구현에 대한 자세한 내용은 DropDownList를 사용한 마스터/세부 정보 필터링 자습서를 참조하세요.
폴더에서 ExistingSprocs.aspx
AdvancedDAL
페이지를 열고 도구 상자에서 디자이너로 DropDownList를 끕니다. DropDownList의 ID
속성을 Categories
.로 설정하고 해당 AutoPostBack
속성을 .로 true
설정합니다. 그런 다음 스마트 태그에서 DropDownList를 새 ObjectDataSource에 CategoriesDataSource
바인딩합니다. 클래스의 GetCategories
메서드에서 해당 데이터를 검색할 수 있도록 ObjectDataSource를 CategoriesBLL
구성합니다. UPDATE, INSERT 및 DELETE 탭의 드롭다운 목록을 (없음)으로 설정합니다.
그림 7: 클래스 메서드 GetCategories
에서 CategoriesBLL
데이터 검색(전체 크기 이미지를 보려면 클릭)
그림 8: UPDATE, INSERT 및 DELETE 탭의 드롭다운 목록을 (없음)으로 설정(전체 크기 이미지를 보려면 클릭)
ObjectDataSource 마법사를 완료한 후 DropDownList를 구성하여 데이터 필드를 표시 CategoryName
하고 필드를 각각ListItem
에 대한 필드로 Value
사용합니다CategoryID
.
이 시점에서 DropDownList 및 ObjectDataSource의 선언적 태그는 다음과 유사해야 합니다.
<asp:DropDownList ID="Categories" runat="server" AutoPostBack="True"
DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
DataValueField="CategoryID">
</asp:DropDownList>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
그런 다음, GridView를 디자이너로 끌어서 DropDownList 아래에 놓습니다. GridView ID
ProductsByCategory
를 스마트 태그로 설정하고 해당 태그에서 새 ObjectDataSource에 ProductsByCategoryDataSource
바인딩합니다. 메서드를 ProductsByCategoryDataSource
사용하여 해당 데이터를 검색하도록 클래스를 ProductsBLLWithSprocs
사용하도록 ObjectDataSource를 GetProductsByCategoryID(categoryID)
구성합니다. 이 GridView는 데이터를 표시하는 데만 사용되므로 UPDATE, INSERT 및 DELETE 탭의 드롭다운 목록을 (없음)으로 설정하고 다음을 클릭합니다.
그림 9: 클래스를 사용하도록 ProductsBLLWithSprocs
ObjectDataSource 구성(전체 크기 이미지를 보려면 클릭)
그림 10: 메서드에서 GetProductsByCategoryID(categoryID)
데이터 검색(전체 크기 이미지를 보려면 클릭)
SELECT 탭에서 선택한 메서드에는 매개 변수가 있으므로 마법사의 마지막 단계에서 매개 변수 원본을 묻는 메시지가 표시됩니다. 매개 변수 원본 드롭다운 목록을 Control으로 설정하고 ControlID 드롭다운 목록에서 컨트롤을 선택합니다 Categories
. 마침을 클릭하여 마법사를 완료합니다.
그림 11: DropDownList를 Categories
매개 변수의 categoryID
원본으로 사용(전체 크기 이미지를 보려면 클릭)
ObjectDataSource 마법사를 완료하면 Visual Studio에서 각 제품 데이터 필드에 대한 BoundFields 및 CheckBoxField를 추가합니다. 원하는 대로 이러한 필드를 자유롭게 사용자 지정할 수 있습니다.
브라우저를 통해 페이지를 방문합니다. 페이지를 방문할 때 음료 범주가 선택되고 표에 나열된 해당 제품이 선택됩니다. 그림 12와 같이 드롭다운 목록을 대체 범주로 변경하면 포스트백이 발생하고 새로 선택한 범주의 제품으로 그리드를 다시 로드합니다.
그림 12: 제품 범주의 제품이 표시됩니다(전체 크기 이미지를 보려면 클릭).
5단계: 트랜잭션 범위 내에서 저장 프로시저 문 래핑
트랜잭션 내 데이터베이스 수정 래핑 자습서에서는 트랜잭션 범위 내에서 일련의 데이터베이스 수정 문을 수행하는 기술에 대해 설명했습니다. 트랜잭션의 우산 아래에서 수행된 수정은 모두 성공하거나 모두 실패하여 원자성을 보장합니다. 트랜잭션을 사용하는 기술은 다음과 같습니다.
- 네임스페이스의 클래스 사용
System.Transactions
- 데이터 액세스 계층이 ADO.NET 클래스를 사용하도록 설정
SqlTransaction
- 저장 프로시저 내에서 직접 T-SQL 트랜잭션 명령 추가
트랜잭션 자습서 내에서 데이터베이스 수정 래핑은 DAL의 ADO.NET 클래스를 사용했습니다. 이 자습서의 나머지 부분에서는 저장 프로시저 내에서 T-SQL 명령을 사용하여 트랜잭션을 관리하는 방법을 살펴봅니다.
트랜잭션을 수동으로 시작, 커밋 및 롤백하기 위한 세 가지 주요 SQL 명령은 각각 , 및 ROLLBACK TRANSACTION
입니다COMMIT TRANSACTION
BEGIN TRANSACTION
. ADO.NET 방식과 마찬가지로 저장 프로시저 내에서 트랜잭션을 사용하는 경우 다음 패턴을 적용해야 합니다.
- 트랜잭션의 시작을 나타냅니다.
- 트랜잭션을 구성하는 SQL 문을 실행합니다.
- 2단계의 문 중 하나에 오류가 있는 경우 트랜잭션을 롤백합니다.
- 2단계의 모든 문이 오류 없이 완료되면 트랜잭션을 커밋합니다.
이 패턴은 다음 템플릿을 사용하여 T-SQL 구문에서 구현할 수 있습니다.
BEGIN TRY
BEGIN TRANSACTION -- Start the transaction
... Perform the SQL statements that makeup the transaction ...
-- If we reach here, success!
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Whoops, there was an error
ROLLBACK TRANSACTION
-- Raise an error with the
-- details of the exception
DECLARE @ErrMsg nvarchar(4000),
@ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
템플릿은 SQL Server 2005의 TRY...CATCH
새로운 구문인 블록을 정의하여 시작합니다. C#의 블록과 try...catch
마찬가지로 SQL TRY...CATCH
블록은 블록에서 TRY
문을 실행합니다. 문이 오류를 발생하면 컨트롤이 즉시 블록으로 CATCH
전송됩니다.
트랜잭션을 구성하는 SQL 문을 실행하는 동안 오류가 없는 경우 문은 COMMIT TRANSACTION
변경 내용을 커밋하고 트랜잭션을 완료합니다. 그러나 문 중 하나에서 오류가 발생하는 경우 블록 내 ROLLBACK TRANSACTION
CATCH
의 데이터베이스는 트랜잭션이 시작되기 전에 데이터베이스를 해당 상태로 반환합니다. 또한 저장 프로시저는 RAISERROR 명령을 사용하여 오류를 발생시키는데, 이로 인해 SqlException
애플리케이션에서 오류가 발생합니다.
참고 항목
TRY...CATCH
이 블록은 SQL Server 2005를 새로 사용하기 때문에 이전 버전의 Microsoft SQL Server를 사용하는 경우 위의 템플릿이 작동하지 않습니다.
구체적인 예를 살펴보겠습니다. 외래 키 제약 조건은 테이블과 테이블 사이에 Categories
존재합니다. 즉, 테이블의 Products
각 CategoryID
필드가 테이블의 Categories
값에 CategoryID
매핑되어야 Products
합니다. 연결된 제품이 있는 범주를 삭제하는 것과 같이 이 제약 조건을 위반하는 모든 작업은 외래 키 제약 조건 위반을 초래합니다. 이를 확인하려면 이진 데이터 작업 섹션(~/BinaryData/UpdatingAndDeleting.aspx
)에서 기존 이진 데이터 업데이트 및 삭제 예제를 다시 확인합니다. 이 페이지에는 편집 및 삭제 단추와 함께 시스템의 각 범주가 나열되어 있지만(그림 13 참조) 음료와 같은 관련 제품이 있는 범주를 삭제하려고 하면 외래 키 제약 조건 위반으로 인해 삭제가 실패합니다(그림 14 참조).
그림 13: 편집 및 삭제 단추가 있는 GridView에 각 범주가 표시됩니다(전체 크기 이미지를 보려면 클릭).
그림 14: 기존 제품이 있는 범주를 삭제할 수 없습니다(전체 크기 이미지를 보려면 클릭).
하지만 관련 제품이 있는지 여부에 관계없이 범주를 삭제하도록 허용하려고 한다고 상상해 보십시오. 제품이 포함된 범주를 삭제하는 경우 기존 제품도 삭제하려고 한다고 가정해 보십시오(다른 옵션은 단순히 제품 CategoryID
값을 NULL
설정하는 것일 수도 있음). 이 기능은 외래 키 제약 조건의 연계 규칙을 통해 구현할 수 있습니다. 또는 입력 매개 변수를 허용하는 저장 프로시저를 @CategoryID
만들고 호출될 때 연결된 모든 제품과 지정된 범주를 명시적으로 삭제할 수 있습니다.
이러한 저장 프로시저에 대한 첫 번째 시도는 다음과 같을 수 있습니다.
CREATE PROCEDURE dbo.Categories_Delete
(
@CategoryID int
)
AS
-- First, delete the associated products...
DELETE FROM Products
WHERE CategoryID = @CategoryID
-- Now delete the category
DELETE FROM Categories
WHERE CategoryID = @CategoryID
이것은 확실히 관련 제품 및 범주를 삭제하지만, 그것은 거래의 우산에서 그렇게하지 않습니다. 특정 @CategoryID
값의 삭제를 금지하는 다른 외래 키 제약 조건이 Categories
있다고 상상해 보십시오. 문제는 이러한 경우 범주를 삭제하기 전에 모든 제품이 삭제된다는 것입니다. 결과적으로 이러한 범주의 경우 이 저장 프로시저는 다른 테이블에 관련 레코드가 남아 있으므로 범주가 남아 있는 동안 모든 제품을 제거합니다.
그러나 저장 프로시저가 트랜잭션 범위 내에서 래핑된 경우 삭제가 실패하면 테이블에 대한 Categories
삭제 Products
가 롤백됩니다. 다음 저장 프로시저 스크립트는 트랜잭션을 사용하여 두 DELETE
문 간의 원자성을 보장합니다.
CREATE PROCEDURE dbo.Categories_Delete
(
@CategoryID int
)
AS
BEGIN TRY
BEGIN TRANSACTION -- Start the transaction
-- First, delete the associated products...
DELETE FROM Products
WHERE CategoryID = @CategoryID
-- Now delete the category
DELETE FROM Categories
WHERE CategoryID = @CategoryID
-- If we reach here, success!
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Whoops, there was an error
ROLLBACK TRANSACTION
-- Raise an error with the
-- details of the exception
DECLARE @ErrMsg nvarchar(4000),
@ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
잠시 시간을 내어 저장 프로시저를 Categories_Delete
Northwind 데이터베이스에 추가합니다. 데이터베이스에 저장 프로시저를 추가하는 방법에 대한 지침은 1단계를 다시 참조하세요.
6단계: 업데이트CategoriesTableAdapter
데이터베이스에 Categories_Delete
저장 프로시저를 추가하는 동안 DAL은 현재 임시 SQL 문을 사용하여 삭제를 수행하도록 구성됩니다. 대신 저장 프로시저를 CategoriesTableAdapter
사용하도록 Categories_Delete
업데이트하고 지시해야 합니다.
참고 항목
이 자습서의 앞부분에서는 DataSet을 사용했습니다 NorthwindWithSprocs
. 그러나 DataSet에는 단일 엔터티 ProductsDataTable
만 있으며 범주를 사용해야 합니다. 따라서 이 자습서의 나머지 부분에서 데이터 액세스 계층 만들기 자습서에서 처음 만든 DataSet을 참조하는 Northwind
데이터 액세스 계층에 대해 설명합니다.
Northwind DataSet을 열고 , 를 선택한 CategoriesTableAdapter
다음, 속성 창 이동합니다. 속성 창 TableAdapter에서 InsertCommand
사용되는 , DeleteCommand
UpdateCommand
및 SelectCommand
이름 및 연결 정보를 나열합니다. DeleteCommand
속성을 확장하여 세부 정보를 확인합니다. 그림 15와 DeleteCommand
같이 s CommandType
속성은 Text로 설정되며, 이 속성은 속성의 CommandText
텍스트를 임시 SQL 쿼리로 보내도록 지시합니다.
그림 15: 디자이너에서 속성을 속성 CategoriesTableAdapter
창에서 보려면
이러한 설정을 변경하려면 속성 창 (DeleteCommand) 텍스트를 선택하고 드롭다운 목록에서 (새로 만들기)를 선택합니다. 그러면 , CommandType
및 Parameters
속성에 대한 설정이 CommandText
지워집니다. 다음으로 속성을 StoredProcedure
설정한 CommandType
다음 (dbo.Categories_Delete
)에 대한 CommandText
저장 프로시저의 이름을 입력합니다. 이 순서대로 속성을 입력해야 하는 경우(먼저 CommandType
속성을 입력한 다음 CommandText
) Visual Studio에서 Parameters 컬렉션을 자동으로 채웁히게 됩니다. 이 순서대로 이러한 속성을 입력하지 않으면 매개 변수 컬렉션 편집기를 통해 매개 변수를 수동으로 추가해야 합니다. 두 경우 모두 매개 변수 속성의 줄임표를 클릭하여 매개 변수 컬렉션 편집기를 표시하여 올바른 매개 변수 설정이 변경되었는지 확인하는 것이 좋습니다(그림 16 참조). 대화 상자에 매개 변수가 표시되지 않으면 매개 변수를 @CategoryID
수동으로 추가합니다(매개 변수를 @RETURN_VALUE
추가할 필요가 없음).
그림 16: 매개 변수 설정이 올바른지 확인
DAL이 업데이트되면 범주를 삭제하면 관련된 모든 제품이 자동으로 삭제되고 트랜잭션의 우산 아래에서 삭제됩니다. 이를 확인하려면 기존 이진 데이터 업데이트 및 삭제 페이지로 돌아가서 범주 중 하나에 대한 삭제 단추를 클릭합니다. 마우스를 한 번 클릭하면 범주와 관련된 모든 제품이 삭제됩니다.
참고 항목
선택한 범주와 함께 여러 제품을 삭제하는 저장 프로시저를 테스트 Categories_Delete
하기 전에 데이터베이스의 백업 복사본을 만드는 것이 신중할 수 있습니다. 데이터베이스App_Data
를 NORTHWND.MDF
사용하는 경우 Visual Studio를 닫고 MDF 및 LDF 파일을 다른 폴더에 App_Data
복사하기만 하면 됩니다. 기능을 테스트한 후 Visual Studio를 닫고 현재 MDF 및 LDF 파일을 App_Data
백업 복사본으로 바꿔서 데이터베이스를 복원할 수 있습니다.
요약
TableAdapter 마법사는 자동으로 저장 프로시저를 생성하지만, 이러한 저장 프로시저를 이미 만들었거나 수동으로 만들거나 다른 도구를 사용하여 만들려는 경우가 있습니다. 이러한 시나리오를 수용하기 위해 기존 저장 프로시저를 가리키도록 TableAdapter를 구성할 수도 있습니다. 이 자습서에서는 Visual Studio 환경을 통해 데이터베이스에 저장 프로시저를 수동으로 추가하는 방법과 TableAdapter 메서드를 이러한 저장 프로시저에 연결하는 방법을 살펴보았습니다. 또한 저장 프로시저 내에서 트랜잭션을 시작, 커밋 및 롤백하는 데 사용되는 T-SQL 명령 및 스크립트 패턴을 검사했습니다.
행복한 프로그래밍!
작성자 정보
7개의 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 연구해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 티치 자신 ASP.NET 24 시간에 2.0입니다. 그는 에서 mitchell@4GuysFromRolla.com찾을 http://ScottOnWriting.NET수있는 자신의 블로그를 통해 도달 할 수 있습니다 .
특별 감사
이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 힐튼 가이세나우, S 렌 제이콥 로리센, 테레사 머피였습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 선을 놓습니다 mitchell@4GuysFromRolla.com.