형식화된 데이터 세트의 TableAdapter에 대한 기존 저장 프로시저 사용(VB)

작성자 : Scott Mitchell

PDF 다운로드

이전 자습서에서는 TableAdapter 마법사를 사용하여 새 저장 프로시저를 생성하는 방법을 알아보았습니다. 이 자습서에서는 동일한 TableAdapter 마법사가 기존 저장 프로시저에서 작동하는 방법을 알아봅니다. 또한 데이터베이스에 새 저장 프로시저를 수동으로 추가하는 방법도 알아봅니다.

소개

이전 자습서에서는 임시 SQL 문이 아닌 저장 프로시저를 사용하여 데이터에 액세스하도록 Typed DataSet의 TableAdapters를 구성하는 방법을 알아보았습니다. 특히 TableAdapter 마법사에서 이러한 저장 프로시저를 자동으로 만드는 방법을 살펴보었습니다. 레거시 애플리케이션을 ASP.NET 2.0으로 포팅하거나 기존 데이터 모델을 중심으로 ASP.NET 2.0 웹 사이트를 빌드할 때 데이터베이스에 필요한 저장 프로시저가 이미 포함되어 있을 수 있습니다. 또는 저장 프로시저를 자동으로 생성하는 TableAdapter 마법사 이외의 도구를 통해 직접 또는 일부 도구를 통해 저장 프로시저를 만드는 것이 좋습니다.

이 자습서에서는 기존 저장 프로시저를 사용하도록 TableAdapter를 구성하는 방법을 살펴봅니다. Northwind 데이터베이스에는 작은 기본 제공 저장 프로시저 집합만 있으므로 Visual Studio 환경을 통해 데이터베이스에 새 저장 프로시저를 수동으로 추가하는 데 필요한 단계도 살펴봅니다. 시작해 보겠습니다!

참고

트랜잭션 내 데이터베이스 수정 래핑 자습서에서는 트랜잭션(BeginTransaction, CommitTransaction등)을 지원하기 위해 TableAdapter에 메서드를 추가했습니다. 또는 데이터 액세스 계층 코드를 수정할 필요가 없는 저장 프로시저 내에서 트랜잭션을 완전히 관리할 수 있습니다. 이 자습서에서는 트랜잭션의 scope 내에서 저장 프로시저 문을 실행하는 데 사용되는 T-SQL 명령을 살펴봅니다.

1단계: Northwind 데이터베이스에 저장 프로시저 추가

Visual Studio를 사용하면 데이터베이스에 새 저장 프로시저를 쉽게 추가할 수 있습니다. 특정 CategoryID 값이 있는 열에 대해 테이블의 모든 열을 Products 반환하는 새 저장 프로시저를 Northwind 데이터베이스에 추가해 보겠습니다. 서버 Explorer 창에서 Northwind 데이터베이스를 확장하여 데이터베이스 다이어그램, 테이블, 뷰 등의 폴더가 표시되도록 합니다. 이전 자습서에서 보았듯이 저장 프로시저 폴더에는 데이터베이스의 기존 저장 프로시저가 포함되어 있습니다. 새 저장 프로시저를 추가하려면 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 새 저장 프로시저 추가 옵션을 선택하기만 하면 됩니다.

저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 새 저장 프로시저 추가

그림 1: 저장 프로시저 폴더 Right-Click 새 저장 프로시저 추가(전체 크기 이미지를 보려면 클릭)

그림 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

이 스크립트를 실행하면 라는 Products_SelectByCategoryIDNorthwind 데이터베이스에 새 저장 프로시저가 추가됩니다. 이 저장 프로시저는 단일 입력 매개 변수(@CategoryID형식 int)를 허용하고 일치하는 CategoryID 값으로 해당 제품에 대한 모든 필드를 반환합니다.

CREATE PROCEDURE 스크립트를 실행하고 데이터베이스에 저장 프로시저를 추가하려면 도구 모음에서 저장 아이콘을 클릭하거나 Ctrl+S를 누릅니다. 이렇게 하면 저장 프로시저 폴더가 새로 고쳐지고 새로 만든 저장 프로시저가 표시됩니다. 또한 창의 스크립트는 미묘한 차이를 에서 로 CREATE PROCEDURE dbo.Products_SelectProductByCategoryID 변경합니다 ALTER PROCEDUREdbo.Products_SelectProductByCategoryID. CREATE PROCEDURE 는 새 저장 프로시저를 데이터베이스 ALTER PROCEDURE 에 추가하고 기존 저장 프로시저를 업데이트합니다. 스크립트의 시작이 로 변경 ALTER PROCEDURE되었으므로 저장 프로시저 입력 매개 변수 또는 SQL 문을 변경하고 저장 아이콘을 클릭하면 저장 프로시저가 이러한 변경 내용으로 업데이트됩니다.

