后端數據庫為SQL SERVER200, 使用的DELPHI自帶的DBExpress數據庫組件(SQLConnection, SQLDataSet, ClientDataSet, DataSetProvider),
實現兩個ClientDataSet向后台SqlServer更新都成功時才同時Commit﹐其中任何一個失敗則同時Rollback均不在后台更新,程序見下:
procedure TForm1.Button1Click(Sender: TObject);
var
TrsDsc1:TTransactionDesc;
begin
trsDsc1.TransactionID := 1;
TrsDsc1.IsolationLevel := xilREADCOMMITTED;
DataModule2.con1.StartTransaction(TrsDsc1);
if (DataModule2.cdsMain1.ApplyUpdates(0) = 0) and
(DataModule2.cdsEm1.ApplyUpdates(0) = 0) then
DataModule2.con1.Commit(TrsDsc1)
else
begin
DataModule2.con1.Rollback(TrsDsc1);
ShowMessage('have Error');
end;
end;
第一個cdsMain1更新無錯(即ApplyUpdates(0) = 0), 第二個cdsEm1更新出錯(即ApplyUpdates(0) > 0, 如主鍵重復),
則事務能正確Rollback, 兩個ClientDataSet均未向后台更新,
第二次執行程序時,由于cdsMain1中的change log已無(第一次ApplyUpdates(0) = 0會自動清除記錄改變狀態), 所以
cdsMain1.ApplyUpdates(0)并不產生SQL語句到后台, 為了實現同步更新,
DBExpress中的ClientDataSet.applyupdates()能否根據需要控制它成功時不自動清除Delta,由外部程序清除,
或有其它實現以上意圖的好方法?
多謝!!!
實現兩個ClientDataSet向后台SqlServer更新都成功時才同時Commit﹐其中任何一個失敗則同時Rollback均不在后台更新,程序見下:
procedure TForm1.Button1Click(Sender: TObject);
var
TrsDsc1:TTransactionDesc;
begin
trsDsc1.TransactionID := 1;
TrsDsc1.IsolationLevel := xilREADCOMMITTED;
DataModule2.con1.StartTransaction(TrsDsc1);
if (DataModule2.cdsMain1.ApplyUpdates(0) = 0) and
(DataModule2.cdsEm1.ApplyUpdates(0) = 0) then
DataModule2.con1.Commit(TrsDsc1)
else
begin
DataModule2.con1.Rollback(TrsDsc1);
ShowMessage('have Error');
end;
end;
第一個cdsMain1更新無錯(即ApplyUpdates(0) = 0), 第二個cdsEm1更新出錯(即ApplyUpdates(0) > 0, 如主鍵重復),
則事務能正確Rollback, 兩個ClientDataSet均未向后台更新,
第二次執行程序時,由于cdsMain1中的change log已無(第一次ApplyUpdates(0) = 0會自動清除記錄改變狀態), 所以
cdsMain1.ApplyUpdates(0)并不產生SQL語句到后台, 為了實現同步更新,
DBExpress中的ClientDataSet.applyupdates()能否根據需要控制它成功時不自動清除Delta,由外部程序清除,
或有其它實現以上意圖的好方法?
多謝!!!
if not DataModule2.cdsMain1.ApplyUpdates(0) then
DataModule2.cdsMain1.tag=delta
else
DataModule2.cdsMain1.tag='';
rollback时恢复
我就是这样用的,不知对你有没有帮助!