다음을 통해 공유


계산 열 작업(C#)

스콧 미첼

PDF 다운로드

데이터베이스 테이블을 만들 때 Microsoft SQL Server를 사용하면 일반적으로 동일한 데이터베이스 레코드의 다른 값을 참조하는 식에서 값을 계산하는 계산 열을 정의할 수 있습니다. 이러한 값은 데이터베이스에서 읽기 전용이므로 TableAdapters를 사용할 때 특별한 고려 사항이 필요합니다. 이 자습서에서는 계산 열에 의해 제기되는 문제를 해결하는 방법을 알아봅니다.

소개

Microsoft SQL Server를 사용하면 일반적으로 같은 테이블의 다른 열에서 값을 참조하는 식에서 값을 계산하는 열인 계산 열을 사용할 수 있습니다. 예를 들어 시간 추적 데이터 모델에는 열이 포함된 테이블이 ServiceLog RateServicePerformedEmployeeIDDuration있을 수 있습니다. 서비스 항목당 기한 금액(기간과 곱한 속도)은 웹 페이지 또는 기타 프로그래밍 인터페이스를 통해 계산할 수 있지만 이 정보를 보고한 테이블의 AmountDue 열을 ServiceLog 포함하는 것이 편리할 수 있습니다. 이 열은 일반 열로 만들 수 있지만 열 값이 Duration 변경될 때마다 Rate 업데이트해야 합니다. 더 나은 방법은 식을 Rate * Duration사용하여 열을 계산 열로 만드는 AmountDue 것입니다. 이렇게 하면 SQL Server가 쿼리에서 참조될 때마다 열 값을 자동으로 계산 AmountDue 하게 됩니다.

계산 열의 값은 식에 의해 결정되므로 이러한 열은 읽기 전용이므로 값이 문이나 UPDATE 문에 INSERT 할당될 수 없습니다. 그러나 계산 열이 임시 SQL 문을 사용하는 TableAdapter에 대한 기본 쿼리의 일부인 경우 자동 생성 INSERTUPDATE 문에 자동으로 포함됩니다. 따라서 계산된 열에 대한 참조를 제거하려면 TableAdapter INSERT UPDATE 와 쿼리 및 InsertCommand UpdateCommand 속성을 업데이트해야 합니다.

임시 SQL 문을 사용하는 TableAdapter에서 계산 열을 사용하는 한 가지 과제는 TableAdapter 구성 마법사가 완료될 때마다 TableAdapter INSERTUPDATE 쿼리가 자동으로 다시 생성된다는 것입니다. 따라서 마법사를 다시 실행하면 계산 열이 INSERT 수동으로 제거되고 UPDATE 쿼리가 다시 나타납니다. 저장 프로시저를 사용하는 TableAdapters는 이러한 취약성으로 인해 어려움을 겪지 않지만 3단계에서 해결할 고유한 단점이 있습니다.

이 자습서에서는 Northwind 데이터베이스의 Suppliers 테이블에 계산 열을 추가한 다음 이 테이블 및 해당 계산 열을 사용하는 해당 TableAdapter를 만듭니다. TableAdapter 구성 마법사를 사용할 때 사용자 지정이 손실되지 않도록 TableAdapter는 임시 SQL 문 대신 저장 프로시저를 사용합니다.

시작해 보겠습니다!

1단계: 테이블에 계산 열Suppliers추가

Northwind 데이터베이스에는 계산 열이 없으므로 직접 추가해야 합니다. 이 자습서에서는 연락처 이름, 제목 및 해당 사용자가 작업하는 Suppliers 회사를 반환하는 계산 열을 다음 형식 ContactName 으로 반환하는 계산 FullContactName 열을 테이블에 추가해 보겠습니다( (ContactTitle, CompanyName). 이 계산 열은 공급업체에 대한 정보를 표시할 때 보고서에 사용될 수 있습니다.

먼저 서버 탐색기에서 테이블을 마우스 오른쪽 단추로 클릭하고 Suppliers 상황에 맞는 메뉴에서 테이블 정의 열기를 선택하여 테이블 정의를 엽니다Suppliers. 이렇게 하면 테이블의 열과 해당 속성(예: 데이터 형식, 허용 NULL 여부 등)이 표시됩니다. 계산 열을 추가하려면 먼저 열 이름을 테이블 정의에 입력합니다. 그런 다음 열 속성 창 계산 열 사양 섹션 아래의 (수식) 텍스트 상자에 식을 입력합니다(그림 1 참조). 계산 열 FullContactName 의 이름을 지정하고 다음 식을 사용합니다.

ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN 
    ContactTitle + ', ' ELSE '' END + CompanyName + ')'

연산자를 사용하여 SQL에서 문자열을 + 연결할 수 있습니다. 이 문은 CASE 기존 프로그래밍 언어의 조건부처럼 사용할 수 있습니다. 위의 식 CASE 에서 문을 다음과 같이 읽을 수 있습니다. 그렇지 않으면 ContactTitle 쉼표와 연결된 값을 출력 ContactTitle 하지 않으면 아무 것도 내보내지 않습니다NULL. 문의 유용성에 CASE 대한 자세한 내용은 SQL CASE 문을 참조하세요.

참고 항목

여기서 문을 CASE 사용하는 대신 대신 사용할 ISNULL(ContactTitle, '')수 있습니다. ISNULL(checkExpression, replacementValue)는 nULL이 아닌 경우 checkExpression을 반환하고, 그렇지 않으면 replacementValue를 반환합니다. ISNULL 이 인스턴스에서 작동하거나 CASE 작동하지만 명령문의 CASE 유연성을 일치ISNULL시킬 수 없는 더 복잡한 시나리오가 있습니다.

이 계산 열을 추가한 후 화면은 그림 1의 스크린샷과 같아야 합니다.

Suppliers 테이블에 FullContactName이라는 계산 열 추가

그림 1: 테이블에 명명 FullContactName Suppliers 된 계산 열 추가(전체 크기 이미지를 보려면 클릭)

계산 열의 이름을 지정하고 식을 입력한 후 도구 모음에서 저장 아이콘을 클릭하거나 Ctrl+S를 누르거나 파일 메뉴로 이동하여 저장을 선택하여 테이블에 변경 내용을 저장 Suppliers합니다.

테이블을 저장하면 테이블 열 목록에 방금 추가된 열을 Suppliers 포함하여 서버 탐색기가 새로 고쳐집니다. 또한 (수식) 텍스트 상자에 입력된 식은 불필요한 공백을 제거하고, 열 이름을 대괄호([])로 묶고, 작업 순서를 더 명시적으로 표시하기 위해 괄호를 포함하는 동일한 식으로 자동으로 조정됩니다.

(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL 
    then [ContactTitle]+', ' else '' end)+[CompanyName])+')')

