다음을 통해 공유


추가 DataTable 열 추가(C#)

작성자 : Scott Mitchell

PDF 다운로드

TableAdapter 마법사를 사용하여 형식화된 DataSet을 만드는 경우 해당 DataTable에는 기본 데이터베이스 쿼리에서 반환된 열이 포함됩니다. 그러나 DataTable에 추가 열을 포함해야 하는 경우가 있습니다. 이 자습서에서는 추가 DataTable 열이 필요할 때 저장 프로시저가 권장되는 이유를 알아봅니다.

소개

Typed DataSet에 TableAdapter를 추가할 때 해당 DataTable 스키마는 TableAdapter의 기본 쿼리에 의해 결정됩니다. 예를 들어 기본 쿼리가 데이터 필드 A, BC를 반환하는 경우 DataTable에는 A, BC라는 세 개의 해당 열이 있습니다. TableAdapter는 기본 쿼리 외에도 일부 매개 변수를 기반으로 데이터의 하위 집합을 반환하는 추가 쿼리를 포함할 수 있습니다. instance 경우 모든 제품에 대한 정보를 반환하는 기본 쿼리 외에도 ProductsTableAdapter 제공된 매개 변수를 기반으로 특정 제품 정보를 반환하는 및 와 GetProductByProductID(productID)같은 GetProductsByCategoryID(categoryID) 메서드도 포함됩니다.

DataTable 스키마를 갖는 모델은 TableAdapter의 모든 메서드가 기본 쿼리에 지정된 것과 동일하거나 적은 데이터 필드를 반환하는 경우 TableAdapter의 기본 쿼리가 잘 작동합니다. TableAdapter 메서드가 추가 데이터 필드를 반환해야 하는 경우 그에 따라 DataTable 스키마를 확장해야 합니다. Details DataList와 함께 마스터 레코드의 글머리 기호 목록을 사용하는 마스터/세부 정보 자습서에서는 각 범주와 연결된 제품 수를 보고하는 추가 데이터 필드인 와 기본 쿼리NumberOfProducts에 정의된 , CategoryNameDescription 데이터 필드를 반환CategoryID하는 메서드 CategoriesTableAdapter 를 에 추가했습니다. 이 새 메서드에서 데이터 필드 값을 캡처 NumberOfProducts 하기 위해 에 새 열을 CategoriesDataTable 수동으로 추가했습니다.

파일 업로드 자습서에서 설명한 대로 임시 SQL 문을 사용하고 데이터 필드가 기본 쿼리와 정확하게 일치하지 않는 메서드가 있는 TableAdapters를 사용하여 주의해야 합니다. TableAdapter 구성 마법사가 다시 실행되면 해당 데이터 필드 목록이 기본 쿼리와 일치하게 모든 TableAdapter 메서드를 업데이트합니다. 따라서 사용자 지정된 열 목록이 있는 메서드는 기본 쿼리 열 목록에 되돌리기 예상 데이터를 반환하지 않습니다. 저장 프로시저를 사용할 때는 이 문제가 발생하지 않습니다.

이 자습서에서는 추가 열을 포함하도록 DataTable 스키마를 확장하는 방법을 살펴봅니다. 임시 SQL 문을 사용할 때 TableAdapter의 취약성으로 인해 이 자습서에서는 저장 프로시저를 사용합니다. 저장 프로시저를 사용하도록 TableAdapter를 구성하는 방법에 대한 자세한 내용은 Typed DataSet의 TableAdapters 에 대한 새 저장 프로시저 만들기 자습서를 참조하세요.

1단계: 에 열 추가PriceQuartileProductsDataTable

형식화된 DataSet의 TableAdapters에 대한 새 저장 프로시저 만들기 자습서에서 라는 NorthwindWithSprocs형식화된 데이터 세트를 만들었습니다. 이 DataSet에는 현재 및 EmployeesDataTable의 두 DataTable이 포함되어 있습니다ProductsDataTable. ProductsTableAdapter 에는 다음 세 가지 메서드가 있습니다.

  • GetProducts- 테이블의 모든 레코드 Products 를 반환하는 기본 쿼리
  • GetProductsByCategoryID(categoryID) - 지정된 categoryID를 사용하여 모든 제품을 반환합니다.
  • GetProductByProductID(productID) - 지정된 productID를 사용하여 특정 제품을 반환합니다.

기본 쿼리와 두 개의 추가 메서드는 모두 동일한 데이터 필드 집합, 즉 테이블의 모든 열을 반환합니다Products. 또는 테이블에서 관련 데이터를 끌어올리거나 JOIN 상관 관계가 있는 하위 쿼리가 CategoriesSuppliers 없습니다. 따라서 ProductsDataTable 에는 테이블의 각 필드에 해당하는 열이 있습니다 Products .

이 자습서에서는 모든 제품을 반환하는 명명된 ProductsTableAdapterGetProductsWithPriceQuartile 에 메서드를 추가해 보겠습니다. 표준 제품 데이터 필드 GetProductsWithPriceQuartile 외에도 에는 제품 가격이 떨어지는 사분위수 아래를 나타내는 데이터 필드도 포함 PriceQuartile 됩니다. 예를 들어 가격이 가장 비싼 25% PriceQuartile 인 제품은 값이 1이고 가격이 하위 25%에 속하는 제품은 4의 값을 갖습니다. 그러나 이 정보를 반환하는 저장 프로시저를 만드는 것에 대해 걱정하기 전에 먼저 메서드를 사용할 때 결과를 저장할 PriceQuartile 열을 포함하도록 을 GetProductsWithPriceQuartile 업데이트 ProductsDataTable 해야 합니다.

DataSet을 NorthwindWithSprocs 열고 를 마우스 오른쪽 단추로 ProductsDataTable클릭합니다. 상황에 맞는 메뉴에서 추가를 선택한 다음 열을 선택합니다.

ProductsDataTable에 새 열 추가

그림 1: 에 새 열 ProductsDataTable 추가(전체 크기 이미지를 보려면 클릭)

그러면 형식 System.String의 Column1이라는 DataTable에 새 열이 추가됩니다. 1에서 4 사이의 숫자를 보유하는 데 사용되므로 이 열의 이름을 PriceQuartile 및 해당 형식 System.Int32 으로 업데이트해야 합니다. 에서 ProductsDataTable 새로 추가된 열을 선택하고 속성 창 속성을 PriceQuartile DataType 로 설정하고 속성을 로 System.Int32설정합니다Name.

새 열의 이름 및 DataType 속성 설정

그림 2: 새 열 NameDataType 속성 설정(전체 크기 이미지를 보려면 클릭)

그림 2와 같이 열의 값이 고유해야 하는지 여부, 열이 자동 증가 열인 경우, 데이터베이스 NULL 값 허용 여부 등과 같이 설정할 수 있는 추가 속성이 있습니다. 이러한 값을 기본값으로 설정합니다.

2단계: 메서드 만들기GetProductsWithPriceQuartile

ProductsDataTable 이제 가 열을 포함 PriceQuartile 하도록 업데이트되었으므로 메서드를 만들 GetProductsWithPriceQuartile 준비가 되었습니다. 먼저 TableAdapter를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 쿼리 추가를 선택합니다. 그러면 TableAdapter 쿼리 구성 마법사가 표시됩니다. 그러면 먼저 임시 SQL 문을 사용할지 아니면 새 저장 프로시저 또는 기존 저장 프로시저를 사용할지 여부를 묻는 메시지가 표시됩니다. 아직 가격 사분위수 데이터를 반환하는 저장 프로시저가 없으므로 TableAdapter에서 이 저장 프로시저를 만들도록 허용해 보겠습니다. 새 저장 프로시저 만들기 옵션을 선택하고 다음을 클릭합니다.

TableAdapter 마법사에 저장 프로시저를 만들도록 지시합니다.

그림 3: TableAdapter 마법사에 저장 프로시저를 만들도록 지시합니다(전체 크기 이미지를 보려면 클릭).

그림 4에 표시된 후속 화면에서 마법사는 추가할 쿼리 유형을 묻습니다. 메서드는 GetProductsWithPriceQuartile 테이블에서 모든 열과 레코드를 Products 반환하므로 행을 반환하는 SELECT 옵션을 선택하고 다음을 클릭합니다.

쿼리는 여러 행을 반환하는 SELECT 문이 됩니다.

그림 4: 쿼리는 여러 행을 SELECT 반환하는 문입니다(전체 크기 이미지를 보려면 클릭).

다음으로 쿼리에 대한 SELECT 메시지가 표시됩니다. 마법사에 다음 쿼리를 입력합니다.

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       NTILE(4) OVER (ORDER BY UnitPrice DESC) as PriceQuartile
FROM Products

위의 쿼리는 SQL Server 2005의 새 NTILE 함수를 사용하여 결과를 내림차순으로 정렬된 값에 따라 UnitPrice 그룹이 결정되는 4개의 그룹으로 나눕니다.

아쉽게도 쿼리 작성기에서 키워드(keyword) 구문 분석 OVER 하는 방법을 모르고 위의 쿼리를 구문 분석할 때 오류가 표시됩니다. 따라서 쿼리 작성기를 사용하지 않고 마법사의 텍스트 상자에 위의 쿼리를 직접 입력합니다.

참고

NTILE 및 SQL Server 2005의 다른 순위 함수에 대한 자세한 내용은 SQL Server 2005 온라인 설명서ROW_NUMBER(Transact-SQL)순위 함수 섹션을 참조하세요.

쿼리를 SELECT 입력하고 다음을 클릭하면 마법사에서 만들 저장 프로시저의 이름을 제공하도록 요청합니다. 새 저장 프로시저 Products_SelectWithPriceQuartile 의 이름을 지정하고 다음을 클릭합니다.

저장 프로시저 이름을 Products_SelectWithPriceQuartile

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

마지막으로 TableAdapter 메서드의 이름을 지정하라는 메시지가 표시됩니다. DataTable 채우기 및 DataTable 반환 확인란을 모두 선택한 상태로 두고 메서드 FillWithPriceQuartile 의 이름을 및 GetProductsWithPriceQuartile로 지정합니다.

TableAdapter의 메서드 이름을 지정하고 마침을 클릭합니다.

그림 6: TableAdapter의 메서드 이름을 지정하고 마침을 클릭합니다(전체 크기 이미지를 보려면 클릭).

쿼리가 SELECT 지정되고 저장 프로시저 및 TableAdapter 메서드가 명명된 상태에서 마침을 클릭하여 마법사를 완료합니다. 이 시점에서 SQL 구문 또는 문이 지원되지 않는다는 경고가 OVER 마법사에서 한두 개 나타날 수 있습니다. 이러한 경고는 무시할 수 있습니다.

마법사를 완료한 후 TableAdapter에는 및 GetProductsWithPriceQuartile 메서드가 FillWithPriceQuartile 포함되어야 하며 데이터베이스에는 라는 Products_SelectWithPriceQuartile저장 프로시저가 포함되어야 합니다. 잠시 시간을 내어 TableAdapter에 이 새 메서드가 실제로 포함되어 있고 저장 프로시저가 데이터베이스에 올바르게 추가되었는지 확인합니다. 데이터베이스를 확인할 때 저장 프로시저가 표시되지 않으면 저장 프로시저 폴더를 마우스 오른쪽 단추로 클릭하고 새로 고침을 선택합니다.

TableAdapter에 새 메서드가 추가되었는지 확인합니다.

그림 7: TableAdapter에 새 메서드가 추가되었는지 확인

데이터베이스에 Products_SelectWithPriceQuartile 저장 프로시저가 포함되어 있는지 확인합니다.

그림 8: 데이터베이스에 저장 프로시저가 Products_SelectWithPriceQuartile 포함되어 있는지 확인합니다(전체 크기 이미지를 보려면 클릭).

참고

임시 SQL 문 대신 저장 프로시저를 사용할 경우의 이점 중 하나는 TableAdapter 구성 마법사를 다시 실행해도 저장 프로시저 열 목록이 수정되지 않는다는 점입니다. TableAdapter를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 구성 옵션을 선택하여 마법사를 시작한 다음 마침을 클릭하여 완료합니다. 다음으로 데이터베이스로 이동하여 저장 프로시저를 Products_SelectWithPriceQuartile 확인합니다. 열 목록이 수정되지 않았습니다. 임시 SQL 문을 사용했다면 TableAdapter 구성 마법사를 다시 실행하면 이 쿼리 열 목록을 기본 쿼리 열 목록과 일치하도록 되돌려 메서드에서 사용하는 GetProductsWithPriceQuartile 쿼리에서 NTILE 문을 제거했을 것입니다.

데이터 액세스 계층의 GetProductsWithPriceQuartile 메서드가 호출되면 TableAdapter는 저장 프로시저를 실행하고 Products_SelectWithPriceQuartile 반환된 각 레코드의 에 행을 ProductsDataTable 추가합니다. 저장 프로시저에서 반환된 데이터 필드는 열에 ProductsDataTable 매핑됩니다. 저장 프로시저에서 반환된 PriceQuartile 데이터 필드가 있으므로 해당 값은 열 PriceQuartileProductsDataTable 할당됩니다.

쿼리가 데이터 필드를 PriceQuartile 반환 PriceQuartile 하지 않는 TableAdapter 메서드의 경우 열 값은 해당 DefaultValue 속성에 지정된 값입니다. 그림 2에서 보여 주듯이 이 값은 기본값인 로 DBNull설정됩니다. 다른 기본값을 원하는 경우 속성을 적절하게 설정 DefaultValue 하기만 하면 됩니다. 열이 DefaultValue s(즉, System.Int32DataType 의 경우)인 경우 값이 PriceQuartile 유효한지 확인합니다.

이 시점에서 DataTable에 열을 추가하는 데 필요한 단계를 수행했습니다. 이 추가 열이 예상대로 작동하는지 확인하려면 각 제품의 이름, 가격 및 가격 사분위수를 표시하는 ASP.NET 페이지를 만들어 보겠습니다. 하지만 이 작업을 수행하려면 먼저 DAL GetProductsWithPriceQuartile 메서드를 호출하는 메서드를 포함하도록 비즈니스 논리 계층을 업데이트해야 합니다. 3단계에서 BLL을 업데이트한 다음, 4단계에서 ASP.NET 페이지를 만듭니다.

3단계: 비즈니스 논리 계층 보강

프레젠테이션 계층의 새 GetProductsWithPriceQuartile 메서드를 사용하기 전에 먼저 해당 메서드를 BLL에 추가해야 합니다. ProductsBLLWithSprocs 클래스 파일을 열고 다음 코드를 추가합니다.

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetProductsWithPriceQuartile()
{
    return Adapter.GetProductsWithPriceQuartile();
}

의 다른 데이터 검색 메서드 ProductsBLLWithSprocs와 마찬가지로 메서드는 GetProductsWithPriceQuartile DAL의 해당 GetProductsWithPriceQuartile 메서드를 호출하고 결과를 반환합니다.

4단계: ASP.NET 웹 페이지에 가격 사분위수 정보 표시

BLL 추가가 완료되면 각 제품의 가격 사분위수로 표시되는 ASP.NET 페이지를 만들 준비가 된 것입니다. 폴더에서 AddingColumns.aspxAdvancedDAL 페이지를 열고 도구 상자에서 Designer GridView를 끌어 속성을 IDProducts로 설정합니다. GridView의 스마트 태그에서 라는 ProductsDataSource새 ObjectDataSource에 바인딩합니다. 클래스의 GetProductsWithPriceQuartile 메서드를 사용하도록 ObjectDataSource를 ProductsBLLWithSprocs 구성합니다. 읽기 전용 표이므로 UPDATE, INSERT 및 DELETE 탭의 드롭다운 목록을 (없음)으로 설정합니다.

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

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

GetProductsWithPriceQuartile 메서드에서 제품 정보 검색

그림 10: 메서드에서 GetProductsWithPriceQuartile 제품 정보 검색(전체 크기 이미지를 보려면 클릭)

데이터 원본 구성 마법사를 완료한 후 Visual Studio는 메서드에서 반환된 각 데이터 필드의 GridView에 BoundField 또는 CheckBoxField를 자동으로 추가합니다. 이러한 데이터 필드 중 하나는 입니다 PriceQuartile. 이 열은 1단계에서 에 추가한 ProductsDataTable 열입니다.

, 및 PriceQuartile BoundFields를 제외한 ProductNameUnitPrice모든 필드를 제거하여 GridView 필드를 편집합니다. 값의 UnitPrice 형식을 통화로 지정하고 UnitPricePriceQuartile BoundFields를 각각 오른쪽 및 가운데에 맞추도록 BoundField를 구성합니다. 마지막으로 나머지 BoundFields HeaderText 속성을 각각 Product, Price 및 Price 사분위수로 업데이트합니다. 또한 GridView의 스마트 태그에서 정렬 사용 확인란을 검사.

이러한 수정 후에 GridView 및 ObjectDataSource의 선언적 태그는 다음과 같이 표시됩니다.

<asp:GridView ID="Products" runat="server" AllowSorting="True"
    AutoGenerateColumns="False" DataKeyNames="ProductID" 
    DataSourceID="ProductsDataSource">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
            HeaderText="Price" HtmlEncode="False" 
            SortExpression="UnitPrice">
            <ItemStyle HorizontalAlign="Right" />
        </asp:BoundField>
        <asp:BoundField DataField="PriceQuartile" HeaderText="Price Quartile" 
            SortExpression="PriceQuartile">
            <ItemStyle HorizontalAlign="Center" />
        </asp:BoundField>
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsWithPriceQuartile" 
    TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>

그림 11은 브라우저를 통해 방문했을 때 이 페이지를 보여줍니다. 처음에는 제품이 적절한 PriceQuartile 값이 할당된 각 제품과 함께 내림차순으로 가격으로 주문됩니다. 물론 이 데이터는 가격 사분위수 열 값이 가격에 대한 제품 순위를 반영하여 다른 기준에 따라 정렬될 수 있습니다(그림 12 참조).

제품은 가격으로 주문됩니다.

그림 11: 제품 주문 기준 가격(전체 크기 이미지를 보려면 클릭)

제품 이름은 해당 이름으로 정렬됩니다.

그림 12: 제품이 이름으로 정렬됨(전체 크기 이미지를 보려면 클릭)

참고

몇 줄의 코드를 사용하여 GridView를 보강하여 값에 PriceQuartile 따라 제품 행에 색을 적용할 수 있습니다. 첫 번째 사분위수에서 연한 녹색, 두 번째 사분위수의 제품에 연한 노란색 등을 색칠할 수 있습니다. 잠시 시간을 내어 이 기능을 추가하는 것이 좋습니다. GridView 서식 지정에 대한 새로 고침이 필요한 경우 데이터 기반 사용자 지정 서식 자습서를 참조하세요.

대체 방법 - 다른 TableAdapter 만들기

이 자습서에서 볼 수 있듯이 기본 쿼리에서 철자가 지정되지 않은 데이터 필드를 반환하는 TableAdapter에 메서드를 추가할 때 해당 열을 DataTable에 추가할 수 있습니다. 그러나 이러한 접근 방식은 다른 데이터 필드를 반환하는 TableAdapter에 적은 수의 메서드가 있고 이러한 대체 데이터 필드가 기본 쿼리와 크게 다르지 않은 경우에만 잘 작동합니다.

DataTable에 열을 추가하는 대신 다른 데이터 필드를 반환하는 첫 번째 TableAdapter의 메서드를 포함하는 다른 TableAdapter를 DataSet에 추가할 수 있습니다. 이 자습서에서는 (메서드에서만 사용되는GetProductsWithPriceQuartile) 열에 열을 ProductsDataTable 추가하는 PriceQuartile 대신 저장 프로시저를 기본 쿼리로 사용하는 Products_SelectWithPriceQuartile 라는 ProductsWithPriceQuartileTableAdapter DataSet에 TableAdapter를 추가했을 수 있습니다. 가격 사분위수로 제품 정보를 가져오는 데 필요한 ASP.NET 페이지는 를 사용하는 반면, 를 계속 사용할 수 없는 페이지는 을 ProductsTableAdapter사용합니다ProductsWithPriceQuartileTableAdapter.

새 TableAdapter를 추가하면 DataTable은 대상 없는 상태로 유지되고 해당 열은 TableAdapter 메서드에서 반환된 데이터 필드를 정확하게 미러. 그러나 추가 TableAdapters는 반복적인 작업 및 기능을 도입할 수 있습니다. 예를 들어 열을 표시 PriceQuartile 한 ASP.NET 페이지에서도 삽입, 업데이트 및 삭제 지원을 ProductsWithPriceQuartileTableAdapter 제공해야 하는 경우 , UpdateCommandDeleteCommand 속성을 올바르게 구성해야 합니다InsertCommand. 이러한 속성은 미러 ProductsTableAdapter 있지만 이 구성에는 추가 단계가 도입됩니다. 또한 이제 및 ProductsWithPriceQuartileTableAdapter 클래스를 통해 ProductsTableAdapter 데이터베이스에 제품을 업데이트, 삭제 또는 추가하는 두 가지 방법이 있습니다.

이 자습서의 다운로드에는 이 대체 방법을 보여 주는 DataSet의 클래스 NorthwindWithSprocs 가 포함되어 ProductsWithPriceQuartileTableAdapter 있습니다.

요약

대부분의 시나리오에서 TableAdapter의 모든 메서드는 동일한 데이터 필드 집합을 반환하지만 특정 메서드 또는 두 가지가 추가 필드를 반환해야 하는 경우가 있습니다. 예를 들어 Master/Detail Details DataList와 함께 마스터 레코드의 글머리 기호 목록을 사용하여 자습서에서 메서드를 CategoriesTableAdapter 추가했습니다. 이 메서드는 기본 쿼리의 데이터 필드 외에도 각 범주와 연결된 제품 수를 보고하는 필드를 반환 NumberOfProducts 했습니다. 이 자습서에서는 기본 쿼리의 데이터 필드 외에도 필드를 반환하는 PriceQuartile 에 메서드 ProductsTableAdapter 를 추가하는 방법을 살펴보았습니다. TableAdapter 메서드에서 반환된 추가 데이터 필드를 캡처하려면 해당 열을 DataTable에 추가해야 합니다.

DataTable에 열을 수동으로 추가하려는 경우 TableAdapter에서 저장 프로시저를 사용하는 것이 좋습니다. TableAdapter가 임시 SQL 문을 사용하는 경우 TableAdapter 구성 마법사가 실행되면 기본 쿼리에서 반환된 데이터 필드로 되돌리기 모든 메서드 데이터 필드 목록이 실행됩니다. 이 문제는 저장 프로시저로 확장되지 않으므로 권장되며 이 자습서에서 사용되었습니다.

행복한 프로그래밍!

저자 정보

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.