계산 열 작업(C#)

작성자 : Scott Mitchell

PDF 다운로드

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

소개

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

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

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

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

시작해 보겠습니다!

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

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

먼저 서버 Explorer 테이블을 마우스 오른쪽 단추로 클릭하고 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 는 이 instance 작동하지만 명령문의 CASE 유연성을 로 일치ISNULL시킬 수 없는 더 복잡한 시나리오가 있습니다.

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

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

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

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

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

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

Microsoft SQL Server 계산 열에 대한 자세한 내용은 기술 설명서를 참조하세요. 또한 방법: 계산 열을 만드는 단계별 연습을 위해 계산 열 지정을 검사.

참고

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

2단계: 계산 열 값 보기

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

그림 2와 같이 결과에는 ldquoContactName; (ContactTitle, CompanyName) 형식을 사용하는 , ContactNameContactTitle 열이 나열되는 가 포함FullContactNameCompanyName됩니다.

FullContactName은 ContactName 형식을 사용합니다(ContactTitle, CompanyName).

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

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

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

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

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

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

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

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

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

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

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

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

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

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

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

GetData 메서드의 이름을 GetSuppliers로 바꿉니다.

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

마침을 클릭하면 마법사에서 4개의 저장 프로시저를 만들고 TableAdapter 및 해당 DataTable을 형식화된 데이터 세트에 추가합니다.

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

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

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

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

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

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

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

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

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

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

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

그림 7: 열이 FullContactName Read-Only 표시됨(전체 크기 이미지를 보려면 클릭)

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

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

데이터 세트 디자인에서 를 마우스 오른쪽 단추로 클릭하고 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에 사용할 데이터 액세스 패턴 및 메서드 이름을 묻는 메시지를 표시합니다. 두 확인란을 모두 선택된 상태로 두고 및 메서드의 FillBy 이름을 각각 및 GetSupplierBySupplierIDGetDataByFillBySupplierID 바꿉니다.

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

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

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

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

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

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

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

참고

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

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

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

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

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

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

데이터 원본 구성 마법사가 완료되면 Visual Studio는 반환된 각 데이터 필드에 대한 BoundField를 추가합니다. BoundField를 SupplierID 제거하고 , , ContactNameContactTitleFullContactName 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에 추가되었을 때 의 해당 FullContactName 열에 SuppliersDataTable 속성이 로 설정되어 있으므로 BoundField ReadOnly 속성이 ReadOnlytrue설정 true 되었습니다. 4 FullContactName 단계에서 설명한 것처럼 TableAdapter에서 열이 계산 열임을 감지했기 때문에 의 ReadOnly 속성이 로 설정 true 되었습니다.

FullContactName 열을 편집할 수 없음

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

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

참고

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

요약

테이블에 대한 스키마를 정의할 때 Microsoft SQL Server 계산 열을 포함할 수 있습니다. 일반적으로 동일한 레코드에 있는 다른 열의 값을 참조하는 식에서 값을 계산하는 열입니다. 계산 열의 값은 식을 기반으로 하므로 읽기 전용이며 또는 UPDATE 문의 값을 INSERT 할당할 수 없습니다. 그러면 해당 INSERT, UPDATEDELETE 문을 자동으로 생성하려고 시도하는 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.