Microsoft SQL Server의 계산 열에 대한 자세한 내용은 기술 설명서를 참조 하세요. 또한 계산 열을 만드는 단계별 연습에 대해 계산 열 지정 방법도 확인합니다.

참고 항목

기본적으로 계산 열은 실제로 테이블에 저장되지 않고 쿼리에서 참조될 때마다 다시 계산됩니다. 그러나 지속형 확인란을 선택하면 SQL Server에 계산 열을 테이블에 물리적으로 저장하도록 지시할 수 있습니다. 이렇게 하면 계산 열에 인덱스를 만들 수 있으므로 해당 절에서 계산된 열 값을 WHERE 사용하는 쿼리의 성능이 향상될 수 있습니다. 자세한 내용은 계산 열에서 인덱스 만들기를 참조하세요.

2단계: 계산 열 값 보기

데이터 액세스 계층에 대한 작업을 시작하기 전에 값을 보는 데 1분 정도 걸릴 수 있습니다 FullContactName . 서버 탐색기에서 테이블 이름을 마우스 오른쪽 단추로 Suppliers 클릭하고 상황에 맞는 메뉴에서 새 쿼리를 선택합니다. 그러면 쿼리 창이 표시되어 쿼리에 포함할 테이블을 선택하라는 메시지가 표시됩니다. Suppliers 테이블을 추가하고 닫기를 클릭합니다. 다음으로 Suppliers 테이블에서 , ContactTitleContactNameFullContactName 열을 확인CompanyName합니다. 마지막으로 도구 모음에서 빨간색 느낌표 아이콘을 클릭하여 쿼리를 실행하고 결과를 봅니다.

