형식화된 데이터 세트의 TableAdapter에 대한 새로운 저장 프로시저 만들기(VB)

작성자 : Scott Mitchell

PDF 다운로드

이전 자습서에서는 코드에서 SQL 문을 만들고 실행할 데이터베이스에 문을 전달했습니다. 다른 방법은 SQL 문이 데이터베이스에서 미리 정의된 저장 프로시저를 사용하는 것입니다. 이 자습서에서는 TableAdapter 마법사에서 새 저장 프로시저를 생성하는 방법을 알아봅니다.

소개

이러한 자습서의 DAL(데이터 액세스 계층)은 형식화된 데이터 세트를 사용합니다. 데이터 액세스 계층 만들기 자습서에서 설명한 대로 형식화된 데이터 세트는 강력한 형식의 DataTables 및 TableAdapters로 구성됩니다. DataTable은 시스템의 논리적 엔터티를 나타내고 TableAdapters는 기본 데이터베이스와 인터페이스하여 데이터 액세스 작업을 수행합니다. 여기에는 DataTable을 데이터로 채우고, 스칼라 데이터를 반환하는 쿼리를 실행하고, 데이터베이스에서 레코드를 삽입, 업데이트 및 삭제하는 것이 포함됩니다.

TableAdapters에서 실행하는 SQL 명령은 임시 SQL 문(예: SELECT columnList FROM TableName) 또는 저장 프로시저일 수 있습니다. 아키텍처의 TableAdapters는 임시 SQL 문을 사용합니다. 그러나 많은 개발자와 데이터베이스 관리자는 보안, 유지 관리 및 호환성 이유로 임시 SQL 문보다 저장 프로시저를 선호합니다. 다른 사용자는 유연성을 위해 임시 SQL 문을 선호합니다. 내 작업에서는 임시 SQL 문보다 저장 프로시저를 선호하지만 임시 SQL 문을 사용하여 이전 자습서를 간소화하기로 결정했습니다.

TableAdapter를 정의하거나 새 메서드를 추가할 때 TableAdapter 마법사를 사용하면 임시 SQL 문을 사용하는 것처럼 새 저장 프로시저를 쉽게 만들거나 기존 저장 프로시저를 사용할 수 있습니다. 이 자습서에서는 TableAdapter 마법사가 저장 프로시저를 자동으로 생성하는 방법을 살펴봅니다. 다음 자습서에서는 기존 또는 수동으로 만든 저장 프로시저를 사용하도록 TableAdapter 메서드를 구성하는 방법을 살펴봅니다.

참고

저장 프로시저 및 임시 SQL의 장단점에 대한 활발한 토론은 Rob Howard의 블로그 항목 아직 저장 프로시저를 사용하지 않습니까?Frans Bouma 의 블로그 항목 저장 프로 시저는 Bad, M Kay? 를 참조하세요.

저장 프로시저 기본 사항

함수는 모든 프로그래밍 언어에 공통적인 구문입니다. 함수는 함수가 호출될 때 실행되는 문 컬렉션입니다. 함수는 입력 매개 변수를 수락할 수 있으며 필요에 따라 값을 반환할 수 있습니다. 저장 프로시저 는 프로그래밍 언어의 함수와 많은 유사성을 공유하는 데이터베이스 구문입니다. 저장 프로시저는 저장 프로시저가 호출될 때 실행되는 T-SQL 문 집합으로 구성됩니다. 저장 프로시저는 많은 입력 매개 변수에 0을 허용하고 스칼라 값, 출력 매개 변수 또는 가장 일반적으로 쿼리에서 SELECT 결과 집합을 반환할 수 있습니다.

참고

저장 프로시저는 스프록스 또는 SP라고 하는 경우가 많습니다.

저장 프로시저는 T-SQL 문을 사용하여 CREATE PROCEDURE 만들어집니다. 예를 들어 다음 T-SQL 스크립트는 라는 단일 매개 변수를 사용하고 테이블의 해당 열 Products 에 일치하는 CategoryID 값이 있는 , ProductName, UnitPriceDiscontinued 필드를 반환ProductID하는 라는 GetProductsByCategoryID@CategoryID 저장 프로시저를 만듭니다.

CREATE PROCEDURE GetProductsByCategoryID
(
    @CategoryID int
)
AS
SELECT ProductID, ProductName, UnitPrice, Discontinued
FROM Products
WHERE CategoryID = @CategoryID

이 저장 프로시저가 만들어지면 다음 구문을 사용하여 호출할 수 있습니다.

EXEC GetProductsByCategory categoryID

참고

다음 자습서에서는 Visual Studio IDE를 통해 저장 프로시저 만들기를 살펴봅니다. 그러나 이 자습서에서는 TableAdapter 마법사가 자동으로 저장 프로시저를 생성하도록 합니다.

단순히 데이터를 반환하는 것 외에도 저장 프로시저는 단일 트랜잭션의 scope 내에서 여러 데이터베이스 명령을 수행하는 데 사용되는 경우가 많습니다. 예를 들어 라는 DeleteCategory저장 프로시저는 매개 변수를 @CategoryID 사용하고 두 개의 DELETE 문을 수행할 수 있습니다. 첫째, 하나는 관련 제품을 삭제하고 두 번째는 지정된 범주를 삭제합니다. 저장 프로시저 내의 여러 문은 트랜잭션 내에서 자동으로 래핑 되지 않습니다 . 저장 프로시저의 여러 명령이 원자성 작업으로 처리되도록 하기 위해 추가 T-SQL 명령을 실행해야 합니다. 이후 자습서에서는 트랜잭션의 scope 내에서 저장 프로시저의 명령을 래핑하는 방법을 살펴보겠습니다.