그림 2는 저장 프로시저가 Products_SelectByCategoryID 저장된 후 Visual Studio를 보여줍니다.

저장 프로시저 Products_SelectByCategoryID 데이터베이스에 추가되었습니다.

그림 2: 저장 프로시저 Products_SelectByCategoryID 가 데이터베이스에 추가되었습니다(전체 크기 이미지를 보려면 클릭).

2단계: 기존 저장 프로시저를 사용하도록 TableAdapter 구성

Products_SelectByCategoryID 이제 저장 프로시저가 데이터베이스에 추가되었으므로 메서드 중 하나가 호출될 때 이 저장 프로시저를 사용하도록 데이터 액세스 계층을 구성할 수 있습니다. 특히 방금 만든 저장 프로시저를 호출하는 ProductsTableAdapter 형식화된 DataSet의 에 NorthwindWithSprocs 메서드를 Products_SelectByCategoryID 추가 GetProductsByCategoryID(<_i22_>categoryID)<!--_i22_--> 합니다.

먼저 DataSet을 NorthwindWithSprocs 여세요. 를 마우스 오른쪽 단추로 ProductsTableAdapter 클릭하고 쿼리 추가를 선택하여 TableAdapter 쿼리 구성 마법사를 시작합니다. 이전 자습서에서는 TableAdapter에서 새 저장 프로시저를 만들도록 선택했습니다. 그러나 이 자습서에서는 새 TableAdapter 메서드를 기존 Products_SelectByCategoryID 저장 프로시저에 연결하려고 합니다. 따라서 마법사의 첫 번째 단계에서 기존 저장 프로시저 사용 옵션을 선택하고 다음을 클릭합니다.

기존 저장 프로시저 사용 옵션을 선택합니다.

그림 3: 기존 저장 프로시저 사용 옵션 선택(전체 크기 이미지를 보려면 클릭)

다음 화면에서는 데이터베이스의 저장 프로시저로 채워진 드롭다운 목록을 제공합니다. 저장 프로시저를 선택하면 왼쪽에 입력 매개 변수가 나열되고 오른쪽에 데이터 필드가 반환됩니다(있는 경우). Products_SelectByCategoryID 목록에서 저장 프로시저를 선택하고 다음을 클릭합니다.

Products_SelectByCategoryID 저장 프로시저 선택

그림 4: 저장 프로시저 선택 Products_SelectByCategoryID (전체 크기 이미지를 보려면 클릭)

다음 화면에서는 저장 프로시저에서 반환되는 데이터의 종류를 묻고 여기에 대한 답변은 TableAdapter의 메서드에서 반환되는 형식을 결정합니다. 예를 들어 테이블 형식 데이터가 반환되었음을 나타내는 경우 메서드는 저장 프로시저에서 ProductsDataTable 반환된 레코드로 채워진 instance 반환합니다. 반면, 이 저장 프로시저가 단일 값을 반환한다고 표시하면 TableAdapter는 저장 프로시저에서 반환된 첫 번째 레코드의 첫 번째 열에 값이 할당된 를 반환 Object 합니다.

저장 프로시저는 Products_SelectByCategoryID 특정 범주에 속하는 모든 제품을 반환하므로 첫 번째 답변인 테이블 형식 데이터를 선택하고 다음을 클릭합니다.

저장 프로시저가 테이블 형식 데이터를 반환함을 나타냅니다.

그림 5: 저장 프로시저가 테이블 형식 데이터를 반환함을 나타냅니다(전체 크기 이미지를 보려면 클릭).

이 메서드의 이름 뒤에 사용할 메서드 패턴을 나타내기만 하면 됩니다. DataTable 채우기 및 DataTable 반환 옵션을 모두 선택한 상태로 두고 메서드 이름을 및 GetProductsByCategoryIDFillByCategoryID 바꿉니다. 그런 다음 다음을 클릭하여 마법사가 수행할 작업의 요약을 검토합니다. 모든 항목이 올바르게 표시되면 마침을 클릭합니다.

