1. 程式人生 > >關於ADO一個容易被忽視的問題!UpdateBatch [問題點數:0分]

關於ADO一個容易被忽視的問題!UpdateBatch [問題點數:0分]

news cache 用戶 man con from eba commit 容易

這是一個常見但容易被忽視的問題,舊貼有問及但沒答案,因此提高分數。
相信大家常這樣使用Cache模式;
ADOConnection1.BeginTrans;
Try
ADODataSet1.UpdateBatch(arAll);
ADOConnection1.CommitTrans;
Except
ADOConnection1.RollbackTrans;
Raise;
End;
通常,用戶會增加或修改多條記錄然後保存,但是,當其中一條記錄違反
數據庫規則,或觸發器的時候,這時會Rollback,然後提示錯誤,然後用戶修改出錯的記錄,
然後再保存,這時會出現什麽情況呢?(提示:除了用戶剛修改的記錄外,
其它記錄的狀態都變成了usUnmodified)


同樣,把這個BUG推廣到多表中:
ADOConnection1.BeginTrans;
Try
ADODataSet1.UpdateBatch(arAll);
ADODataSet2.UpdateBatch(arAll); // <- 假設出錯,然後用戶再改正
ADOConnection1.CommitTrans;
Except
ADOConnection1.RollbackTrans;
Raise;
End;

同樣,DataSet1的修改會被忽略。
在Borland Newsgroup上,有TeamB的高手給出了SavetoFile,LoadFromFile的
解決方案,我覺得不是一個好辦法,因為LOADFROMFILE之後這個記錄集的COMMANDTEXT都變成那個文件名了,
CommandType:=cmdfile了,如果SQL裏面用了參數,那就很麻煩了!

看看這兒大家有什麽解決方法。在發貼時,我在考慮用CLONE解決這個問題!

看來,BDE的兩段提交(ApplyUpdate,CommitUpdate)比ADO好n倍啊,不知道BORLAND為什麽要放棄他!

關於ADO一個容易被忽視的問題!UpdateBatch [問題點數:0分]