아키텍처 내에서 저장 프로시저를 사용하는 경우 데이터 액세스 계층의 메서드는 임시 SQL 문을 실행하는 대신 특정 저장 프로시저를 호출합니다. 이렇게 하면 애플리케이션 아키텍처 내에서 정의하지 않고 데이터베이스에서 실행된 SQL 문의 위치를 중앙 집중화합니다. 이 중앙 집중화를 사용하면 쿼리를 더 쉽게 찾고 분석하고 튜닝할 수 있으며 데이터베이스가 사용되는 위치와 방법에 대한 훨씬 더 명확한 그림을 제공합니다.

저장 프로시저 기본 사항에 대한 자세한 내용은 이 자습서의 끝에 있는 추가 읽기 섹션의 리소스를 참조하세요.

1단계: 고급 데이터 액세스 계층 시나리오 웹 페이지 만들기

저장 프로시저를 사용하여 DAL을 만드는 방법에 대한 논의를 시작하기 전에 먼저 웹 사이트 프로젝트에 필요한 ASP.NET 페이지와 다음 몇 가지 자습서를 만들어 보겠습니다. 먼저 라는 AdvancedDAL새 폴더를 추가합니다. 다음으로, 해당 폴더에 다음 ASP.NET 페이지를 추가하여 각 페이지를 master 페이지와 Site.master 연결해야 합니다.

  • Default.aspx
  • NewSprocs.aspx
  • ExistingSprocs.aspx
  • JOINs.aspx
  • AddingColumns.aspx
  • ComputedColumns.aspx
  • EncryptingConfigSections.aspx
  • ManagedFunctionsAndSprocs.aspx

고급 데이터 액세스 계층 시나리오에 대한 ASP.NET 페이지 추가 자습서

그림 1: 고급 데이터 액세스 계층 시나리오에 대한 ASP.NET 페이지 추가 자습서

다른 폴더와 Default.aspx 마찬가지로 폴더의 AdvancedDAL 섹션에 자습서가 나열됩니다. 사용자 컨트롤은 SectionLevelTutorialListing.ascx 이 기능을 제공합니다. 따라서 솔루션 탐색기 페이지의 디자인 보기로 끌어 이 사용자 컨트롤 Default.aspx 을 에 추가합니다.

SectionLevelTutorialListing.ascx 사용자 컨트롤을 추가하여 Default.aspx

그림 2: 사용자 컨트롤을 SectionLevelTutorialListing.ascxDefault.aspx 추가합니다(전체 크기 이미지를 보려면 클릭).

마지막으로 이러한 페이지를 파일에 항목으로 추가합니다 Web.sitemap . 특히 일괄 처리된 데이터 작업 다음에 다음 태그를 추가합니다 <siteMapNode>.

<siteMapNode url="~/AdvancedDAL/Default.aspx" 
    title="Advanced DAL Scenarios" 
    description="Explore a number of advanced Data Access Layer scenarios.">
    
    <siteMapNode url="~/AdvancedDAL/NewSprocs.aspx" 
        title="Creating New Stored Procedures for TableAdapters" 
        description="Learn how to have the TableAdapter wizard automatically 
            create and use stored procedures." />
    <siteMapNode url="~/AdvancedDAL/ExistingSprocs.aspx" 
        title="Using Existing Stored Procedures for TableAdapters" 
        description="See how to plug existing stored procedures into a 
            TableAdapter." />
    <siteMapNode url="~/AdvancedDAL/JOINs.aspx" 
        title="Returning Data Using JOINs" 
        description="Learn how to augment your DataTables to work with data 
            returned from multiple tables via a JOIN query." />
    <siteMapNode url="~/AdvancedDAL/AddingColumns.aspx" 
        title="Adding DataColumns to a DataTable" 
        description="Master adding new columns to an existing DataTable." />
    <siteMapNode url="~/AdvancedDAL/ComputedColumns.aspx" 
        title="Working with Computed Columns" 
        description="Explore how to work with computed columns when using 
            Typed DataSets." />
    <siteMapNode url="~/AdvancedDAL/EncryptingConfigSections.aspx" 
        title="Protected Connection Strings in Web.config" 
        description="Protect your connection string information in 
            Web.config using encryption." />
    <siteMapNode url="~/AdvancedDAL/ManagedFunctionsAndSprocs.aspx" 
        title="Creating Managed SQL Functions and Stored Procedures" 
        description="See how to create SQL functions and stored procedures 
            using managed code." />
</siteMapNode>

를 업데이트 Web.sitemap한 후 잠시 시간을 내어 브라우저를 통해 자습서 웹 사이트를 봅니다. 이제 왼쪽 메뉴에 고급 DAL 시나리오 자습서에 대한 항목이 포함됩니다.

이제 사이트 맵에 고급 DAL 시나리오 자습서에 대한 항목이 포함됩니다.

그림 3: 이제 사이트 맵에 고급 DAL 시나리오 자습서에 대한 항목이 포함됩니다.

2단계: 새 저장 프로시저를 만들 TableAdapter 구성

임시 SQL 문 대신 저장 프로시저를 사용하는 데이터 액세스 계층을 만드는 방법을 보여 주려면 라는 NorthwindWithSprocs.xsd폴더에 새 Typed DataSet을 ~/App_Code/DAL 만들어 보겠습니다. 이전 자습서에서 이 프로세스를 자세히 설명했으므로 이 단계를 빠르게 진행합니다. 형식화된 데이터 세트를 만들고 구성하는 데 문제가 있거나 추가 단계별 지침이 필요한 경우 데이터 액세스 계층 만들기 자습서를 참조하세요.

폴더를 마우스 오른쪽 단추로 클릭하고 DAL , 새 항목 추가를 선택하고, 그림 4와 같이 DataSet 템플릿을 선택하여 프로젝트에 새 DataSet을 추가합니다.

NorthwindWithSprocs.xsd라는 프로젝트에 새 형식화된 DataSet 추가

그림 4: 프로젝트 이름 NorthwindWithSprocs.xsd 에 새 형식의 데이터 세트 추가(전체 크기 이미지를 보려면 클릭)