그림 2에서와 같이 결과에는 ldquo 형식을 사용하는 열과 ldquoContactName 형식을 나열하는 CompanyNameContactName열이 포함FullContactName됩니다(ContactTitle, CompanyName).ContactTitle

FullContactName에서 ContactName 형식 사용(ContactTitle, CompanyName)

그림 2: 형식 사용(ContactTitle, CompanyName) (전체 크기 이미지를 보려면 클릭)ContactName FullContactName

3단계: 데이터 액세스 계층에 추가SuppliersTableAdapter

애플리케이션의 공급업체 정보를 사용하려면 먼저 DAL에서 TableAdapter 및 DataTable을 만들어야 합니다. 이 작업은 이전 자습서에서 검사한 것과 동일한 간단한 단계를 사용하여 수행하는 것이 이상적입니다. 그러나 계산 열로 작업하면 토론의 장점이 되는 몇 가지 주름이 도입됩니다.

임시 SQL 문을 사용하는 TableAdapter를 사용하는 경우 TableAdapter 구성 마법사를 통해 TableAdapter의 주 쿼리에 계산 열을 포함하기만 하면 됩니다. 그러나 이렇게 하면 계산 열이 포함된 문이 자동으로 생성 INSERT 됩니다 UPDATE . 이러한 메서드 SqlException 중 하나를 실행하려고 하면 ColumnName 열이 계산 열 이거나 UNION 연산자의 결과이므로 ColumnName 열을 수정할 수 없습니다. INSERT TableAdapter 및 UpdateCommand 속성을 통해 및 UPDATE 문을 수동으로 조정할 수 있지만 TableAdapter InsertCommand 구성 마법사를 다시 실행할 때마다 이러한 사용자 지정이 손실됩니다.

임시 SQL 문을 사용하는 TableAdapters의 취약성으로 인해 계산 열로 작업할 때 저장 프로시저를 사용하는 것이 좋습니다. 기존 저장 프로시저를 사용하는 경우 Typed DataSet의 TableAdapters 자습서에 대한 기존 저장 프로시저 사용 자습서에 설명된 대로 TableAdapter 를 구성하기만 하면 됩니다. 그러나 TableAdapter 마법사가 저장 프로시저를 만드는 경우 처음에는 주 쿼리에서 계산된 열을 생략하는 것이 중요합니다. 기본 쿼리에 계산 열을 포함하는 경우 TableAdapter 구성 마법사는 완료 시 해당 저장 프로시저를 만들 수 없음을 알려줍니다. 즉, 처음에는 계산 열 없는 기본 쿼리를 사용하여 TableAdapter를 구성한 다음 계산 열을 포함하도록 해당 저장 프로시저 및 TableAdapter를 SelectCommand 수동으로 업데이트해야 합니다. 이 방법은 TableAdapter to UseJOIN 자습서 업데이트에 사용된 방식과 비슷합니다.

이 자습서에서는 새 TableAdapter를 추가하고 저장 프로시저를 자동으로 만들어 보겠습니다. 따라서 처음에는 주 쿼리에서 계산 열을 생략 FullContactName 해야 합니다.

먼저 폴더에서 NorthwindWithSprocs DataSet을 ~/App_Code/DAL 엽니다. 디자이너를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 새 TableAdapter를 추가하도록 선택합니다. 그러면 TableAdapter 구성 마법사가 시작됩니다. 데이터를 쿼리할 데이터베이스를NORTHWNDConnectionString Web.config지정하고 다음을 클릭합니다. 테이블을 쿼리하거나 수정하기 Suppliers 위한 저장 프로시저를 아직 만들지 않았으므로 마법사에서 새로 저장 프로시저를 만들고 다음을 클릭할 수 있도록 새 저장 프로시저 만들기 옵션을 선택합니다.

