delphi 事務處理SQL語句

方法一(利用adoconnection.exe(sqlstate)):html

adoconnection1.begintrans;//開始事務
try
 adoconnection1.execute(sqlstr1);
 adoconnection1.execute(sqlstr2);
 ...
 adoconnection1.execute(sqlstrN);
 adoconnection1.commitrans;//提交事務
 showmessage('操做成功');
except
 adoconnection1.rollbacktrans;//事務回滾
 showmessage('操做失敗');
end;
//以上採起事務處理只能用在有支持事務處理的數據庫中,適用於對數據記錄的修改,插入,刪除等操做(只有極少幾條SQL語句無事務處理),它的好處就是try..except內的SQL語句所有執行成功時,纔會提交到數據庫中,否則就所有取消,即便是最後一條出錯,出錯前的也會被取消,這比較符合現實現求,如銀行中的轉帳就必須用到事務處理!進銷存管理/財務帳等等都必需要用事務處理mysql


方法二(在con的begintrans中寫控件的數據提交):sql

ADO的事務處理例子(Delphi)

{一、批量數據更新時要將ADOQUERY.LOCKTYPE=ltBatchOptimistic ,而後調用UpdateBatch()更新數據;
二、當ADOQUERY.LOCKTYPE=ltOptimistic 時調用post更新數據(當dbgrid換行時也自動調用post提交數據)
引用一篇博文:
 今天終於把糾纏了幾天的問題改完了,說到底只是一個很小的問題,就是ADOQuery的一個小屬性。

         把控件DBGridEh的一列的checkbox設爲true,將其綁定DataSourceA和DOQuery。用Button添加了一個事件,用來取消對checkbox的操做:ADOQuery.CancelBatch();但是隻能取消最後一步的操做。檢查了很長時間才發如今DBGridEh的DataSource的Dataset 下的LockType的屬性設置問題,我設置成了:ItOptimistic    後來將此屬性改成:ltBatchOptimistic 就能夠了數據庫

在網上查了一下,有以下說法:緩存

1.ADOQuery.Update;ADOQuery.Delete;不用設置屬性.
2.locktype指定用戶打開數據集時對數據集的鎖定級別:
ltUnspecified 未指定鎖定級別
ltReadOnly Read-only    只讀
ltPessimistic 記錄級別(該記錄被編輯時其它用戶不能用)
ltOptimistic 獨立模式(與原來結果集對照,若是在此期間其它用戶修改告終果,則你的結果不能保存)
ltBatchOptimistic      批量模式(使用緩存,進行批量提交)post

ADOQuery的屬性含義:spa

ltUnspecified          不特別指定
ltReadOnly          選出來的資料表只能讀,沒法寫入
ltPessimistic         選出來的資料表能夠寫入,當改記錄寫入時會馬上寫入並鎖定
ltOptimistic          選出來的資料表可寫入,當該記錄表寫入時不會馬上寫入但會鎖定,當執行updates時才正式寫入改記錄
ltBatchOptimistic          選出來的資料表可寫入,當該記錄寫入時不會馬上寫入但會鎖定,當執行updates才正式整批寫入該記錄(能夠修改多條整批update)}.net

 
ADOConnection1.BeginTrans;   //開始事務 try  with ADOCommand1 do  begin  Connection:=ADOConnection1;  commandtext:='update [country] set [population]=10000 where [name]=''Venezuela''';//正確的SQL語句  Execute;  CommandText:='Wrong SQL Command';//錯誤的SQL  Execute;  ADOConnection1.CommitTrans; //提交事務 end;  except  on E: Exception do  begin  ADOConnection1.RollbackTrans; //若有異常,事務回滾 ShowMessage(E.Message);  end  end;  end;
相關文章
相關標籤/搜索