연습: LinqDataSource 컨트롤에서 타임스탬프를 사용하여 데이터 무결성 검사
업데이트: 2007년 11월
이 연습에서는 LinqDataSource 컨트롤을 사용하여 데이터를 업데이트할 때 타임스탬프를 사용하여 데이터 충돌을 검사하는 방법을 배웁니다. LinqDataSource 컨트롤은 웹 페이지에 타임스탬프 값을 저장합니다. 사용자가 데이터를 업데이트하거나 삭제할 때 LinqDataSource 컨트롤은 데이터베이스의 현재 타임스탬프 값과 비교하여 타임스탬프 값을 검사합니다. LinqDataSource 컨트롤에서 타임스탬프 열의 값이 변경되었음을 감지하면 레코드를 업데이트하거나 삭제하지 않습니다. 이 경우 다른 프로세스에서 레코드를 변경한 것입니다. 대신 LinqDataSource 컨트롤이 레코드가 변경되었음을 나타내는 예외를 발생시킵니다.
레코드가 수정될 때마다 타임스탬프 열이 SQL Server에 의해 자동으로 업데이트됩니다. 자세한 내용은 Timestamp (Transact-SQL)를 참조하십시오. 엔터티 클래스에서 타임스탬프 열은 IsVersion 속성을 true로 설정하여 표시됩니다.
타임스탬프 열을 사용하지 않는 경우 LinqDataSource 컨트롤은 웹 페이지에 값을 저장하여 데이터 동시성을 검사합니다. 동시성 값은 테이블의 기본 키로 사용되거나 ColumnAttribute 특성의 UpdateCheck 속성에 있는 UpdateCheck.Always 또는 UpdateCheck.WhenUpdated로 표시되는 열로 구성됩니다. LINQ to SQL에서 데이터를 업데이트하거나 삭제하기 전에 데이터베이스와 비교하여 이러한 값을 검사합니다. 데이터 레코드에 많은 열이나 큰 열 값이 있는 경우 이 방법으로 큰 웹 페이지를 만들 수 있습니다. 또한 페이지에 표시하고 싶지 않은 데이터가 레코드에 있는 경우 보안 위험을 나타낼 수 있습니다.
개체 관계형 디자이너를 사용하여 데이터베이스 테이블을 나타내는 클래스를 만듭니다. LinqDataSource 컨트롤은 이렇게 생성된 클래스와 상호 작용하여 데이터를 검색, 업데이트, 삽입 및 삭제합니다.
사전 요구 사항
고유한 개발 환경에서 절차를 구현하려면 다음이 필요합니다.
Visual Web Developer Express Edition 또는 Visual Studio 2008
컴퓨터에 설치된 SQL Server Express Edition. SQL Server가 설치되어 있으면 대신 이를 사용할 수 있지만 일부 절차를 약간 수정해야 합니다.
ASP.NET 웹 사이트
데이터베이스 테이블 만들기
이 연습의 단계를 수행하려면 타임스탬프 열을 포함하는 데이터베이스 테이블이 있어야 합니다. 이러한 테이블이 아직 없는 경우 다음 절차의 단계를 수행하여 만들 수 있습니다. 기존 테이블을 사용하는 경우 일부 절차의 단계가 데이터베이스에 정확하게 맞지 않을 수 있습니다. 하지만 연습에 설명된 개념은 동일합니다.
타임스탬프 열이 있는 데이터베이스 테이블을 만들려면
웹 사이트에 아직 App_Data 폴더가 없는 경우 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 ASP.NET 폴더 추가를 클릭한 다음 App_Data를 클릭합니다.
App_Data 폴더를 마우스 오른쪽 단추로 클릭한 다음 새 항목 추가를 클릭합니다.
설치된 템플릿에서 SQL 데이터베이스를 선택하고 파일 이름을 Reviews.mdf로 변경한 다음 추가를 클릭합니다.
서버 탐색기에서 Reviews.mdf 노드를 연 다음 테이블 폴더를 마우스 오른쪽 단추로 클릭합니다.
새 테이블 추가를 클릭합니다.
테이블에 다음 열을 만듭니다.
열 이름
데이터 형식
속성
BookID
int
IsIdentity = Yes
Not null
기본 키
Title
nvarchar(50)
Author
nvarchar(50)
RecommendToBookGroup
bit
Not null
Review
nvarchar(1000)
Timestamp
timestamp
Not null
테이블을 저장하고 이름을 BookReviews로 지정합니다.
샘플 데이터를 사용하여 BookReviews 테이블에 레코드를 몇 개 추가합니다.
서버 탐색기에서 BookReviews 테이블을 마우스 오른쪽 단추로 클릭하고 테이블 데이터 표시를 클릭합니다. BookID 또는 Timestamp의 값은 데이터베이스에서 생성되므로 지정할 필요가 없습니다.
데이터베이스 엔터티를 나타내는 클래스 만들기
LinqDataSource 컨트롤을 사용하려면 데이터베이스 엔터티를 나타내는 클래스를 사용해야 합니다. Visual Web Developer Express Edition 또는 Visual Studio 2008의 도구를 사용하여 이러한 클래스를 만들 수 있습니다.
BookReviews 테이블에 대한 클래스를 만들려면
웹 사이트에 아직 App_Code 폴더가 없는 경우 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 ASP.NET 폴더 추가를 클릭한 다음 App_Code를 클릭합니다.
App_Code 폴더를 마우스 오른쪽 단추로 클릭한 다음 새 항목 추가를 클릭합니다.
설치된 템플릿에서 Linq to SQL 클래스를 선택하고 파일의 이름을 Reviews.dbml로 바꾼 다음 추가를 클릭합니다.
개체 관계형 디자이너 창이 표시됩니다.
서버 탐색기에서 BookReviews 테이블을 개체 관계형 디자이너 창으로 끌어 옵니다.
BookReviews 테이블과 해당 열은 디자이너 창에서 BookReview라는 엔터티로 나타납니다.
Reviews.dbml 파일을 저장합니다.
솔루션 탐색기에서 Reviews.designer.cs 또는 Reviews.designer.vb 파일을 엽니다.
이제 엔터티에 ReviewsDataContext와 BookReview라는 클래스가 있습니다. 모든 열에 대한 열 특성은 UpdateCheck=UpdateCheck.Never로 표시됩니다. 그러나 타임스탬프 열에 대한 열 특성은 IsVersion=true로 표시됩니다.
Reviews.dbml 파일을 닫습니다.
LinqDataSource 컨트롤 만들기 및 구성
이제 데이터베이스 엔터티를 나타내는 데이터베이스 테이블과 클래스가 있습니다. ASP.NET 웹 페이지의 LinqDataSource 컨트롤을 사용하여 표시하고 업데이트할 데이터를 관리할 수 있습니다.
LinqDataSource 컨트롤을 만들고 구성하려면
Visual Studio에서 새 ASP.NET 웹 페이지를 만들고 소스 뷰로 전환합니다.
도구 상자의 데이터 탭에서 LinqDataSource 컨트롤을 끌어 웹 페이지의 form 요소 안에 놓습니다.
ID 속성을 LinqDataSource1로 그대로 둘 수 있습니다.
ContextTypeName 속성을 ReviewsDataContext로 설정합니다.
TableName 속성을 BookReviews로 설정합니다.
EnableUpdate 및 EnableDelete 속성을 true로 설정합니다.
다음 예제에서는 LinqDataSource 컨트롤의 선언 코드를 보여 줍니다.
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="BookReviews" EnableUpdate="true" EnableDelete="true" ID="LinqDataSource1" > </asp:LinqDataSource>
컨트롤을 추가하여 데이터 표시 및 업데이트
이제 DetailsView 컨트롤을 추가하고 이 컨트롤을 LinqDataSource 컨트롤에 바인딩할 수 있습니다. DetailsView 컨트롤을 사용하여 사용자는 LinqDataSource 컨트롤에서 관리하는 데이터를 표시하고 업데이트할 수 있습니다.
DetailsView 컨트롤을 LinqDataSource 컨트롤의 데이터에 바인딩하려면
도구 상자의 데이터 탭에서 DetailsView 컨트롤을 두 번 클릭하여 페이지에 추가합니다.
ID 속성을 DetailsView1로 그대로 둘 수 있습니다.
DataSourceID 속성을 LinqDataSource1로 설정합니다.
DataKeyNames 속성을 BookID로 설정합니다.
DetailsView 컨트롤을 사용하여 데이터를 업데이트하거나 삭제하려는 경우 DataKeyNames 속성을 설정해야 합니다.
AllowPaging 속성을 true로 설정합니다.
AutoGenerateEditButton 및 AutoGenerateDeleteButton 속성을 true로 설정합니다.
다음 예제에서는 선언 태그를 보여 줍니다.
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="BookID" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" AllowPaging="true" ID="DetailsView1" > </asp:DetailsView>
BookReviews 데이터베이스에서 BookID 열과 Timestamp 열은 데이터베이스에 의해 자동으로 설정됩니다. 사용자는 해당 값을 변경할 수 없습니다.
변경 사항을 저장합니다.
Ctrl+F5를 눌러 브라우저에서 페이지를 봅니다.
DetailsView 컨트롤은 BookReviews 테이블의 현재 레코드에 대한 열을 표시합니다.
브라우저를 닫습니다.
데이터 충돌 확인
데이터가 변경될 때 타임스탬프 열에서 어떻게 업데이트를 방지하는지 알아 보기 위해 테스트를 수행할 수 있습니다. 웹 페이지에서 업데이트할 레코드를 선택하지만 웹 페이지 외부에 있는 동일한 레코드를 변경합니다. 웹 페이지를 통해 업데이트를 전송하면 LinqDataSource 컨트롤이 업데이트를 차단합니다.
데이터 무결성을 테스트하려면
Ctrl+F5를 눌러 브라우저에서 페이지를 봅니다.
레코드를 선택한 다음 편집 링크를 클릭합니다. 아직 레코드를 업데이트하지 마십시오.
서버 탐색기에서 BookReviews 테이블을 마우스 오른쪽 단추로 클릭하고 테이블 데이터 표시를 클릭합니다.
웹 브라우저에서 연 동일한 레코드의 값을 변경합니다.
창을 닫고 데이터베이스에 대한 변경 내용을 기록합니다.
변경 내용이 저장되면 레코드에 대한 타임스탬프 열이 SQL Server에 의해 자동으로 업데이트됩니다.
웹 브라우저에서 업데이트할 레코드의 값을 변경합니다.
업데이트 링크를 클릭합니다.
행이 변경되었음을 나타내는 오류 메시지가 표시됩니다. 페이지에 저장된 타임스탬프가 데이터베이스에 있는 레코드의 타임스탬프와 일치하지 않습니다.
이 오류가 표시될 때 작업을 수행하려는 경우 Updating 이벤트에 대한 처리기를 만들 수 있습니다.
다음 단계
이 연습에서는 LinqDataSource 컨트롤을 사용할 때 데이터 무결성 검사를 최적화하는 방법을 배웠습니다. 다음과 같은 방법으로 LinqDataSource 컨트롤의 기능을 추가로 이용할 수 있습니다.
데이터가 변경되었을 때 발생한 예외를 처리하는 이벤트 처리기 만들기. 자세한 내용은 Updating 또는 Deleting 이벤트를 참조하십시오.
반환되는 데이터 레코드 필터링. Select 속성에 대해 값을 지정하지 않으면 LinqDataSource 컨트롤은 데이터베이스 테이블에서 모든 열을 검색합니다. DetailsView 컨트롤에 모든 열을 표시하지 않으려는 경우 열의 하위 집합을 선택할 수도 있습니다. 자세한 내용은 연습: LinqDataSource 및 GridView 컨트롤을 사용하여 데이터의 하위 집합 선택 및 필터링을 참조하십시오.
데이터 그룹화 및 값 집계(예: 열 값의 합 또는 평균 찾기). 자세한 내용은 방법: LinqDataSource 컨트롤을 사용하여 데이터 그룹화 및 집계를 참조하십시오.