새 저장 프로시저 만들기 옵션 선택

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

후속 단계에서는 기본 쿼리를 묻는 메시지를 표시합니다. 각 공급자에 대한 , CompanyName, ContactNameContactTitle 열을 반환SupplierID하는 다음 쿼리를 입력합니다. 이 쿼리는 의도적으로 계산 열()FullContactName을 생략합니다. 4단계에서 이 열을 포함하도록 해당 저장 프로시저를 업데이트합니다.

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

기본 쿼리를 입력하고 다음을 클릭하면 마법사에서 생성할 4개의 저장 프로시저의 이름을 지정합니다. 그림 4와 Suppliers_SelectSuppliers_InsertSuppliers_Update같이 이러한 저장 프로시저의 이름을 지정하고 Suppliers_Delete이름을 지정합니다.

자동 생성된 저장 프로시저의 이름 사용자 지정

그림 4: 자동 생성된 저장 프로시저의 이름 사용자 지정(전체 크기 이미지를 보려면 클릭)

다음 마법사 단계를 통해 TableAdapter 메서드의 이름을 지정하고 데이터에 액세스하고 업데이트하는 데 사용되는 패턴을 지정할 수 있습니다. 세 확인란을 모두 선택한 상태로 두고 메서드 GetSuppliers이름을 GetData .로 바꿉니다. 마침을 클릭하여 마법사를 완료합니다.

GetData 메서드를 GetSuppliers로 이름 바꾸기

그림 5: 메서드 이름을 GetData 다음으로 GetSuppliers 바꿉니다(전체 크기 이미지를 보려면 클릭).

마침을 클릭하면 마법사에서 4개의 저장 프로시저를 만들고 TableAdapter 및 해당 DataTable을 Typed DataSet에 추가합니다.

4단계: TableAdapter의 기본 쿼리에 계산 열 포함

이제 계산 열을 포함하도록 3단계에서 만든 TableAdapter 및 DataTable을 FullContactName 업데이트해야 합니다. 여기에는 다음 두 단계가 포함됩니다.

  1. 계산 열을 반환 FullContactName 하도록 저장 프로시저 업데이트 Suppliers_Select
  2. 해당 FullContactName 열을 포함하도록 DataTable을 업데이트합니다.

먼저 서버 탐색기로 이동하여 저장 프로시저 폴더로 드릴다운합니다. 저장 프로시저를 Suppliers_Select 열고 계산 열을 포함하도록 쿼리를 FullContactName 업데이트 SELECT 합니다.

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers

도구 모음에서 저장 아이콘을 클릭하거나, Ctrl+S를 누르거나, 파일 메뉴에서 저장 옵션을 선택하여 저장 프로시저에 변경 내용을 저장 Suppliers_Select 합니다.

그런 다음, 데이터 세트 디자이너로 돌아가서 마우스 오른쪽 단추로 클릭하고 SuppliersTableAdapter상황에 맞는 메뉴에서 구성을 선택합니다. 이제 열에 Suppliers_Select 데이터 열 컬렉션의 FullContactName 열이 포함됩니다.

TableAdapter 구성 마법사를 실행하여 DataTable의 열을 업데이트합니다.

그림 6: TableAdapter 구성 마법사를 실행하여 DataTable의 열을 업데이트합니다(전체 크기 이미지를 보려면 클릭).

마침을 클릭하여 마법사를 완료합니다. 그러면 해당 열이 자동으로 .에 SuppliersDataTable추가됩니다. TableAdapter 마법사는 열이 계산 열이므로 읽기 전용임을 FullContactName 감지할 수 있을 만큼 스마트합니다. 따라서 열의 ReadOnly 속성을 true.로 설정합니다. 이를 확인하려면 해당 열에서 SuppliersDataTable 열을 선택한 다음 속성 창 이동합니다(그림 7 참조). FullContactNameDataTypeMaxLength 속성도 그에 따라 설정됩니다.

FullContactName 열이 읽기 전용으로 표시됨

그림 7: FullContactName 열이 읽기 전용으로 표시됨(전체 크기 이미지를 보려면 클릭)