메서드 이름을 FillByCategoryID 및 GetProductsByCategoryID로 지정합니다.

그림 6: 메서드 FillByCategoryID 이름 지정 및 GetProductsByCategoryID (전체 크기 이미지를 보려면 클릭)

참고

방금 만든 FillByCategoryID TableAdapter 메서드 및 GetProductsByCategoryID는 형식 Integer의 입력 매개 변수를 예상합니다. 이 입력 매개 변수 값은 해당 매개 변수를 통해 저장 프로시저에 @CategoryID 전달됩니다. 저장 프로시저의 매개 변수를 Products_SelectByCategory 수정하는 경우 이러한 TableAdapter 메서드에 대한 매개 변수도 업데이트해야 합니다. 이전 자습서에서 설명한 대로 매개 변수 컬렉션에서 매개 변수를 수동으로 추가하거나 제거하거나 TableAdapter 마법사를 다시 실행하여 두 가지 방법 중 하나로 이 작업을 수행할 수 있습니다.

3단계: BLL에GetProductsByCategoryID(categoryID)메서드 추가

DAL 메서드가 GetProductsByCategoryID 완료되면 다음 단계는 비즈니스 논리 계층에서 이 메서드에 대한 액세스를 제공하는 것입니다. ProductsBLLWithSprocs 클래스 파일을 열고 다음 메서드를 추가합니다.

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsByCategoryID(ByVal categoryID As Integer) _
    As NorthwindWithSprocs.ProductsDataTable
    Return Adapter.GetProductsByCategoryID(categoryID)
End Function

이 BLL 메서드는 단순히 s GetProductsByCategoryID 메서드에서 반환된 를 ProductsTableAdapter 반환 ProductsDataTable 합니다. 특성은 DataObjectMethodAttribute ObjectDataSource의 데이터 원본 구성 마법사에서 사용하는 메타데이터를 제공합니다. 특히 이 메서드는 SELECT 탭의 드롭다운 목록에 표시됩니다.

4단계: 범주별 제품 표시

새로 추가 Products_SelectByCategoryID 된 저장 프로시저와 해당 DAL 및 BLL 메서드를 테스트하려면 DropDownList 및 GridView가 포함된 ASP.NET 페이지를 만들어 보겠습니다. DropDownList는 데이터베이스의 모든 범주를 나열하고 GridView는 선택한 범주에 속하는 제품을 표시합니다.

참고

이전 자습서에서 DropDownLists를 사용하여 master/세부 인터페이스를 만들었습니다. 이러한 master/세부 정보 보고서 구현에 대한 자세한 내용은 DropDownList를 사용하여 마스터/세부 필터링 자습서를 참조하세요.

폴더에서 ExistingSprocs.aspxAdvancedDAL 페이지를 열고 도구 상자의 DropDownList를 Designer 끌어 놓습니다. DropDownList의 ID 속성을 로 Categories 설정하고 해당 AutoPostBack 속성을 로 True설정합니다. 그런 다음 스마트 태그에서 DropDownList를 라는 CategoriesDataSource새 ObjectDataSource에 바인딩합니다. 클래스의 GetCategories 메서드에서 해당 데이터를 검색할 수 있도록 ObjectDataSource를 CategoriesBLL 구성합니다. UPDATE, INSERT 및 DELETE 탭의 드롭다운 목록을 (없음) 로 설정합니다.

CategoriesBLL 클래스의 GetCategories 메서드에서 데이터 검색

그림 7: 클래스의 GetCategories 메서드에서 CategoriesBLL 데이터 검색(전체 크기 이미지를 보려면 클릭)

UPDATE, INSERT 및 DELETE 탭의 Drop-Down Lists (없음)으로 설정합니다.

그림 8: UPDATE, INSERT 및 DELETE 탭의 Drop-Down Lists (없음)으로 설정합니다(전체 크기 이미지를 보려면 클릭).

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를 Designer 끌어 DropDownList 아래에 놓습니다. GridView를 IDProductsByCategory 설정하고 스마트 태그에서 라는 ProductsByCategoryDataSource새 ObjectDataSource에 바인딩합니다. 메서드를 ProductsByCategoryDataSource 사용하여 해당 데이터를 검색하도록 클래스를 ProductsBLLWithSprocs 사용하도록 ObjectDataSource를 GetProductsByCategoryID(categoryID) 구성합니다. 이 GridView는 데이터를 표시하는 데만 사용되므로 UPDATE, INSERT 및 DELETE 탭의 드롭다운 목록을 (없음)으로 설정하고 다음을 클릭합니다.

