線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1834
推到 Plurk!
推到 Facebook!

請問ADOConnection + TADOQuery 要如何做交易呢?

尚未結案
saam
初階會員


發表:61
回覆:75
積分:27
註冊:2003-03-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-16 09:04:48 IP:203.71.xxx.xxx 未訂閱
請問各位先進~ 我用 ADOConnection TADOQuery ,要如何做到交易的功能, 就是一個SQL更新失敗,就ROLLBACK 回來之前執行的SQL, 我用 ADOQuery.POST ,為什麼會立即寫到資料庫呢?
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-16 09:18:21 IP:202.62.xxx.xxx 未訂閱
您好﹗    如下方法﹕ 在對資料庫進行任何異動之前先BeginTrins﹐即開始一筆新交易(使用BeginTrins方法的前提條件是必須已經和后端資料庫來源建立連接﹐即Connected屬性值為True)﹐确認之前開啟的交易時用CommitTrans﹐取消之前的交易用RollBackTrans﹐一般來講為了保持資料異動的一致性和正确性﹐我們使用交易功能﹐以下為較常見的使用方法﹕
begin
  Try
    ADOConnection1.BeginTrans; //開始交易
    ADOQuery1.Insert; //Delete, Edit等
    ADOQuery1.FieldByName('欄位名').Value := ...;//略
    ADOQuery1.Post;
    ADOConnection1.CommitTrans; //确認交易
  Except
    ADOConnection1.RollBackTrans; //取消交易
  end;
end;
當然﹐除此以外﹐也可手動分別完成開始交易﹐确認交易﹐取消交易的功能
開始交易
begin
  ADOConnection1.BeginTrans;
end;    确認交易
begin
  ADOConnection1.CommitTrans;
end;    取消交易
begin
  ADOConnection1.RollBackTrans;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/06/16 09:19:35
------
忻晟
saam
初階會員


發表:61
回覆:75
積分:27
註冊:2003-03-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-16 16:43:10 IP:203.71.xxx.xxx 未訂閱
謝謝cashxin2002大大: 我寫了一串下面的程式~ 發現有二個問題 1.資料表在ExecSQL執行後,在CommitTrans執行前,都會被鎖住,使用SQL Server Enterprise Manager 連讀取都無法.要如何解決. 2.執行完成後,使用SQL Server Enterprise Manager 要刪除insert 的幾筆資料 都會出現 [索引鍵資料行資訊不足或不正確;太多資料行被更新所影響], 而刪不掉,為什麼呢? Try //開始交易 adoConnCCDB.BeginTrans; adoConnTCHDB.BeginTrans; TmpStr := 'Insert Into testcc(cc) values(''11'')'; adoQurCCDBTran.SQL.Clear; adoQurCCDBTran.SQL.Add(TmpStr); adoQurCCDBTran.ExecSQL; TmpStr := 'Insert Into testtt(tt) values(''22'')'; adoQurTCHDBTran.SQL.Clear; adoQurTCHDBTran.SQL.Add(TmpStr); adoQurTCHDBTran.ExecSQL; TmpStr := 'Insert Into testcc(cc) values(''33'')'; adoQurCCDBTran.SQL.Clear; adoQurCCDBTran.SQL.Add(TmpStr); adoQurCCDBTran.ExecSQL; adoConnCCDB.CommitTrans; //確認交易 adoConnTCHDB.CommitTrans; //確認交易 Except on E: Exception do begin adoConnCCDB.RollBackTrans; //取消交易 adoConnTCHDB.RollBackTrans; //取消交易 Result := ' 寫入資料庫時發時錯誤!E.Message=' E.Message; exit; end; end;
saam
初階會員


發表:61
回覆:75
積分:27
註冊:2003-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-16 16:52:57 IP:203.71.xxx.xxx 未訂閱
SORRY!第一個問題己解決,因為我沒有設索引~ ~請問第二個問題該如何解決?
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-16 17:29:14 IP:202.62.xxx.xxx 未訂閱
您好﹗    亦是索引鍵的問題﹐檢查看看其它相關資料表是否有設索引﹒ 您的SQL敘述中在語法上缺少了幾個空格﹐請見以下紅色下划線處即為空格
begin
  Try
    adoConnCCDB.BeginTrans;
    adoConnTCHDB.BeginTrans;        TmpStr := 'Insert Into testcc_(cc) values_(''11'')';
    adoQurCCDBTran.SQL.Clear;
    adoQurCCDBTran.SQL.Add(TmpStr);
    adoQurCCDBTran.ExecSQL;        TmpStr := 'Insert Into testtt_(tt) values_(''22'')';
    adoQurTCHDBTran.SQL.Clear;
    adoQurTCHDBTran.SQL.Add(TmpStr);
    adoQurTCHDBTran.ExecSQL;        TmpStr := 'Insert Into testcc_(cc) values_(''33'')';
    adoQurCCDBTran.SQL.Clear;
    adoQurCCDBTran.SQL.Add(TmpStr);
    adoQurCCDBTran.ExecSQL;        adoConnCCDB.CommitTrans; //確認交易
    adoConnTCHDB.CommitTrans; //確認交易
  Except
    on E: Exception do
    begin
      adoConnCCDB.RollBackTrans; //取消交易
      adoConnTCHDB.RollBackTrans; //取消交易          Result := ' 寫入資料庫時發時錯誤!E.Message='+ E.Message;
      exit;
    end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/06/16 17:30:41
------
忻晟
系統時間:2024-06-29 22:01:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!