5단계: TableAdapter에 메서드 추가GetSupplierBySupplierID

이 자습서에서는 업데이트 가능한 그리드에 공급자를 표시하는 ASP.NET 페이지를 만듭니다. 이전 자습서에서는 DAL에서 해당 특정 레코드를 강력한 형식의 DataTable로 검색하고, 속성을 업데이트한 다음, 업데이트된 DataTable을 DAL로 다시 보내 변경 내용을 데이터베이스에 전파하여 비즈니스 논리 계층의 단일 레코드를 업데이트했습니다. DAL에서 업데이트되는 레코드를 검색하는 이 첫 번째 단계를 수행하려면 먼저 DAL에 메서드를 GetSupplierBySupplierID(supplierID) 추가해야 합니다.

DataSet 디자인에서 마우스 오른쪽 단추를 클릭하고 SuppliersTableAdapter 상황에 맞는 메뉴에서 쿼리 추가 옵션을 선택합니다. 3단계에서 수행한 것처럼 마법사에서 새 저장 프로시저 만들기 옵션을 선택하여 새 저장 프로시저를 생성하도록 합니다(이 마법사 단계의 스크린샷은 그림 3 참조). 이 메서드는 여러 열이 있는 레코드를 반환하므로 행을 반환하는 SELECT인 SQL 쿼리를 사용하고 다음을 클릭합니다.

행을 반환하는 SELECT 옵션 선택

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

후속 단계에서는 이 메서드에 사용할 쿼리를 묻는 메시지를 표시합니다. 주 쿼리와 동일한 데이터 필드를 반환하지만 특정 공급자에 대해 반환하는 다음을 입력합니다.

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID

다음 화면에서는 자동으로 생성될 저장 프로시저의 이름을 지정하도록 요청합니다. 이 저장 프로시저 Suppliers_SelectBySupplierID 의 이름을 지정하고 다음을 클릭합니다.

저장 프로시저 이름을 Suppliers_SelectBySupplierID

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

마지막으로, 마법사는 TableAdapter에 사용할 데이터 액세스 패턴 및 메서드 이름을 묻는 메시지를 표시합니다. 두 확인란을 모두 선택하지 않고 각각 이름과 GetDataBy 메서드 FillBySupplierID GetSupplierBySupplierIDFillBy 이름을 바꿉니다.

TableAdapter 메서드 FillBySupplierID 및 GetSupplierBySupplierID의 이름을 지정합니다.

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

마침을 클릭하여 마법사를 완료합니다.

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

1단계에서 만든 계산 열을 사용하는 ASP.NET 페이지를 만들기 전에 먼저 BLL에 해당 메서드를 추가해야 합니다. 7단계에서 만들 ASP.NET 페이지에서는 사용자가 공급자를 보고 편집할 수 있습니다. 따라서 BLL은 최소한 모든 공급업체를 가져오는 방법과 특정 공급업체를 업데이트하는 방법을 제공해야 합니다.

폴더에 명명된 SuppliersBLLWithSprocs ~/App_Code/BLL 새 클래스 파일을 만들고 다음 코드를 추가합니다.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
    private SuppliersTableAdapter _suppliersAdapter = null;
    protected SuppliersTableAdapter Adapter
    {
        get
        {
            if (_suppliersAdapter == null)
                _suppliersAdapter = new SuppliersTableAdapter();
            return _suppliersAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
    {
        return Adapter.GetSuppliers();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Update, true)]
    public bool UpdateSupplier(string companyName, string contactName, 
        string contactTitle, int supplierID)
    {
        NorthwindWithSprocs.SuppliersDataTable suppliers = 
            Adapter.GetSupplierBySupplierID(supplierID);
        if (suppliers.Count == 0)
            // no matching record found, return false
            return false;
        NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
        supplier.CompanyName = companyName;
        if (contactName == null) 
            supplier.SetContactNameNull(); 
        else 
            supplier.ContactName = contactName;
        if (contactTitle == null) 
            supplier.SetContactTitleNull(); 
        else 
            supplier.ContactTitle = contactTitle;
        // Update the product record
        int rowsAffected = Adapter.Update(supplier);
        // Return true if precisely one row was updated, otherwise false
        return rowsAffected == 1;
    }
}