ProductsBLLWithSprocs 클래스를 사용하도록 ObjectDataSource 구성

그림 9: 클래스를 사용하도록 ProductsBLLWithSprocs ObjectDataSource 구성(전체 크기 이미지를 보려면 클릭)

GetProductsByCategoryID(categoryID) 메서드에서 데이터 검색

그림 10: 메서드에서 GetProductsByCategoryID(categoryID) 데이터 검색(전체 크기 이미지를 보려면 클릭)

SELECT 탭에서 선택한 메서드에는 매개 변수가 있으므로 마법사의 마지막 단계에서 매개 변수의 원본을 묻는 메시지가 표시됩니다. 매개 변수 원본 드롭다운 목록을 Control으로 설정하고 ControlID 드롭다운 목록에서 컨트롤을 선택합니다 Categories . 마침을 클릭하여 마법사를 완료합니다.

Category DropDownList를 categoryID 매개 변수의 원본으로 사용

그림 11: DropDownList를 Categories 매개 변수의 categoryID 원본으로 사용(전체 크기 이미지를 보려면 클릭)

ObjectDataSource 마법사를 완료하면 Visual Studio는 각 제품 데이터 필드에 대해 BoundFields 및 CheckBoxField를 추가합니다. 이러한 필드를 원하는 대로 자유롭게 사용자 지정할 수 있습니다.

브라우저를 통해 페이지를 방문합니다. 페이지를 방문할 때 음료 범주가 선택되고 그리드에 나열된 해당 제품이 선택됩니다. 그림 12와 같이 드롭다운 목록을 대체 범주로 변경하면 포스트백이 발생하고 새로 선택한 범주의 제품으로 그리드가 다시 로드됩니다.

제품 범주의 제품이 표시됩니다.

그림 12: 제품 범주의 제품이 표시됩니다(전체 크기 이미지를 보려면 클릭).

5단계: 트랜잭션 범위 내에서 저장 프로시저 문 래핑

트랜잭션 내 데이터베이스 수정 래핑 자습서에서는 트랜잭션의 scope 내에서 일련의 데이터베이스 수정 문을 수행하는 방법에 대해 설명했습니다. 트랜잭션의 우산 아래에서 수행된 수정은 모두 성공하거나 모두 실패하여 원자성을 보장합니다. 트랜잭션을 사용하는 방법은 다음과 같습니다.

  • 네임스페이스의 클래스 사용 System.Transactions
  • 데이터 액세스 계층이 와 같은 SqlTransactionADO.NET 클래스를 사용하도록 설정
  • 저장 프로시저 내에서 직접 T-SQL 트랜잭션 명령 추가

트랜잭션 내 데이터베이스 수정 래핑 자습서에서는 DAL의 ADO.NET 클래스를 사용했습니다. 이 자습서의 나머지 부분에서는 저장 프로시저 내에서 T-SQL 명령을 사용하여 트랜잭션을 관리하는 방법을 살펴봅니다.

트랜잭션을 수동으로 시작, 커밋 및 롤백하기 위한 세 가지 주요 SQL 명령은 각각 , COMMIT TRANSACTIONROLLBACK TRANSACTION입니다BEGIN TRANSACTION. ADO.NET 방식과 마찬가지로 저장 프로시저 내에서 트랜잭션을 사용하는 경우 다음 패턴을 적용해야 합니다.

  1. 트랜잭션의 시작을 나타냅니다.
  2. 트랜잭션을 구성하는 SQL 문을 실행합니다.
  3. 2단계의 문 중 하나에 오류가 있는 경우 트랜잭션을 롤백합니다.
  4. 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

템플릿은 2005년 SQL Server 새로운 구문인 블록을 정의하여 TRY...CATCH 시작합니다. Visual Basic의 블록과 Try...Catch 마찬가지로 SQL TRY...CATCH 블록은 블록에서 TRY 문을 실행합니다. 문이 오류를 발생하면 컨트롤이 즉시 블록으로 CATCH 전송됩니다.