그러면 새 형식화된 DataSet이 만들어지고, Designer 열고, 새 TableAdapter를 만들고, TableAdapter 구성 마법사를 시작합니다. TableAdapter 구성 마법사의 첫 번째 단계에서는 작업할 데이터베이스를 선택하도록 요청합니다. Northwind 데이터베이스에 대한 연결 문자열 드롭다운 목록에 나열되어야 합니다. 이 항목을 선택하고 다음을 클릭합니다.

다음 화면에서 TableAdapter가 데이터베이스에 액세스하는 방법을 선택할 수 있습니다. 이전 자습서에서는 첫 번째 옵션인 SQL 문 사용을 선택했습니다. 이 자습서에서는 두 번째 옵션인 새 저장 프로시저 만들기를 선택하고 다음을 클릭합니다.

TableAdapter에 새 저장 프로시저 만들기를 지시합니다.

그림 5: TableAdapter에 새 저장 프로시저 만들기를 지시합니다(전체 크기 이미지를 보려면 클릭).

임시 SQL 문을 사용하는 것과 마찬가지로 다음 단계에서 TableAdapter의 기본 쿼리에 대한 문을 제공 SELECT 하라는 메시지가 표시됩니다. 그러나 여기에 입력된 문을 사용하여 SELECT 임시 쿼리를 직접 수행하는 대신 TableAdapter 마법사는 이 SELECT 쿼리를 포함하는 저장 프로시저를 만듭니다.

이 TableAdapter에 대해 다음 SELECT 쿼리를 사용합니다.

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products

SELECT 쿼리 입력

그림 6: 쿼리 입력 SELECT (전체 크기 이미지를 보려면 클릭)

참고

위의 쿼리는 Typed DataSet에 있는 의 ProductsTableAdapter 기본 쿼리와 Northwind 약간 다릅니다. ProductsTableAdapter Typed DataSet의 Northwind 에는 각 제품의 범주 및 공급자에 대한 범주 이름과 회사 이름을 다시 가져오는 두 개의 상관 관계가 있는 하위 쿼리가 포함되어 있습니다. JOIN을 사용하도록 TableAdapter 업데이트 자습서에서는 이 TableAdapter에 관련 데이터를 추가하는 방법을 살펴보겠습니다.

잠시 시간을 내어 고급 옵션 단추를 클릭합니다. 여기에서 마법사에서 TableAdapter에 대한 삽입, 업데이트 및 삭제 문도 생성할지 여부, 낙관적 동시성을 사용할지 여부 및 삽입 및 업데이트 후에 데이터 테이블을 새로 고칠지 여부를 지정할 수 있습니다. 삽입, 업데이트 및 삭제 문 생성 옵션은 기본적으로 선택되어 있습니다. 선택된 상태로 둡니다. 이 자습서에서는 낙관적 동시성 사용 옵션을 선택하지 않은 상태로 둡니다.

TableAdapter 마법사에서 저장 프로시저를 자동으로 만들면 데이터 테이블 새로 고침 옵션이 무시되는 것처럼 보입니다. 이 확인란을 선택했는지 여부에 관계없이 결과 삽입 및 업데이트 저장 프로시저는 3단계에서 볼 수 있듯이 방금 삽입되었거나 방금 업데이트된 레코드를 검색합니다.

삽입, 업데이트 및 삭제 생성 옵션을 선택한 상태로 둡니다.

그림 7: 삽입, 업데이트 및 삭제 생성 옵션을 선택한 상태로 둡니다.

참고

낙관적 동시성 사용 옵션을 선택하면 마법사는 다른 필드가 변경된 경우 데이터가 업데이트되지 않도록 하는 조건을 WHERE 절에 추가합니다. TableAdapter의 기본 제공 낙관적 동시성 제어 기능을 사용하는 방법에 대한 자세한 내용은 낙관적 동시성 구현 자습서를 참조하세요.

쿼리를 SELECT 입력하고 삽입, 업데이트 및 삭제 문 생성 옵션이 선택되어 있는지 확인한 후 다음을 클릭합니다. 그림 8에 표시된 다음 화면에서는 마법사가 데이터를 선택, 삽입, 업데이트 및 삭제하기 위해 만들 저장 프로시저의 이름을 묻는 메시지를 표시합니다. 이러한 저장 프로시저 이름을 , , Products_InsertProducts_UpdateProducts_DeleteProducts_Select변경합니다.

저장 프로시저 이름 바꾸기

그림 8: 저장 프로시저 이름 바꾸기(전체 크기 이미지를 보려면 클릭)

TableAdapter 마법사가 4개의 저장 프로시저를 만드는 데 사용할 T-SQL을 보려면 SQL 스크립트 미리 보기 단추를 클릭합니다. SQL 스크립트 미리 보기 대화 상자에서 스크립트를 파일에 저장하거나 클립보드에 복사할 수 있습니다.

저장 프로시저를 생성하는 데 사용되는 SQL 스크립트 미리 보기

그림 9: 저장 프로시저를 생성하는 데 사용되는 SQL 스크립트 미리 보기

저장 프로시저의 이름을 지정한 후 다음을 클릭하여 TableAdapter의 해당 메서드 이름을 지정합니다. 임시 SQL 문을 사용할 때와 마찬가지로 기존 DataTable을 채우거나 새 메서드를 반환하는 메서드를 만들 수 있습니다. 또한 TableAdapter에 레코드 삽입, 업데이트 및 삭제를 위한 DB-Direct 패턴을 포함할지 여부를 지정할 수 있습니다. 세 개의 확인란을 모두 선택된 상태로 두고 DataTable 메서드 반환의 GetProducts 이름을 로 바꿉니다(그림 10에 표시됨).

메서드 채우기 및 GetProducts의 이름을 지정합니다.

그림 10: 메서드 Fill 이름을 지정하고 GetProducts (전체 크기 이미지를 보려면 클릭)