다른 BLL 클래스와 SuppliersBLLWithSprocs protected Adapter 마찬가지로 두 가지 public 메서드 GetSuppliers 와 함께 클래스의 인스턴스를 SuppliersTableAdapter 반환하는 속성이 있습니다.UpdateSupplier 이 메서드는 GetSuppliers 데이터 액세스 계층의 SuppliersDataTable 해당 GetSupplier 메서드에서 반환된 값을 호출하고 반환합니다. 이 메서드는 UpdateSupplier DAL GetSupplierBySupplierID(supplierID) 메서드 호출을 통해 업데이트되는 특정 공급자에 대한 정보를 검색합니다. 그런 다음, ContactName데이터 액세스 계층 메서드 Update 를 호출하고 수정된 SuppliersRow 개체를 전달하여 해당 변경 내용을 업데이트하고 ContactTitle 속성을 업데이트CategoryName하고 데이터베이스에 커밋합니다.

참고 항목

SupplierID CompanyNameSuppliers 테이블의 모든 열을 제외하고 값을 허용 NULL 합니다. 따라서 전달된 contactName 매개 변수 또는 contactTitle 매개 변수가 있는 null 경우 각각 및 SetContactTitleNull 메서드를 사용하여 해당 ContactNameContactTitle 속성을 NULL 데이터베이스 값으로 SetContactNameNull 설정해야 합니다.

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

계산 열이 테이블에 추가 Suppliers 되고 DAL 및 BLL이 그에 따라 업데이트되면 계산 열과 함께 FullContactName 작동하는 ASP.NET 페이지를 빌드할 준비가 된 것입니다. 먼저 폴더에서 ComputedColumns.aspx AdvancedDAL 페이지를 열고 도구 상자에서 디자이너로 GridView를 끕니다. GridView의 ID 속성을 Suppliers 스마트 태그로 설정하고 해당 속성을 새 ObjectDataSource에 SuppliersDataSource바인딩합니다. 6단계에서 다시 추가한 클래스를 SuppliersBLLWithSprocs 사용하도록 ObjectDataSource를 구성하고 다음을 클릭합니다.

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

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

클래스 GetSuppliers 에는 두 가지 메서드만 정의 SuppliersBLLWithSprocs 되어 있습니다UpdateSupplier. 이러한 두 메서드가 각각 SELECT 및 UPDATE 탭에 지정되어 있는지 확인하고 마침을 클릭하여 ObjectDataSource의 구성을 완료합니다.

데이터 원본 구성 마법사가 완료되면 Visual Studio는 반환된 각 데이터 필드에 대한 BoundField를 추가합니다. BoundField를 SupplierID 제거하고 , ContactName, ContactTitleFullContactName BoundFields의 CompanyName속성을 회사, 연락처 이름, 제목 및 전체 연락처 이름으로 각각 변경 HeaderText 합니다. 스마트 태그에서 편집 사용 확인란을 선택하여 GridView의 기본 제공 편집 기능을 켭니다.

GridView에 BoundFields를 추가하는 것 외에도 데이터 원본 마법사가 완료되면 Visual Studio에서 ObjectDataSource의 OldValuesParameterFormatString 속성을 original_{0} 설정합니다. 이 설정을 기본값 {0} 으로 되돌려 갑니다.

GridView 및 ObjectDataSource를 편집한 후 선언적 태그는 다음과 유사하게 표시됩니다.

<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:BoundField DataField="CompanyName" 
            HeaderText="Company" 
            SortExpression="CompanyName" />
        <asp:BoundField DataField="ContactName" 
            HeaderText="Contact Name" 
            SortExpression="ContactName" />
        <asp:BoundField DataField="ContactTitle" 
            HeaderText="Title" 
            SortExpression="ContactTitle" />
        <asp:BoundField DataField="FullContactName" 
            HeaderText="Full Contact Name"
            SortExpression="FullContactName" 
            ReadOnly="True" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs" 
        UpdateMethod="UpdateSupplier">
    <UpdateParameters>
        <asp:Parameter Name="companyName" Type="String" />
        <asp:Parameter Name="contactName" Type="String" />
        <asp:Parameter Name="contactTitle" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

