계산 열 작업(C#)
작성자 : Scott Mitchell
데이터베이스 테이블을 만들 때 Microsoft SQL Server 일반적으로 동일한 데이터베이스 레코드의 다른 값을 참조하는 식에서 값을 계산하는 계산 열을 정의할 수 있습니다. 이러한 값은 데이터베이스에서 읽기 전용이며 TableAdapters로 작업할 때 특별한 고려 사항이 필요합니다. 이 자습서에서는 계산 열로 인해 발생한 문제를 해결하는 방법을 알아봅니다.
소개
Microsoft SQL Server 계산 열을 허용합니다. 이 열은 일반적으로 같은 테이블의 다른 열에서 값을 참조하는 식에서 값을 계산하는 열입니다. 예를 들어 시간 추적 데이터 모델에는 , , EmployeeID
Rate
및 Duration
등의 열ServicePerformed
이 있는 테이블 ServiceLog
이 있을 수 있습니다. 서비스 항목당 기한(기간을 곱한 속도)은 웹 페이지 또는 다른 프로그래밍 인터페이스를 통해 계산할 수 있지만 이 정보를 보고한 라는 AmountDue
열을 ServiceLog
테이블에 포함하는 것이 편리할 수 있습니다. 이 열은 일반 열로 만들 수 있지만 또는 Duration
열 값이 Rate
변경될 때마다 업데이트해야 합니다. 더 나은 방법은 식을 Rate * Duration
사용하여 열을 계산 열로 만드는 AmountDue
것입니다. 이렇게 하면 SQL Server 쿼리에서 참조될 때마다 열 값을 자동으로 계산 AmountDue
합니다.
계산 열의 값은 식에 의해 결정되므로 이러한 열은 읽기 전용이므로 또는 UPDATE
문에 INSERT
할당된 값을 가질 수 없습니다. 그러나 계산 열이 임시 SQL 문을 사용하는 TableAdapter에 대한 기본 쿼리의 일부인 경우 자동 생성 INSERT
및 UPDATE
문에 자동으로 포함됩니다. 따라서 계산된 열에 대한 참조를 제거하려면 TableAdapter INSERT
UPDATE
및 쿼리 및 InsertCommand
UpdateCommand
속성이 업데이트되어야 합니다.
임시 SQL 문을 사용하는 TableAdapter에서 계산 열을 사용하는 한 가지 과제는 TableAdapter 구성 마법사가 완료될 때마다 TableAdapter INSERT
및 UPDATE
쿼리가 자동으로 다시 생성된다는 것입니다. 따라서 에서 수동으로 제거된 계산 열 INSERT
과 UPDATE
마법사를 다시 실행하면 쿼리가 다시 나타납니다. 저장 프로시저를 사용하는 TableAdapters는 이러한 취약성으로 인해 어려움을 겪지 않지만 3단계에서 해결할 고유한 단점이 있습니다.
이 자습서에서는 Northwind 데이터베이스의 Suppliers
테이블에 계산 열을 추가한 다음 해당 TableAdapter를 만들어 이 테이블 및 해당 계산 열을 사용합니다. TableAdapter 구성 마법사를 사용할 때 사용자 지정이 손실되지 않도록 임시 SQL 문 대신 TableAdapter에서 저장 프로시저를 사용합니다.
시작해 보겠습니다!
1단계: 테이블에 계산 열Suppliers
추가
Northwind 데이터베이스에는 계산 열이 없으므로 직접 추가해야 합니다. 이 자습서에서는 연락처 이름, 제목 및 해당 사용자가 근무하는 회사를 반환하는 라는 FullContactName
테이블에 계산 열을 Suppliers
(, CompanyName
)로 ContactName
ContactTitle
추가해 보겠습니다. 이 계산 열은 공급자에 대한 정보를 표시할 때 보고서에 사용될 수 있습니다.
먼저 서버 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의 스크린샷과 같아야 합니다.
그림 1: 테이블에 명명 FullContactName
Suppliers
된 계산 열 추가(전체 크기 이미지를 보려면 클릭)
계산 열의 이름을 지정하고 식을 입력한 후 도구 모음에서 저장 아이콘을 클릭하거나 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
, ContactTitle
및 FullContactName
열을 검사CompanyName
. 마지막으로 도구 모음에서 빨간색 느낌표 아이콘을 클릭하여 쿼리를 실행하고 결과를 확인합니다.
그림 2와 같이 결과에는 ldquoContactName
; (ContactTitle
, CompanyName
) 형식을 사용하는 , ContactName
및 ContactTitle
열이 나열되는 가 포함FullContactName
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 구성 마법사가 시작됩니다. 에서 데이터를 쿼리할 데이터베이스를NORTHWNDConnectionString
Web.config
지정하고 다음을 클릭합니다. 테이블을 쿼리하거나 수정하기 Suppliers
위한 저장 프로시저를 아직 만들지 않았으므로 마법사에서 만들도록 새 저장 프로시저 만들기 옵션을 선택하고 다음을 클릭합니다.
그림 3: 새 저장 프로시저 만들기 옵션 선택(전체 크기 이미지를 보려면 클릭)
후속 단계에서는 기본 쿼리를 묻는 메시지를 표시합니다. 각 공급자에 대해 , , CompanyName
ContactName
및 ContactTitle
열을 반환SupplierID
하는 다음 쿼리를 입력합니다. 이 쿼리는 의도적으로 계산 열()FullContactName
을 생략합니다. 4단계에서 이 열을 포함하도록 해당 저장 프로시저를 업데이트합니다.
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
기본 쿼리를 입력하고 다음을 클릭하면 마법사에서 생성할 4개의 저장 프로시저의 이름을 지정할 수 있습니다. 그림 4와 Suppliers_Select
같이 이러한 저장 프로시저의 이름을 , Suppliers_Insert
Suppliers_Update
, 및 Suppliers_Delete
로 지정합니다.
그림 4: 자동 생성된 저장 프로시저의 이름 사용자 지정(전체 크기 이미지를 보려면 클릭)
다음 마법사 단계에서는 TableAdapter 메서드의 이름을 지정하고 데이터에 액세스하고 업데이트하는 데 사용되는 패턴을 지정할 수 있습니다. 세 개의 확인란을 모두 선택된 상태로 두고 메서드 GetSuppliers
이름을 로 GetData
바꿉니다. 마침을 클릭하여 마법사를 완료합니다.
그림 5: 메서드 이름을 GetData
로 GetSuppliers
바꿉니다(전체 크기 이미지를 보려면 클릭).
마침을 클릭하면 마법사에서 4개의 저장 프로시저를 만들고 TableAdapter 및 해당 DataTable을 형식화된 데이터 세트에 추가합니다.
4단계: TableAdapter의 기본 쿼리에 계산 열 포함
이제 계산 열을 포함하도록 3단계에서 만든 TableAdapter 및 DataTable을 FullContactName
업데이트해야 합니다. 여기에는 다음 두 단계가 포함됩니다.
- 계산 열을
Suppliers_Select
반환FullContactName
하도록 저장 프로시저 업데이트 및 - 해당
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
열이 포함됩니다.
그림 6: TableAdapter 구성 마법사를 실행하여 DataTable의 열을 업데이트합니다(전체 크기 이미지를 보려면 클릭).
마침을 클릭하여 마법사를 완료합니다. 그러면 해당 열 SuppliersDataTable
이 에 자동으로 추가됩니다. TableAdapter 마법사는 열이 계산 열이므로 읽기 전용임을 FullContactName
감지할 수 있을 만큼 스마트합니다. 따라서 열의 ReadOnly
속성을 true
로 설정합니다. 이를 확인하려면 에서 SuppliersDataTable
열을 선택한 다음 속성 창 이동합니다(그림 7 참조). FullContactName
열 및 DataType
MaxLength
속성도 그에 따라 설정됩니다.
그림 7: 열이 FullContactName
Read-Only 표시됨(전체 크기 이미지를 보려면 클릭)
5단계: TableAdapter에 메서드 추가GetSupplierBySupplierID
이 자습서에서는 업데이트 가능한 그리드에 공급자를 표시하는 ASP.NET 페이지를 만듭니다. 이전 자습서에서는 DAL에서 해당 특정 레코드를 강력한 형식의 DataTable로 검색하고, 해당 속성을 업데이트한 다음, 업데이트된 DataTable을 DAL로 다시 보내 변경 내용을 데이터베이스에 전파함으로써 비즈니스 논리 계층에서 단일 레코드를 업데이트했습니다. DAL에서 업데이트되는 레코드를 검색하는 이 첫 번째 단계를 수행하려면 먼저 DAL에 메서드를 GetSupplierBySupplierID(supplierID)
추가해야 합니다.
데이터 세트 디자인에서 를 마우스 오른쪽 단추로 클릭하고 SuppliersTableAdapter
상황에 맞는 메뉴에서 쿼리 추가 옵션을 선택합니다. 3단계에서 수행한 것처럼 새 저장 프로시저 만들기 옵션을 선택하여 마법사에서 새 저장 프로시저를 생성하도록 합니다(이 마법사 단계의 스크린샷은 그림 3 참조). 이 메서드는 여러 열이 있는 레코드를 반환하므로 행을 반환하는 SELECT인 SQL 쿼리를 사용하려고 함을 나타내고 다음을 클릭합니다.
그림 8: 행을 반환하는 SELECT 옵션 선택(전체 크기 이미지를 보려면 클릭)
후속 단계에서는 이 메서드에 사용할 쿼리를 묻는 메시지를 표시합니다. 기본 쿼리와 동일한 데이터 필드를 반환하지만 특정 공급자에 대해 반환하는 다음을 입력합니다.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
다음 화면에서는 자동 생성될 저장 프로시저의 이름을 지정하도록 요청합니다. 이 저장 프로시저 Suppliers_SelectBySupplierID
의 이름을 지정하고 다음을 클릭합니다.
그림 9: 저장 프로시저 Suppliers_SelectBySupplierID
이름 지정(전체 크기 이미지를 보려면 클릭)
마지막으로, 마법사는 TableAdapter에 사용할 데이터 액세스 패턴 및 메서드 이름을 묻는 메시지를 표시합니다. 두 확인란을 모두 선택된 상태로 두고 및 메서드의 FillBy
이름을 각각 및 GetSupplierBySupplierID
GetDataBy
로 FillBySupplierID
바꿉니다.
그림 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
마찬가지로 에는Adapter
protected
및 의 두 public
메서드 GetSuppliers
UpdateSupplier
와 함께 클래스의 SuppliersTableAdapter
instance 반환하는 속성이 있습니다. 메서드는 GetSuppliers
데이터 액세스 계층의 SuppliersDataTable
해당 GetSupplier
메서드에서 반환된 를 호출하고 반환합니다. 메서드는 UpdateSupplier
DAL 메서드 GetSupplierBySupplierID(supplierID)
호출을 통해 업데이트되는 특정 공급자에 대한 정보를 검색합니다. 그런 다음 , ContactName
및 속성을 업데이트CategoryName
하고 ContactTitle
수정된 SuppliersRow
개체를 전달하여 데이터 액세스 계층의 Update
메서드를 호출하여 이러한 변경 내용을 데이터베이스에 커밋합니다.
참고
및 CompanyName
를 SupplierID
제외하고 Suppliers 테이블의 모든 열은 값을 허용 NULL
합니다. 따라서 전달된 contactName
매개 변수 또는 contactTitle
매개 변수인 null
경우 각각 및 SetContactTitleNull
메서드를 사용하여 해당 ContactName
및 ContactTitle
속성을 NULL
데이터베이스 값으로 SetContactNameNull
설정해야 합니다.
7단계: 프레젠테이션 계층에서 계산 열 작업
계산 열이 테이블에 추가 Suppliers
되고 DAL 및 BLL이 그에 따라 업데이트되면 계산 열과 함께 FullContactName
작동하는 ASP.NET 페이지를 빌드할 준비가 된 것입니다. 먼저 폴더에서 ComputedColumns.aspx
AdvancedDAL
페이지를 열고 도구 상자에서 Designer GridView를 끌어옵니다. GridView 속성을 ID
Suppliers
로 설정하고 스마트 태그에서 라는 SuppliersDataSource
새 ObjectDataSource에 바인딩합니다. 6단계에서 다시 추가한 클래스를 SuppliersBLLWithSprocs
사용하도록 ObjectDataSource를 구성하고 다음을 클릭합니다.
그림 11: 클래스를 사용하도록 SuppliersBLLWithSprocs
ObjectDataSource 구성(전체 크기 이미지를 보려면 클릭)
클래스 GetSuppliers
에는 및 UpdateSupplier
라는 두 가지 메서드만 정의되어 SuppliersBLLWithSprocs
있습니다. 이러한 두 메서드가 각각 SELECT 및 UPDATE 탭에 지정되어 있는지 확인하고 마침을 클릭하여 ObjectDataSource의 구성을 완료합니다.
데이터 원본 구성 마법사가 완료되면 Visual Studio는 반환된 각 데이터 필드에 대한 BoundField를 추가합니다. BoundField를 SupplierID
제거하고 , , ContactName
ContactTitle
및 FullContactName
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
속성이 ReadOnly
로 true
설정 true
되었습니다. 4 FullContactName
단계에서 설명한 것처럼 TableAdapter에서 열이 계산 열임을 감지했기 때문에 의 ReadOnly
속성이 로 설정 true
되었습니다.
그림 13: FullContactName
열을 편집할 수 없음(전체 크기 이미지를 보려면 클릭)
계속 진행하여 하나 이상의 편집 가능한 열 값을 업데이트하고 업데이트를 클릭합니다. 변경 사항을 FullContactName
반영하도록 값이 자동으로 업데이트되는 방식을 확인합니다.
참고
GridView는 현재 편집 가능한 필드에 BoundFields를 사용하므로 기본 편집 인터페이스가 생성됩니다. 필드가 CompanyName
필요하므로 RequiredFieldValidator를 포함하는 TemplateField로 변환해야 합니다. 나는 관심있는 독자를위한 운동으로 이것을 떠난다. BoundField를 TemplateField 로 변환하고 유효성 검사 컨트롤을 추가하는 방법에 대한 단계별 지침은 편집 및 인터페이스 삽입 자습서에 유효성 검사 컨트롤 추가 자습서를 참조하세요.
요약
테이블에 대한 스키마를 정의할 때 Microsoft SQL Server 계산 열을 포함할 수 있습니다. 일반적으로 동일한 레코드에 있는 다른 열의 값을 참조하는 식에서 값을 계산하는 열입니다. 계산 열의 값은 식을 기반으로 하므로 읽기 전용이며 또는 UPDATE
문의 값을 INSERT
할당할 수 없습니다. 그러면 해당 INSERT
, UPDATE
및 DELETE
문을 자동으로 생성하려고 시도하는 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.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기