다음을 클릭하여 마법사가 수행할 단계의 요약을 확인합니다. 마침 단추를 클릭하여 마법사를 완료합니다. 마법사가 완료되면 이제 를 포함ProductsDataTable해야 하는 DataSet의 Designer 반환됩니다.

DataSet의 Designer 새로 추가된 ProductsDataTable을 표시합니다.

그림 11: DataSet의 Designer 새로 추가 ProductsDataTable 된 을 표시합니다(전체 크기 이미지를 보려면 클릭).

3단계: 새로 만든 저장 프로시저 검사

2단계에서 사용되는 TableAdapter 마법사는 데이터를 선택, 삽입, 업데이트 및 삭제하기 위한 저장 프로시저를 자동으로 만들었습니다. 이러한 저장 프로시저는 서버 Explorer 이동하여 데이터베이스의 저장 프로시저 폴더로 드릴다운하여 Visual Studio를 통해 보거나 수정할 수 있습니다. 그림 12에서 알 수 있듯이 Northwind 데이터베이스에는 , , Products_InsertProducts_SelectProducts_Update의 네 가지 Products_Delete새 저장 프로시저가 포함되어 있습니다.

2단계에서 만든 4개의 저장 프로시저는 데이터베이스의 저장 프로시저 폴더에서 찾을 수 있습니다.

그림 12: 2단계에서 만든 4개의 저장 프로시저는 데이터베이스의 저장 프로시저 폴더에서 찾을 수 있습니다.

참고

서버 Explorer 표시되지 않으면 보기 메뉴로 이동하여 서버 Explorer 옵션을 선택합니다. 2단계에서 추가된 제품 관련 저장 프로시저가 표시되지 않으면 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 새로 고침을 선택합니다.

저장 프로시저를 보거나 수정하려면 서버 Explorer 이름을 두 번 클릭하거나 저장 프로시저를 마우스 오른쪽 단추로 클릭하고 열기를 선택합니다. 그림 13은 열 때 저장 프로시저를 보여줍니다 Products_Delete .

Visual Studio 내에서 저장 프로시저를 열고 수정할 수 있습니다.

그림 13: Visual Studio 내에서 저장 프로시저를 열고 수정할 수 있음(전체 크기 이미지를 보려면 클릭)

Products_Select 저장 프로시저의 Products_Delete 내용은 매우 간단합니다. 반면, 및 Products_Update 저장 프로시저는 Products_InsertUPDATE 진술 후에 INSERT 진술을 수행할 SELECT 때 면밀한 검사를 보장합니다. 예를 들어 다음 SQL은 저장 프로시저를 Products_Insert 구성합니다.

ALTER PROCEDURE dbo.Products_Insert
(
    @ProductName nvarchar(40),
    @SupplierID int,
    @CategoryID int,
    @QuantityPerUnit nvarchar(20),
    @UnitPrice money,
    @UnitsInStock smallint,
    @UnitsOnOrder smallint,
    @ReorderLevel smallint,
    @Discontinued bit
)
AS
    SET NOCOUNT OFF;
INSERT INTO [Products] ([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], 
    [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued]) 
VALUES (@ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice, 
    @UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued);
    
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, 
    UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued 
FROM Products 
WHERE (ProductID = SCOPE_IDENTITY())

저장 프로시저는 TableAdapter 마법사에 지정된 쿼리에서 반환 SELECT 된 열을 입력 매개 변수 Products 로 허용하며 이러한 값은 문에 INSERT 사용됩니다. 문 다음에 INSERT 쿼리를 SELECT 사용하여 새로 추가된 레코드의 열 값(포함ProductID)을 반환 Products 합니다. 이 새로 고침 기능은 데이터베이스에서 할당한 자동 증가 값으로 새로 추가 ProductRow 된 인스턴스 ProductID 속성을 자동으로 업데이트하기 때문에 Batch 업데이트 패턴을 사용하여 새 레코드를 추가할 때 유용합니다.

다음 코드에서는 이 기능을 보여 줍니다. 형식화된 데이터 세트에 대해 만든 및 ProductsDataTableNorthwindWithSprocs 포함되어 ProductsTableAdapter 있습니다. 새 제품은 instance 만들고 ProductsRow , 값을 제공하고, TableAdapter의 Update 메서드를 호출하여 를 전달하여 데이터베이스에 추가됩니다ProductsDataTable. 내부적으로 TableAdapter의 메서드는 전달된 DataTable의 Update 인스턴스를 열거 ProductsRow 하고(이 예제에서는 방금 추가한 인스턴스만 있음) 적절한 삽입, 업데이트 또는 삭제 명령을 수행합니다. 이 경우 Products_Insert 저장 프로시저가 실행되어 테이블에 새 레코드 Products 를 추가하고 새로 추가된 레코드의 세부 정보를 반환합니다. ProductsRow 그런 다음 instance ProductID 값이 업데이트됩니다. 메서드가 Update 완료되면 s ProductID 속성을 통해 새로 추가된 레코드 값 ProductIDProductsRow 액세스할 수 있습니다.

' Create the ProductsTableAdapter and ProductsDataTable
Dim productsAPI As New NorthwindWithSprocsTableAdapters.ProductsTableAdapter 
Dim products As New NorthwindWithSprocs.ProductsDataTable
' Create a new ProductsRow instance and set its properties
Dim product As NorthwindWithSprocs.ProductsRow = products.NewProductsRow()
product.ProductName = "New Product"
product.CategoryID = 1  ' Beverages
product.Discontinued = False
' Add the ProductsRow instance to the DataTable
products.AddProductsRow(product)
' Update the DataTable using the Batch Update pattern
productsAPI.Update(products)
' At this point, we can determine the value of the newly-added record's ProductID
Dim newlyAddedProductIDValue as Integer = product.ProductID

저장 프로시저에도 Products_Update 마찬가지로 문 뒤 UPDATESELECT 문이 포함됩니다.