다음으로 브라우저를 통해 이 페이지를 방문합니다. 그림 12에서 볼 수 있듯이 각 공급자는 열이 포함된 FullContactName 표에 나열됩니다. 이 열 값은 단순히 (ContactTitle, CompanyName)로 ContactName 형식이 지정된 다른 세 열의 연결입니다.

각 공급업체는 그리드에 나열됩니다.

그림 12: 각 공급업체가 그리드에 나열됨(전체 크기 이미지를 보려면 클릭)

특정 공급자에 대한 편집 단추를 클릭하면 포스트백이 발생하고 해당 행이 편집 인터페이스에서 렌더링됩니다(그림 13 참조). 처음 세 열은 기본 편집 인터페이스에서 렌더링됩니다. 속성이 Text 데이터 필드 값으로 설정된 TextBox 컨트롤입니다. 그러나 열은 FullContactName 텍스트로 유지됩니다. 데이터 원본 구성 마법사 FullContactName 가 완료될 때 BoundFields가 GridView에 추가되었을 때 해당 열 SuppliersDataTableReadOnly 해당 속성이 설정되어 있기 때문에 FullContactName BoundField 속성이 ReadOnly 설정 true true되었습니다. 4 FullContactName 단계에서 설명한 것처럼 TableAdapter에서 열이 계산 열임을 감지했기 때문에 해당 ReadOnly 속성이 설정 true 되었습니다.

FullContactName 열은 편집할 수 없습니다.

그림 13: FullContactName 열을 편집할 수 없음(전체 크기 이미지를 보려면 클릭)

계속 진행하여 하나 이상의 편집 가능한 열 값을 업데이트하고 업데이트를 클릭합니다. 변경 사항을 FullContactName 반영하도록 값이 자동으로 업데이트되는 방식을 확인합니다.

참고 항목

GridView는 현재 편집 가능한 필드에 BoundFields를 사용하므로 기본 편집 인터페이스가 생성됩니다. 필드가 CompanyName 필요하므로 RequiredFieldValidator를 포함하는 TemplateField로 변환해야 합니다. 나는 관심있는 독자를위한 운동으로 이것을 둡니다. BoundField를 TemplateField로 변환하고 유효성 검사 컨트롤을 추가하는 방법에 대한 단계별 지침은 편집 및 삽입 인터페이스에 유효성 검사 컨트롤 추가 자습서를 참조하세요.

요약

테이블에 대한 스키마를 정의할 때 Microsoft SQL Server는 계산 열을 포함할 수 있습니다. 일반적으로 동일한 레코드에 있는 다른 열의 값을 참조하는 식에서 값을 계산하는 열입니다. 계산 열의 값은 식을 기반으로 하므로 읽기 전용이며 또는 UPDATE 문에 INSERT 값을 할당할 수 없습니다. 이렇게 하면 해당 INSERTUPDATEDELETE 및 문을 자동으로 생성하려고 하는 TableAdapter의 기본 쿼리에서 계산 열을 사용할 때 문제가 발생합니다.

이 자습서에서는 계산 열에서 제기되는 문제를 우회하기 위한 기술에 대해 설명했습니다. 특히 TableAdapter의 저장 프로시저를 사용하여 임시 SQL 문을 사용하는 TableAdapters에 내재된 취약성을 극복했습니다. TableAdapter 마법사에서 새 저장 프로시저를 만들도록 하는 경우 기본 쿼리가 있는 경우 데이터 수정 저장 프로시저가 생성되지 않도록 하기 때문에 처음에는 계산된 열을 생략하는 것이 중요합니다. TableAdapter를 처음 구성 SelectCommand 한 후에는 계산된 열을 포함하도록 저장 프로시저를 재정비할 수 있습니다.

행복한 프로그래밍!

작성자 정보

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

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 힐튼 가이세나우와 테레사 머피였습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 선을 놓습니다 mitchell@4GuysFromRolla.com.