트랜잭션을 구성하는 SQL 문을 실행하는 동안 오류가 없는 경우 문은 COMMIT TRANSACTION 변경 내용을 커밋하고 트랜잭션을 완료합니다. 그러나 문 중 하나에 오류가 ROLLBACK TRANSACTIONCATCH 발생하면 블록의 는 트랜잭션이 시작되기 전에 데이터베이스를 해당 상태로 반환합니다. 또한 저장 프로시저는 RAISERROR 명령을 사용하여 오류를 발생시키는데, 이로 인해 애플리케이션에서 가 SqlException 발생합니다.

참고

TRY...CATCH 블록은 SQL Server 2005에 새로 추가되므로 이전 버전의 Microsoft SQL Server 사용하는 경우 위의 템플릿이 작동하지 않습니다.

구체적인 예를 살펴보겠습니다. 외래 키 제약 조건은 테이블과 테이블 사이에 Categories 존재합니다. 즉, 테이블의 ProductsCategoryID 필드가 테이블의 Categories 값에 CategoryID 매핑되어야 Products 합니다. 연결된 제품이 있는 범주를 삭제하는 것과 같이 이 제약 조건을 위반하는 모든 작업은 외래 키 제약 조건 위반을 초래합니다. 이를 확인하려면 이진 데이터 작업 섹션(~/BinaryData/UpdatingAndDeleting.aspx)에서 기존 이진 데이터 업데이트 및 삭제 예제를 다시 확인합니다. 이 페이지에는 편집 및 삭제 단추와 함께 시스템의 각 범주가 나열되지만(그림 13 참조) 음료와 같은 연결된 제품이 있는 범주를 삭제하려고 하면 외래 키 제약 조건 위반으로 인해 삭제가 실패합니다(그림 14 참조).

각 범주는 편집 및 삭제 단추가 있는 GridView에 표시됩니다.

그림 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 조건이 있다고 상상해 보십시오. 문제는 이러한 경우 범주를 삭제하기 전에 모든 제품이 삭제된다는 것입니다. 결과적으로 이러한 범주의 경우 이 저장 프로시저는 다른 테이블에 관련 레코드가 계속 있으므로 범주가 남아 있는 동안 모든 제품을 제거합니다.

그러나 저장 프로시저가 트랜잭션의 scope 내에서 래핑된 경우 에 대한 삭제 실패에 직면하여 테이블에 대한 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사용하는 , UpdateCommand, DeleteCommandSelectCommand 및 이름 및 연결 정보를 나열합니다. DeleteCommand 속성을 확장하여 세부 정보를 확인합니다. 그림 15 DeleteCommand 와 같이 s CommandType 속성은 Text로 설정되며, 이 속성은 속성의 CommandText 텍스트를 임시 SQL 쿼리로 보내도록 지시합니다.

Designer CategoriesTableAdapter를 선택하여 속성 창에서 해당 속성을 봅니다.

그림 15: Designer 에서 을 선택하여 CategoriesTableAdapter 속성 창에서 해당 속성을 봅니다.

이러한 설정을 변경하려면 속성 창 (DeleteCommand) 텍스트를 선택하고 드롭다운 목록에서 (새로 만들기)를 선택합니다. 이렇게 하면 , CommandTypeParameters 속성에 대한 설정이 CommandText지워지게 됩니다. 그런 다음 속성을 로 CommandTypeStoredProcedure 설정한 다음 에 대한 CommandText 저장 프로시저의 이름을 입력합니다.dbo.Categories_Delete 이 순서대로 속성을 입력해야 하는 경우 먼저 CommandType 및 다음 CommandText 을 입력하면 Visual Studio에서 Parameters 컬렉션을 자동으로 채웁습니다. 이 순서로 이러한 속성을 입력하지 않으면 매개 변수 컬렉션 편집기 통해 매개 변수를 수동으로 추가해야 합니다. 두 경우 모두 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 2.0 24 시간. 그는 에서 찾을 수있는 그의 블로그를 통해 또는 에 mitchell@4GuysFromRolla.comhttp://ScottOnWriting.NET도달 할 수 있습니다.

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 힐튼 가이세나우, S ren Jacob Lauritsen 및 테레사 머피였습니다. 예정된 MSDN 문서를 검토하시겠습니까? 그렇다면 에 줄을 놓습니다 mitchell@4GuysFromRolla.com.