ALTER PROCEDURE dbo.Products_Update
(
    @ProductName nvarchar(40),
    @SupplierID int,
    @CategoryID int,
    @QuantityPerUnit nvarchar(20),
    @UnitPrice money,
    @UnitsInStock smallint,
    @UnitsOnOrder smallint,
    @ReorderLevel smallint,
    @Discontinued bit,
    @Original_ProductID int,
    @ProductID int
)
AS
    SET NOCOUNT OFF;
UPDATE [Products] 
SET [ProductName] = @ProductName, [SupplierID] = @SupplierID, 
    [CategoryID] = @CategoryID, [QuantityPerUnit] = @QuantityPerUnit, 
    [UnitPrice] = @UnitPrice, [UnitsInStock] = @UnitsInStock, 
    [UnitsOnOrder] = @UnitsOnOrder, [ReorderLevel] = @ReorderLevel, 
    [Discontinued] = @Discontinued 
WHERE (([ProductID] = @Original_ProductID));
    
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, 
    UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued 
FROM Products 
WHERE (ProductID = @ProductID)

이 저장 프로시저에는 및 에 대한 두 개의 @Original_ProductID 입력 매개 변수가 ProductID포함되어 있습니다@ProductID. 이 기능을 사용하면 기본 키가 변경될 수 있는 시나리오를 사용할 수 있습니다. 예를 들어 직원 데이터베이스에서 각 직원 레코드는 직원의 사회 보장 번호를 기본 키로 사용할 수 있습니다. 기존 직원의 사회 보장 번호를 변경하려면 새 사회 보장 번호와 원래 주민등록번호를 모두 제공해야 합니다. 테이블의 Products 경우 열이 열이므로 IDENTITY 변경할 수 없으므로 이러한 기능이 필요하지 ProductID 않습니다. 실제로 UPDATE 저장 프로시저의 Products_Update 문에는 열 목록에 열이 ProductID 포함되지 않습니다. @Original_ProductID 따라서 는 문 WHERE 절에 UPDATE 사용되지만 테이블에 대해 불필요 Products 하며 매개 변수로 @ProductID 대체될 수 있습니다. 저장 프로시저의 매개 변수를 수정할 때는 해당 저장 프로시저를 사용하는 TableAdapter 메서드도 업데이트해야 합니다.

4단계: 저장 프로시저의 매개 변수 수정 및 TableAdapter 업데이트

매개 변수는 @Original_ProductID 불필요하므로 저장 프로시저에서 Products_Update 모두 제거해 보겠습니다. 저장 프로시저를 Products_Update 열고 매개 변수를 @Original_ProductID 삭제한 다음 문의 절 UPDATE 에서 WHERE 사용된 매개 변수 이름을 에서 @Original_ProductID@ProductID변경합니다. 이러한 변경을 수행한 후 저장 프로시저 내의 T-SQL은 다음과 같이 표시됩니다.

ALTER PROCEDURE dbo.Products_Update
(
    @ProductName nvarchar(40),
    @SupplierID int,
    @CategoryID int,
    @QuantityPerUnit nvarchar(20),
    @UnitPrice money,
    @UnitsInStock smallint,
    @UnitsOnOrder smallint,
    @ReorderLevel smallint,
    @Discontinued bit,
    @ProductID int
)
AS
    SET NOCOUNT OFF;
UPDATE [Products] SET [ProductName] = @ProductName, [SupplierID] = @SupplierID, 
    [CategoryID] = @CategoryID, [QuantityPerUnit] = @QuantityPerUnit, 
    [UnitPrice] = @UnitPrice, [UnitsInStock] = @UnitsInStock, 
    [UnitsOnOrder] = @UnitsOnOrder, [ReorderLevel] = @ReorderLevel, 
    [Discontinued] = @Discontinued 
WHERE (([ProductID] = @ProductID));
    
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, 
    UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued 
FROM Products 
WHERE (ProductID = @ProductID)

이러한 변경 내용을 데이터베이스에 저장하려면 도구 모음에서 저장 아이콘을 클릭하거나 Ctrl+S를 누릅니다. 이 시점에서 Products_Update 저장 프로시저는 입력 매개 변수를 @Original_ProductID 기대하지 않지만 TableAdapter는 이러한 매개 변수를 전달하도록 구성됩니다. DataSet Designer TableAdapter를 선택하고, 속성 창 이동하고, 컬렉션의 Parameters 줄임표를 클릭하여 TableAdapter가 저장 프로시저에 UpdateCommand 보내는 Products_Update 매개 변수를 볼 수 있습니다. 그러면 그림 14에 표시된 매개 변수 컬렉션 편집기 대화 상자가 나타납니다.

parameters 컬렉션은 Products_Update 저장 프로시저에 전달된 사용된 매개 변수를 편집기 Lists.

그림 14: 저장 프로시저에 전달된 Products_Update 매개 변수를 편집기 Lists Parameters 컬렉션

멤버 목록에서 매개 변수를 @Original_ProductID 선택하고 제거 단추를 클릭하여 여기에서 이 매개 변수를 제거할 수 있습니다.

또는 Designer TableAdapter를 마우스 오른쪽 단추로 클릭하고 구성을 선택하여 모든 메서드에 사용되는 매개 변수를 새로 고칠 수 있습니다. 그러면 TableAdapter 구성 마법사가 표시되고 저장 프로시저에서 수신할 것으로 예상되는 매개 변수와 함께 선택, 삽입, 업데이트 및 삭제에 사용되는 저장 프로시저가 나열됩니다. 업데이트 드롭다운 목록을 클릭하면 이제 더 이상 포함되지 @Original_ProductID 않는 저장 프로시저 예상 입력 매개 변수를 볼 Products_Update 수 있습니다(그림 15 참조). 마침을 클릭하여 TableAdapter에서 사용하는 매개 변수 컬렉션을 자동으로 업데이트합니다.

