星期三, 9月 03, 2008

LinqToSql處理資料衝突

最近再看書..看到LinqToSql處理資料衝突..寫個簡單的範例..給大家跟自己參考一下..對了..有人不知道資料衝突是啥ㄇ??..老實說我一開始看到這標題也懵懵懂懂..可能少遇到ㄅ..Tongue..

簡單的說一個例子就是..如果你在跟新資料..因為你先把資料抓出來..然後寫個老半天..之後在你寫資料的期間..有人就把你之前抓出來的資料給你改掉..變成如果你更新下去..會把他的資料蓋掉....導致於資料可能會蓋來蓋去的情況..On the phoneOn the phoneOn the phone..

da.linqToSqlDataContext db = new da.linqToSqlDataContext();
var p = db.test.ToList().Where(a => a.id == 830474).Single();
p.a = "test1";
p.b = "test2";
p.c = "test3";

//讓它睡覺10秒中..你去偷改資料庫資料就可以測出結果了
Thread.Sleep(10000);
try
{
//這是對多rows改變的時候需要的參數,預設值是ConflictMode.FailOnFirstConflict
//記得用ConflictMode.ContinueOnConflict,這是等全部rows檢查完才會跑catch的
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch
{
//這是對每個object(row)都去檢查
foreach (ObjectChangeConflict conflict in db.ChangeConflicts)
{
//對row的每個property(column)去檢查
foreach (MemberChangeConflict chagneCoflict in conflict.MemberConflicts)
{
Response.Write(string.Format("資料庫的原始資料是-{0}<br />", chagneCoflict.OriginalValue));
Response.Write(string.Format("資料庫的目前內容是{0}<br />", chagneCoflict.DatabaseValue));
Response.Write(string.Format("記憶體的內容是{0}<br /><br />", chagneCoflict.CurrentValue));
}
}
}

參考一下ㄅ..^^..

參考:

沒有留言: