逐步解說:使用時間戳記搭配 LinqDataSource 控制項檢查資料完整性
更新:2007 年 11 月
在此逐步解說中,您將了解如何利用 LinqDataSource 控制項,在更新資料時使用時間戳記來檢查資料衝突。LinqDataSource 控制項會將時間戳記值儲存在 Web 網頁中。當使用者更新或刪除資料時,LinqDataSource 控制項便會根據資料庫中目前的時間戳記值檢查該資料的時間戳記值。如果 LinqDataSource 控制項偵測到時間戳記資料行中的值已經變更,控制項就不會更新或刪除記錄。在這種情況下,表示該記錄已被其他處理流程變更過了。LinqDataSource 控制項會改為引發例外狀況,指出記錄已經變更。
每次修改記錄時,SQL Server 都會自動更新時間戳記資料行。如需詳細資訊,請參閱時間戳記 (Transact-SQL)。在實體類別中,將 IsVersion 屬性設定為 true 即可標記時間戳記資料行。
如果您未使用時間戳記資料行,LinqDataSource 控制項會將值儲存在 Web 網頁上以檢查資料並行性。組成並行值的資料行可用來做為資料表的主索引鍵,或者在 ColumnAttribute 屬性 (Attribute) 的 UpdateCheck 屬性 (Property) 中標記為 UpdateCheck.Always 或 UpdateCheck.WhenUpdated。LINQ to SQL 在更新或刪除資料之前,會根據資料庫檢查那些值。如果資料錄包含許多資料行或很大的資料行值,這種方法便會建立大型的 Web 網頁。如果記錄中包含您不想在頁面上公開的資料,它也會顯示安全性風險。
您將會使用物件關聯式設計工具來建立類別,該類別表示資料庫資料表。LinqDataSource 控制項會與這個產生的類別互動,以擷取、更新、插入和刪除資料。
必要條件
若要在自己的開發環境中實作這些程序,您需要:
Visual Web Developer Express 版或 Visual Studio 2008。
在電腦上安裝 SQL Server Express Edition。如果已經安裝 SQL Server,則只需稍微調整某些程序,您就可以改用 SQL Server。
ASP.NET 網站。
建立資料庫資料表
若要執行這個逐步解說的步驟,您必須有包含時間戳記資料行的資料庫資料表。如果您還沒有那樣的資枓表,可以使用下列步驟來建立資料表。如果使用現有的資料表,則有些程序的步驟不會完全符合您的資料庫。不過,逐步解說中所描述的概念都一樣。
建立具有時間戳記資料行的資料庫資料表
如果網站沒有 App_Data 資枓夾,請以滑鼠右鍵按一下 [方案總管] 中的專案,然後按一下 [加入 ASP.NET 資料夾],再按一下 [App_Data]。
以滑鼠右鍵按一下 [App_Data] 資料夾,然後按一下 [加入新項目]。
選取 [已安裝的範本] 底下的 [SQL 資料庫],將檔案名稱變更為 Reviews.mdf,然後按一下 [加入]。
在 [伺服器總管] 中,開啟 [Reviews.mdf] 節點,然後以滑鼠右鍵按一下 [資料表] 資料夾。
按一下 [加入新的資料表]。
在資料表中建立下列資料行:
資料行名稱
資料型別
屬性
BookID
int
IsIdentity = Yes
Not null
Primary Key
Title
nvarchar(50)
Author
nvarchar(50)
RecommendToBookGroup
bit
Not null
Review
nvarchar(1000)
Timestamp
timestamp
Not null
儲存資料表,並將其命名為 BookReviews。
使用範例資料將多筆資料錄加入至 BookReviews 資料表。
在 [伺服器總管] 中,以滑鼠右鍵按一下 [BookReviews] 資料表,然後按一下 [顯示資料表資料]。您不需要指定 [BookID] 或 [時間戳記] 的值,因為資料庫會產生這些值。
建立類別以代表資料庫實體
若要使用 LinqDataSource 控制項,請使用代表資料庫實體的類別。您可以使用 Visual Web Developer Express 版或 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 Web 網頁上的 LinqDataSource 控制項來管理要顯示及更新的資料。
建立和設定 LinqDataSource 控制項
在 Visual Studio 中建立新的 ASP.NET Web 網頁,並切換至 [原始碼] 檢視。
從 [工具箱] 的 [資料] 索引標籤中,將 LinqDataSource 控制項拖放至 Web 網頁的 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] 和 [時間戳記] 資料行。使用者無法變更它們的值。
儲存您所作的變更。
按 CTRL+F5 在瀏覽器中檢視頁面。
DetailsView 控制項會顯示 BookReviews 資料表中目前記錄的資料行。
關閉瀏覽器。
檢查資料衝突
當資料變更時,若要查看時間戳記資料行如何阻止進行變更,您可以執行一項測試。您將在 Web 網頁中選取一筆要更新的記錄,但在 Web 網頁之外變更該筆記錄。當您透過 Web 網頁送出變更時,LinqDataSource 控制項將會封鎖更新。
測試資料完整性
按 CTRL+F5 在瀏覽器中檢視頁面。
選取一筆記錄,然後按一下 [編輯] 連結。還不要更新記錄。
在 [伺服器總管] 中,以滑鼠右鍵按一下 [BookReviews] 資料表,然後按一下 [顯示資料表資料]。
變更您已在 Web 瀏覽器中開啟之同一筆記錄的值。
關閉視窗以將變更寫入資料庫。
儲存變更時,SQL Server 會自動更新記錄的時間戳記資料行。
在 Web 瀏覽器中,變更記錄中要更新的值。
按一下 [更新] 連結。
您將會看到一則錯誤訊息,說明該列已變更。頁面中所儲存的時間戳記與資料庫中記錄的時間戳記不相符。
如果您想在此錯誤出現時採取行動,您可以建立 Updating 事件的處理常式。
後續步驟
在本逐步解說中,您已了解如何在使用 LinqDataSource 控制項時最佳化資料完整性檢查。您也能以下列方式善用 LinqDataSource 控制項的能力:
建立事件處理常式,以處理在資料已變更時引發的例外狀況。如需詳細資訊,請參閱 Updating 或 Deleting 事件。
篩選要傳回的資料記錄。如未指定 Select 屬性的值,LinqDataSource 控制項便會擷取資料庫資料表中的所有資料行。當您未在 DetailsView 控制項中顯示所有資料行時,您可能會想選取一部分資料行。如需詳細資訊,請參閱逐步解說:使用 LinqDataSource 和 GridView 控制項選取和篩選資料子集。
分組資料和彙總值,例如尋找資料行值的總和或平均欄值。如需詳細資訊,請參閱 HOW TO:使用 LinqDataSource 控制項分組和彙總資料。