또는 TableAdapter의 구성 마법사를 사용하여 해당 메서드 매개 변수 컬렉션을 새로 고칠 수 있습니다.

그림 15: TableAdapter의 구성 마법사를 사용하여 메서드 매개 변수 컬렉션을 새로 고칠 수 있습니다(전체 크기 이미지를 보려면 클릭).

5단계: TableAdapter 메서드 추가

2단계에서 설명한 것처럼 새 TableAdapter를 만들 때 해당 저장 프로시저를 자동으로 생성하기 쉽습니다. TableAdapter에 메서드를 추가할 때도 마찬가지입니다. 이를 설명하기 위해 2단계에서 만든 에 메서드를 ProductsTableAdapter 추가 GetProductByProductID(productID) 해 보겠습니다. 이 메서드는 값을 입력으로 ProductID 사용하고 지정된 제품에 대한 세부 정보를 반환합니다.

먼저 TableAdapter를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 쿼리 추가를 선택합니다.

TableAdapter에 새 쿼리 추가

그림 16: TableAdapter에 새 쿼리 추가

그러면 TableAdapter 쿼리 구성 마법사가 시작되며, 먼저 TableAdapter가 데이터베이스에 액세스하는 방법을 묻는 메시지가 표시됩니다. 새 저장 프로시저를 만들려면 새 저장 프로시저 만들기 옵션을 선택하고 다음을 클릭합니다.

새 저장 프로시저 만들기 옵션을 선택합니다.

그림 17: 새 저장 프로시저 만들기 옵션 선택(전체 크기 이미지를 보려면 클릭)

다음 화면에서는 실행할 쿼리 유형, 행 집합 또는 단일 스칼라 값을 반환할지, 또는 , INSERT또는 DELETE 문을 수행할UPDATE지 여부를 식별하도록 요청합니다. 메서드는 GetProductByProductID(productID) 행을 반환하므로 행을 반환하는 SELECT 옵션을 선택한 상태로 두고 다음을 누릅니다.

행을 반환하는 SELECT 옵션 선택

그림 18: 행을 반환하는 SELECT 옵션 선택(전체 크기 이미지를 보려면 클릭)

다음 화면에는 저장 프로시저의 이름(dbo.Products_Select)만 나열하는 TableAdapter의 기본 쿼리가 표시됩니다. 저장 프로시저 이름을 지정된 제품의 모든 제품 필드를 반환하는 다음 SELECT 문으로 바꿉니다.

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products
WHERE ProductID = @ProductID

저장 프로시저 이름을 SELECT 쿼리로 바꾸기

그림 19: 저장 프로시저 이름을 쿼리로 SELECT 바꿉니다(전체 크기 이미지를 보려면 클릭).

후속 화면에서 만들 저장 프로시저의 이름을 지정하도록 요청합니다. 이름을 Products_SelectByProductID 입력하고 다음을 클릭합니다.

새 저장 프로시저 이름을 Products_SelectByProductID

그림 20: 새 저장 프로시저 Products_SelectByProductID 의 이름을 지정합니다(전체 크기 이미지를 보려면 클릭).

마법사의 마지막 단계를 통해 생성된 메서드 이름을 변경하고 데이터 테이블 채우기 패턴, DataTable 패턴 반환 또는 둘 다를 사용할지 여부를 나타낼 수 있습니다. 이 메서드의 경우 두 옵션을 모두 선택된 상태로 두고 메서드 이름을 및 GetProductByProductIDFillByProductID 바꿉니다. 다음을 클릭하여 마법사가 수행할 단계의 요약을 확인한 다음 마침을 클릭하여 마법사를 완료합니다.

TableAdapter의 메서드 이름을 FillByProductID 및 GetProductByProductID로 바꿉니다.

그림 21: TableAdapter의 메서드 이름을 및 GetProductByProductIDFillByProductID 바꿉니다(전체 크기 이미지를 보려면 클릭).

마법사를 완료한 후 TableAdapter에 사용할 수 GetProductByProductID(productID) 있는 새 메서드가 있습니다. 이 메서드는 호출될 때 방금 만든 저장 프로시저를 실행 Products_SelectByProductID 합니다. 잠시 시간을 내어 저장 프로시저 폴더로 드릴다운하고 열어 Products_SelectByProductID 서버 Explorer 이 새 저장 프로시저를 봅니다(표시되지 않으면 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 새로 고침을 선택합니다).

저장 프로시저는 SelectByProductID 를 입력 매개 변수로 사용하고 @ProductID 마법사에서 입력한 문을 실행합니다 SELECT .

ALTER PROCEDURE dbo.Products_SelectByProductID
(
    @ProductID int
)
AS
    SET NOCOUNT ON;
SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products
WHERE ProductID = @ProductID

6단계: 비즈니스 논리 계층 클래스 만들기

자습서 시리즈 전반에 걸쳐 프레젠테이션 계층이 BLL(비즈니스 논리 계층)에 대한 모든 호출을 수행한 계층화된 아키텍처를 유지 관리하기 위해 노력했습니다. 이 디자인 결정을 준수하려면 먼저 프레젠테이션 계층에서 제품 데이터에 액세스하기 전에 새 Typed DataSet에 대한 BLL 클래스를 만들어야 합니다.

