계산 열 작업(VB)
로 스콧 미첼
데이터베이스 테이블을 만들 때 Microsoft SQL Server를 사용하면 일반적으로 동일한 데이터베이스 레코드의 다른 값을 참조하는 식에서 값을 계산하는 계산 열을 정의할 수 있습니다. 이러한 값은 데이터베이스에서 읽기 전용이므로 TableAdapters를 사용할 때 특별한 고려 사항이 필요합니다. 이 자습서에서는 계산 열에 의해 제기되는 문제를 해결하는 방법을 알아봅니다.
소개
Microsoft SQL Server를 사용하면 일반적으로 같은 테이블의 다른 열에서 값을 참조하는 식에서 값을 계산하는 열인 계산 열을 사용할 수 있습니다. 예를 들어 시간 추적 데이터 모델에는 열이 포함된 테이블이 ServiceLog
Rate
ServicePerformed
EmployeeID
Duration
있을 수 있습니다. 서비스 항목당 기한 금액(기간과 곱한 속도)은 웹 페이지 또는 기타 프로그래밍 인터페이스를 통해 계산할 수 있지만 이 정보를 보고한 테이블의 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 구성 마법사를 사용할 때 사용자 지정이 손실되지 않도록 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의 스크린샷과 같아야 합니다.
그림 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 테이블에서 , ContactTitle
ContactName
및 FullContactName
열을 확인CompanyName
합니다. 마지막으로 도구 모음에서 빨간색 느낌표 아이콘을 클릭하여 쿼리를 실행하고 결과를 봅니다.
그림 2와 같이 결과에는 형식(, )을 사용하는 열 및 ContactTitle
열이 나열CompanyName
ContactName
됩니다. CompanyName
ContactTitle
ContactName
FullContactName
그림 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
, 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을 Typed DataSet에 추가합니다.
4단계: TableAdapter의 기본 쿼리에 계산 열 포함
이제 계산 열을 포함하도록 3단계에서 만든 TableAdapter 및 DataTable을 FullContactName
업데이트해야 합니다. 여기에는 다음 두 단계가 포함됩니다.
- 계산 열을 반환
FullContactName
하도록 저장 프로시저 업데이트Suppliers_Select
및 - 해당
FullContactName
열을 포함하도록 DataTable을 업데이트합니다.
먼저 서버 탐색기로 이동하여 저장 프로시저 폴더로 드릴다운합니다. 저장 프로시저를 Suppliers_Select
열고 계산 열을 포함하도록 쿼리를 FullContactName
업데이트 SELECT
합니다.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
도구 모음에서 저장 아이콘을 클릭하거나, Ctrl+S를 누르거나, 파일 메뉴에서 저장 옵션을 선택하여 저장 프로시저에 변경 내용을 저장 Suppliers_Select
합니다.
그런 다음, 데이터 세트 디자이너로 돌아가서 마우스 오른쪽 단추로 클릭하고 SuppliersTableAdapter
상황에 맞는 메뉴에서 구성을 선택합니다. 이제 열에 Suppliers_Select
데이터 열 컬렉션의 FullContactName
열이 포함됩니다.
그림 6: TableAdapter 구성 마법사를 실행하여 DataTable의 열을 업데이트합니다(전체 크기 이미지를 보려면 클릭).
마침을 클릭하여 마법사를 완료합니다. 그러면 해당 열이 자동으로 .에 SuppliersDataTable
추가됩니다. TableAdapter 마법사는 열이 계산 열이므로 읽기 전용임을 FullContactName
감지할 수 있을 만큼 스마트합니다. 따라서 열의 ReadOnly
속성을 true
.로 설정합니다. 이를 확인하려면 해당 열에서 SuppliersDataTable
열을 선택한 다음 속성 창 이동합니다(그림 7 참조). FullContactName
열 DataType
과 MaxLength
속성도 그에 따라 설정됩니다.
그림 7: FullContactName
열이 읽기 전용으로 표시됨(전체 크기 이미지를 보려면 클릭)
5단계: TableAdapter에 메서드 추가GetSupplierBySupplierID
이 자습서에서는 업데이트 가능한 그리드에 공급자를 표시하는 ASP.NET 페이지를 만듭니다. 이전 자습서에서는 DAL에서 해당 특정 레코드를 강력한 형식의 DataTable로 검색하고, 속성을 업데이트한 다음, 업데이트된 DataTable을 DAL로 다시 보내 변경 내용을 데이터베이스에 전파하여 비즈니스 논리 계층의 단일 레코드를 업데이트했습니다. DAL에서 업데이트되는 레코드를 검색하는 이 첫 번째 단계를 수행하려면 먼저 DAL에 메서드를 GetSupplierBySupplierID(supplierID)
추가해야 합니다.
DataSet 디자인에서 마우스 오른쪽 단추를 클릭하고 SuppliersTableAdapter
상황에 맞는 메뉴에서 쿼리 추가 옵션을 선택합니다. 3단계에서 수행한 것처럼 마법사에서 새 저장 프로시저 만들기 옵션을 선택하여 새 저장 프로시저를 생성하도록 합니다(이 마법사 단계의 스크린샷은 그림 3 참조). 이 메서드는 여러 열이 있는 레코드를 반환하므로 행을 반환하는 SELECT인 SQL 쿼리를 사용하고 다음을 클릭합니다.
그림 8: 행을 반환하는 SELECT 옵션 선택(전체 크기 이미지를 보려면 클릭)
후속 단계에서는 이 메서드에 사용할 쿼리를 묻는 메시지를 표시합니다. 주 쿼리와 동일한 데이터 필드를 반환하지만 특정 공급자에 대해 반환하는 다음을 입력합니다.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
다음 화면에서는 자동으로 생성될 저장 프로시저의 이름을 지정하도록 요청합니다. 이 저장 프로시저 Suppliers_SelectBySupplierID
의 이름을 지정하고 다음을 클릭합니다.
그림 9: 저장 프로시저 Suppliers_SelectBySupplierID
이름 지정(전체 크기 이미지를 보려면 클릭)
마지막으로, 마법사는 TableAdapter에 사용할 데이터 액세스 패턴 및 메서드 이름을 묻는 메시지를 표시합니다. 두 확인란을 모두 선택하지 않고 각각 이름과 GetDataBy
메서드 FillBySupplierID
GetSupplierBySupplierID
의 FillBy
이름을 바꿉니다.
그림 10: TableAdapter 메서드 FillBySupplierID
의 이름을 지정하고 GetSupplierBySupplierID
(전체 크기 이미지를 보려면 클릭)
마침을 클릭하여 마법사를 완료합니다.
6단계: 비즈니스 논리 계층 만들기
1단계에서 만든 계산 열을 사용하는 ASP.NET 페이지를 만들기 전에 먼저 BLL에 해당 메서드를 추가해야 합니다. 7단계에서 만들 ASP.NET 페이지에서는 사용자가 공급자를 보고 편집할 수 있습니다. 따라서 BLL은 최소한 모든 공급업체를 가져오는 방법과 특정 공급업체를 업데이트하는 방법을 제공해야 합니다.
폴더에 명명된 SuppliersBLLWithSprocs
~/App_Code/BLL
새 클래스 파일을 만들고 다음 코드를 추가합니다.
Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
Private _suppliersAdapter As SuppliersTableAdapter = Nothing
Protected ReadOnly Property Adapter() As SuppliersTableAdapter
Get
If _suppliersAdapter Is Nothing Then
_suppliersAdapter = New SuppliersTableAdapter()
End If
Return _suppliersAdapter
End Get
End Property
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Select, True)> _
Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
Return Adapter.GetSuppliers()
End Function
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateSupplier(companyName As String, contactName As String, _
contactTitle As String, supplierID As Integer) As Boolean
Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
Adapter.GetSupplierBySupplierID(supplierID)
If suppliers.Count = 0 Then
' no matching record found, return false
Return False
End If
Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
supplier.CompanyName = companyName
If contactName Is Nothing Then
supplier.SetContactNameNull()
Else
supplier.ContactName = contactName
End If
If contactTitle Is Nothing Then
supplier.SetContactTitleNull()
Else
supplier.ContactTitle = contactTitle
End If
' Update the product record
Dim rowsAffected As Integer = Adapter.Update(supplier)
' Return true if precisely one row was updated, otherwise false
Return rowsAffected = 1
End Function
End Class
다른 BLL 클래스와 SuppliersBLLWithSprocs
Protected
Adapter
마찬가지로 두 가지 Public
메서드 GetSuppliers
와 함께 클래스의 인스턴스를 SuppliersTableAdapter
반환하는 속성이 있습니다.UpdateSupplier
이 메서드는 GetSuppliers
데이터 액세스 계층의 SuppliersDataTable
해당 GetSupplier
메서드에서 반환된 값을 호출하고 반환합니다. 이 메서드는 UpdateSupplier
DAL GetSupplierBySupplierID(supplierID)
메서드 호출을 통해 업데이트되는 특정 공급자에 대한 정보를 검색합니다. 그런 다음, ContactName
데이터 액세스 계층 메서드 Update
를 호출하고 수정된 SuppliersRow
개체를 전달하여 해당 변경 내용을 업데이트하고 ContactTitle
속성을 업데이트CategoryName
하고 데이터베이스에 커밋합니다.
참고 항목
SupplierID
CompanyName
Suppliers 테이블의 모든 열을 제외하고 값을 허용 NULL
합니다. 따라서 전달된 contactName
매개 변수 또는 contactTitle
매개 변수가 있는 Nothing
경우 각각 및 SetContactTitleNull
메서드를 사용하여 해당 ContactName
및 ContactTitle
속성을 NULL
데이터베이스 값으로 SetContactNameNull
설정해야 합니다.
7단계: 프레젠테이션 계층의 계산 열 작업
계산 열이 테이블에 추가 Suppliers
되고 DAL 및 BLL이 그에 따라 업데이트되면 계산 열과 함께 FullContactName
작동하는 ASP.NET 페이지를 빌드할 준비가 된 것입니다. 먼저 폴더에서 ComputedColumns.aspx
AdvancedDAL
페이지를 열고 도구 상자에서 디자이너로 GridView를 끕니다. GridView의 ID
속성을 Suppliers
스마트 태그로 설정하고 해당 속성을 새 ObjectDataSource에 SuppliersDataSource
바인딩합니다. 6단계에서 다시 추가한 클래스를 SuppliersBLLWithSprocs
사용하도록 ObjectDataSource를 구성하고 다음을 클릭합니다.
그림 11: 클래스를 사용하도록 SuppliersBLLWithSprocs
ObjectDataSource 구성(전체 크기 이미지를 보려면 클릭)
클래스 GetSuppliers
에는 두 가지 메서드만 정의 SuppliersBLLWithSprocs
되어 있습니다UpdateSupplier
. 이러한 두 메서드가 각각 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에 추가되었을 때 해당 열 SuppliersDataTable
에 ReadOnly
해당 속성이 설정되어 있기 때문에 FullContactName
BoundField 속성이 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.