摘要:[圖解] SqlDataSource 開放式並行存取 (Optimistic Concurrency),以GridView為例
完整說明,還是以 msdn官方網站為主。
開放式並行存取
Optimistic Concurrency
===================================================================
我錄製好的教學影片:
===================================================================
其實每個人都可以自己實驗出來
首先,開啟 SqlDataSource的「進階」按鈕,並啟動「開放式並行存取」
自己打開兩個瀏覽器,模擬兩個人「同時」編輯「同一筆記錄」
使用者A先去修改完成
使用者B要改就會無效!
因為回寫時,發現資料已經不是原本的樣子,被人改過了,所以不准修改。
您自己寫程式(後置程式碼)
在 GridView的 RowUpdating事件裡面,使用參數e會看見這兩個朋友
e.OldValues["資料表的欄位名稱"]
e.NewValues["資料表的欄位名稱"] ...... VB語法請把 [ ] 改成 ( ) 小括號即可
就是「開放式並行存取」的原貌,自己寫程式就能看到更多事情。
如果您實作發生問題,可能是資料表的欄位設定(資料型態)有誤
我以前存放大量的文字資料,會使用 Text資料型態
在.NET 2.0 (VS 2005)運作正常,但後續就無法使用「開放式並行存取」了
後來,微軟建議改用 nVarChar(MAX)或是 VarChar(MAX)取代原先的 Text資料型態
就正常囉。
******************************************************************************************************************
完整說明,還是以 msdn官方網站為主。
開放式並行存取
Optimistic Concurrency
******************************************************************************************************************
如果您要找 DataSet的程式碼,也能展示「開放式並行存取」
可以參考我以前發表過的文章:
MSDN的說法是:
下列範例示範如何明確設定 DataAdapter 的 UpdateCommand 並呼叫其 Update 方法,藉以更新已修改的資料列。 請注意,在 UPDATE 陳述式之 WHERE 子句中指定的參數是設定為使用 SourceColumn 的 Original 值。 這一點相當重要,因為 Current 值可能已經修改,而不符合資料來源中的值。 Original 值是用來填入資料來源之 DataTable 的值。
using (SqlConnection conn = new SqlConnection("DB連結字串"))
{
SqlDataAdapter dataAdpater = new SqlDataAdapter("SELECT * FROM test資料表", conn);
DataTable categoryTable = new DataTable();
dataAdpater.Fill(categoryTable);
DataRow categoryRow = categoryTable.Rows[0];
categoryRow["CategoryName"] = "New Beverages";
dataAdpater.UpdateCommand = new SqlCommand( "UPDATE test資料表 SET CategoryName = @CategoryName WHERE CategoryID = @CategoryID", conn);
dataAdpater.UpdateCommand.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");
SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add("@CategoryID", SqlDbType.Int);
parameter.SourceColumn = "CategoryID";
parameter.SourceVersion = DataRowVersion.Original;
// 屬性值
// 類型:System.Data.DataRowVersion
// 其中一個 DataRowVersion 值。 預設值為 Current。
// SqlDataAdapter.UpdateCommand 會在更新期間使用這個屬性,以判斷參數值是否使用原始或目前的值。 這可以更新主索引鍵。
dataAdpater.Update(categoryTable);
}
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約 51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約 140hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.tw 或 school (at) mis2000lab.net
(1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A
(2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
......... facebook社團 https://www.facebook.com/mis2000lab ......................
......... YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................