폴더에 ~/App_Code/BLL 라는 ProductsBLLWithSprocs.vb 새 클래스 파일을 만들고 다음 코드를 추가합니다.

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class ProductsBLLWithSprocs
    Private _productsAdapter As ProductsTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As ProductsTableAdapter
        Get
            If _productsAdapter Is Nothing Then
                _productsAdapter = New ProductsTableAdapter()
            End If
            Return _productsAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetProducts() As NorthwindWithSprocs.ProductsDataTable
        Return Adapter.GetProducts()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, False)> _
    Public Function GetProductByProductID(ByVal productID As Integer) _
        As NorthwindWithSprocs.ProductsDataTable
        Return Adapter.GetProductByProductID(productID)
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Insert, True)> _
    Public Function AddProduct _
        (ByVal productName As String, ByVal supplierID As Nullable(Of Integer), _
         ByVal categoryID As Nullable(Of Integer), ByVal quantityPerUnit As String, _
         ByVal unitPrice As Nullable(Of Decimal), _
         ByVal unitsInStock As Nullable(Of Short), _
         ByVal unitsOnOrder As Nullable(Of Short), _
         ByVal reorderLevel As Nullable(Of Short), _
         ByVal discontinued As Boolean) _
         As Boolean
         
        ' Create a new ProductRow instance
        Dim products As New NorthwindWithSprocs.ProductsDataTable()
        Dim product As NorthwindWithSprocs.ProductsRow = products.NewProductsRow()
        product.ProductName = productName
        If Not supplierID.HasValue Then 
            product.SetSupplierIDNull() 
        Else 
            product.SupplierID = supplierID.Value 
        End If
        If Not categoryID.HasValue Then 
            product.SetCategoryIDNull() 
        Else 
            product.CategoryID = categoryID.Value 
        End If
        If quantityPerUnit Is Nothing Then 
            product.SetQuantityPerUnitNull() 
        Else 
            product.QuantityPerUnit = quantityPerUnit 
        End If
        If Not unitPrice.HasValue Then 
            product.SetUnitPriceNull() 
        Else 
            product.UnitPrice = unitPrice.Value 
        End If
        If Not unitsInStock.HasValue Then 
            product.SetUnitsInStockNull() 
        Else 
            product.UnitsInStock = unitsInStock.Value 
        End If
        If Not unitsOnOrder.HasValue Then 
            product.SetUnitsOnOrderNull() 
        Else 
            product.UnitsOnOrder = unitsOnOrder.Value 
        End If
        If Not reorderLevel.HasValue Then 
            product.SetReorderLevelNull() 
        Else 
            product.ReorderLevel = reorderLevel.Value 
        End If
        product.Discontinued = discontinued
        ' Add the new product
        products.AddProductsRow(product)
        Dim rowsAffected As Integer = Adapter.Update(products)
        ' Return true if precisely one row was inserted, otherwise false
        Return rowsAffected = 1
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateProduct
        (ByVal productName As String, ByVal supplierID As Nullable(Of Integer), _
         ByVal categoryID As Nullable(Of Integer), ByVal quantityPerUnit As String, _
         ByVal unitPrice As Nullable(Of Decimal), _
         ByVal unitsInStock As Nullable(Of Short), _
         ByVal unitsOnOrder As Nullable(Of Short), _
         ByVal reorderLevel As Nullable(Of Short), _
         ByVal discontinued As Boolean, ByVal productID As Integer) _
         As Boolean
         
        Dim products As NorthwindWithSprocs.ProductsDataTable = _
            Adapter.GetProductByProductID(productID)
        If products.Count = 0 Then
            ' no matching record found, return false
            Return False
        End If
        Dim product As NorthwindWithSprocs.ProductsRow = products(0)
        product.ProductName = productName
        If Not supplierID.HasValue Then 
            product.SetSupplierIDNull() 
        Else 
            product.SupplierID = supplierID.Value 
        End If
        If Not categoryID.HasValue Then 
            product.SetCategoryIDNull() 
        Else 
            product.CategoryID = categoryID.Value 
        End If
        If quantityPerUnit Is Nothing Then 
            product.SetQuantityPerUnitNull() 
        Else 
            product.QuantityPerUnit = quantityPerUnit 
        End If
        If Not unitPrice.HasValue Then 
            product.SetUnitPriceNull() 
        Else 
            product.UnitPrice = unitPrice.Value 
        End If
        If Not unitsInStock.HasValue Then 
            product.SetUnitsInStockNull() 
        Else 
            product.UnitsInStock = unitsInStock.Value 
        End If
        If Not unitsOnOrder.HasValue Then 
            product.SetUnitsOnOrderNull() 
        Else 
            product.UnitsOnOrder = unitsOnOrder.Value 
        End If
        If Not reorderLevel.HasValue Then 
            product.SetReorderLevelNull() 
        Else 
            product.ReorderLevel = reorderLevel.Value 
        End If
        product.Discontinued = discontinued
        ' Update the product record
        Dim rowsAffected As Integer = Adapter.Update(product)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Delete, True)> _
    Public Function DeleteProduct(ByVal productID As Integer) As Boolean
        Dim rowsAffected As Integer = Adapter.Delete(productID)
        ' Return true if precisely one row was deleted, otherwise false
        Return rowsAffected = 1
    End Function
End Class

이 클래스는 이전 자습서의 ProductsBLL 클래스 의미 체계를 모방하지만 DataSet의 ProductsTableAdapterProductsDataTable 개체를 NorthwindWithSprocs 사용합니다. 예를 들어 클래스 파일 ProductsBLL 의 시작 부분에 문을 사용하는 대신 Imports NorthwindTableAdapters 클래스는 ProductsBLLWithSprocs 를 사용합니다Imports NorthwindWithSprocsTableAdapters. 마찬가지로 이 ProductsDataTable 클래스에 사용되는 및 ProductsRow 개체에는 네임스페이스가 접두사로 지정 NorthwindWithSprocs 됩니다. 클래스는 ProductsBLLWithSprocs 두 개의 데이터 액세스 메서드인 GetProductsGetProductByProductID및 단일 제품 instance 추가, 업데이트 및 삭제하는 메서드를 제공합니다.

7단계: 프레젠테이션 계층의NorthwindWithSprocsDataSet 작업

이 시점에서 저장 프로시저를 사용하여 기본 데이터베이스 데이터에 액세스하고 수정하는 DAL을 만들었습니다. 또한 제품을 추가, 업데이트 및 삭제하는 방법과 함께 모든 제품 또는 특정 제품을 검색하는 방법을 사용하여 기본적인 BLL을 빌드했습니다. 이 자습서를 마무리하려면 레코드 표시, 업데이트 및 삭제에 BLL 클래스 ProductsBLLWithSprocs 를 사용하는 ASP.NET 페이지를 만들어 보겠습니다.

폴더에서 NewSprocs.aspxAdvancedDAL 페이지를 열고 도구 상자에서 Designer GridView를 끌어 이름을 로 지정합니다Products. GridView의 스마트 태그에서 라는 새 ObjectDataSource ProductsDataSource에 바인딩하도록 선택합니다. 그림 22와 같이 클래스를 ProductsBLLWithSprocs 사용하도록 ObjectDataSource를 구성합니다.

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

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

SELECT 탭의 드롭다운 목록에는 및 두 가지 옵션이 GetProducts 있습니다 GetProductByProductID. GridView에서 모든 제품을 표시하려면 메서드를 GetProducts 선택합니다. UPDATE, INSERT 및 DELETE 탭의 드롭다운 목록에는 각각 하나의 메서드만 있습니다. 이러한 각 드롭다운 목록에 적절한 메서드가 선택되어 있는지 확인하고 마침을 클릭합니다.

ObjectDataSource 마법사가 완료되면 Visual Studio에서 제품 데이터 필드의 GridView에 BoundFields 및 CheckBoxField를 추가합니다. 스마트 태그에 있는 편집 사용 및 삭제 사용 옵션을 확인하여 GridView의 기본 제공 편집 및 삭제 기능을 켭니다.

편집 및 삭제 지원을 사용하도록 설정된 GridView가 포함된 페이지

그림 23: 편집 및 삭제 지원이 사용하도록 설정된 GridView가 페이지에 포함되어 있습니다(전체 크기 이미지를 보려면 클릭).

이전 자습서에서 설명한 것처럼 ObjectDataSource 마법사가 완료되면 Visual Studio는 속성을 original_{0} 설정합니다OldValuesParameterFormatString. BLL의 {0} 메서드에서 예상하는 매개 변수를 감안할 때 데이터 수정 기능이 제대로 작동하려면 이 값을 의 기본값으로 되돌려야 합니다. 따라서 속성을 {0} 로 설정 OldValuesParameterFormatString 하거나 선언적 구문에서 속성을 완전히 제거해야 합니다.

데이터 원본 구성 마법사를 완료하고 GridView에서 지원 편집 및 삭제를 켜고 ObjectDataSource의 OldValuesParameterFormatString 속성을 기본값으로 반환한 후 페이지의 선언적 태그는 다음과 유사하게 표시됩니다.

<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="ProductID" DataSourceID="ProductsDataSource">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
        <asp:BoundField DataField="ProductID" HeaderText="ProductID" 
            InsertVisible="False" ReadOnly="True" 
            SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" 
            SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" 
            SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" 
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
            SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" 
            SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" 
            SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" 
            SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" 
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
    DeleteMethod="DeleteProduct" InsertMethod="AddProduct" 
    SelectMethod="GetProducts" TypeName="ProductsBLLWithSprocs" 
    UpdateMethod="UpdateProduct">
    <DeleteParameters>
        <asp:Parameter Name="productID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
    </InsertParameters>
</asp:ObjectDataSource>

이 시점에서 유효성 검사를 포함하도록 편집 인터페이스를 사용자 지정하고, CategoryIDSupplierID 열을 DropDownLists로 렌더링하는 등 GridView를 정리할 수 있습니다. 삭제 단추에 클라이언트 쪽 확인을 추가할 수도 있으며, 이러한 향상된 기능을 구현하는 데 시간을 할애하는 것이 좋습니다. 그러나 이러한 topics 이전 자습서에서 다루어졌으므로 여기서는 다시 다루지 않습니다.

GridView를 향상시키는지 여부에 관계없이 브라우저에서 페이지의 핵심 기능을 테스트합니다. 그림 24와 같이 페이지에는 행별 편집 및 삭제 기능을 제공하는 GridView의 제품이 나열됩니다.

GridView에서 제품을 보고 편집하고 삭제할 수 있습니다.

그림 24: GridView에서 제품을 보고 편집하고 삭제할 수 있음(전체 크기 이미지를 보려면 클릭)

요약

형식화된 DataSet의 TableAdapters는 임시 SQL 문을 사용하거나 저장 프로시저를 통해 데이터베이스의 데이터에 액세스할 수 있습니다. 저장 프로시저를 사용할 때 기존 저장 프로시저를 사용하거나 TableAdapter 마법사에 쿼리를 기반으로 SELECT 새 저장 프로시저를 만들도록 지시할 수 있습니다. 이 자습서에서는 저장 프로시저를 자동으로 만드는 방법을 살펴보했습니다.

저장 프로시저를 자동으로 생성하면 시간을 절약할 수 있지만 마법사에서 만든 저장 프로시저가 직접 만든 것과 일치하지 않는 경우가 있습니다. 한 가지 예는 저장 프로시저로Products_Update, 매개 변수가 불필요하더라도 @Original_ProductID@ProductID 입력 매개 변수가 모두 @Original_ProductID 필요합니다.

많은 시나리오에서 저장 프로시저가 이미 만들어졌거나 저장 프로시저의 명령을 더 세부적으로 제어할 수 있도록 수동으로 빌드할 수 있습니다. 두 경우 모두 TableAdapter에 해당 메서드에 기존 저장 프로시저를 사용하도록 지시하려고 합니다. 이 작업을 수행하는 방법은 다음 자습서에서 확인할 것입니다.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 topics 대한 자세한 내용은 다음 리소스를 참조하세요.

저자 정보

7개의 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 연구해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 자신을 가르친다 ASP.NET 2.0 24 시간. 그는 에서 찾을 수있는 그의 블로그를 통해 또는 에 mitchell@4GuysFromRolla.comhttp://ScottOnWriting.NET도달 할 수 있습니다.

특별 감사

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