全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1141
推到 Plurk!
推到 Facebook!

TADOCommand 如何達到 roolback 的功能

答題得分者是:bestlong
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-13 11:20:40 IP:211.74.xxx.xxx 未訂閱
各位大大:   請問 TADOCommand 如何做 Roolback,我有一段程式如下 :
procedure TsysMainFrm.Button1Click(Sender: TObject);
var
   cmd: TADOCommand;
   FConnection: TADOConnection;
begin
  FConnection := sysCommDM.AdoConn;
  cmd:=TADOCommand.Create(self);
  cmd.Connection:=FConnection;
  try
    FConnection.BeginTrans;
    while not qry.eof do
    begin
       cmd.CommandText:='insert into onlinesysnc_error (price)' 
                         ' values(:price)';
       cmd.Parameters.ParamByName'price').Value:=qry.FieldByName'price').AsFloat);
             cmd.Execute;
      qry.next;
    end;
    if qry.recordcount>10 then
       FConnection.RollbackTrans;
    FConnection.CommitTrans;
  except
    FConnection.RollbackTrans;
  end;
end;
我故意讓程式執行十筆之後,做roolback 的動作, 但好像無法達到Rollback 的 功能,前十筆一樣會寫入資料庫,如果我將cmd.Execute; 這行拿掉,則不管成功或失敗,什麼都不會寫入,不知那裡錯了,謝謝 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
cashxin2002
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-13 12:59:27 IP:202.62.xxx.xxx 未訂閱
您好﹗    改成如下試試﹕
procedure TsysMainFrm.Button1Click(Sender: TObject);
var
   cmd: TADOCommand;
   FConnection: TADOConnection;
begin
  FConnection := sysCommDM.AdoConn;
  cmd:=TADOCommand.Create(self);
  cmd.Connection:=FConnection;
  try
    FConnection.BeginTrans;
    while not qry.eof do
    begin
       cmd.CommandText:='insert into onlinesysnc_error (price)'+
                         ' values(:price)';
       cmd.Parameters.ParamByName'price').Value:=qry.FieldByName'price').AsFloat);
             cmd.Execute;
      qry.next;
      if qry.recordcount>10 then
        begin
          FConnection.RollbackTrans;
          Exit;
        end;
    end;
    FConnection.CommitTrans;
  except
    FConnection.RollbackTrans;
  end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-13 13:05:19 IP:211.22.xxx.xxx 未訂閱
慢了一步. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-13 13:41:05 IP:211.74.xxx.xxx 未訂閱
一樣,資料會寫進去資料庫 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
cashxin2002
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-13 14:07:01 IP:202.62.xxx.xxx 未訂閱
您好﹗    
procedure TsysMainFrm.Button1Click(Sender: TObject);
var
   cmd: TADOCommand;
   FConnection: TADOConnection;
begin
  FConnection := sysCommDM.AdoConn;
  cmd:=TADOCommand.Create(self);
  cmd.Connection:=FConnection;
  try
    FConnection.BeginTrans;
    while not qry.eof do
    begin
       cmd.CommandText:='insert into onlinesysnc_error (price)'+
                         ' values(:price)';
       cmd.Parameters.ParamByName'price').Value:=qry.FieldByName'price').AsFloat);
             cmd.Execute;
      qry.next;
      if qry.RecNo>10 then
        begin
          FConnection.RollbackTrans;
          Exit;
        end;
    end;
    FConnection.CommitTrans;
  except
    FConnection.RollbackTrans;
  end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-13 14:45:25 IP:211.74.xxx.xxx 未訂閱
我發現在 cmd.Execute; 執行後,資料就已寫入資料庫,在執行 FConnection.RollbackTrans; 也沒有用,所以 TADOCommand 好像並不是像想像那樣在還沒FConnection.CommitTrans 前,就已將資料寫入 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
cashxin2002
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-13 15:23:00 IP:202.62.xxx.xxx 未訂閱
您好﹗    只要有開啟交易功能(BeginTrans)﹐在沒有下确認交易的方法(CommitTrans)之前﹐資料都不會真正存入到后端資料庫中﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-13 15:42:04 IP:211.78.xxx.xxx 未訂閱
各位大哥 if qry.recordcount>10 then FConnection.RollbackTrans; FConnection.CommitTrans; 每次都有 CommitTrans 當然會存進資料庫 1. 程式寫法有點問題 應該參考 HELP 範例 2. 檢查 connection 發表人 - 懷舊的人 於 2005/06/13 15:52:01 發表人 - 懷舊的人 於 2005/06/13 15:55:06
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-13 17:59:53 IP:211.22.xxx.xxx 未訂閱
請問資料庫是使用哪個呢? 該不會是 Access 吧? 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
BOSS
中階會員


發表:70
回覆:79
積分:64
註冊:2006-11-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-13 18:24:22 IP:202.154.xxx.xxx 未訂閱
  FConnection := sysCommDM.AdoConn;
  cmd:=TADOCommand.Create(self);
  cmd.Connection:=FConnection;
  try
    FConnection.BeginTrans;
    while not qry.eof do
    begin
       cmd.CommandText:='insert into onlinesysnc_error (price)' 
                         ' values(:price)';
       cmd.Parameters.ParamByName'price').Value:=qry.FieldByName'price').AsFloat);
             cmd.Execute;
      qry.next;
    end;
    改成這樣
    if qry.recordcount>10 then
       FConnection.RollbackTrans
    else
      FConnection.CommitTrans;
  except
    FConnection.RollbackTrans;
  end;
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-13 19:06:54 IP:211.74.xxx.xxx 未訂閱
我的資料庫是 MYSQL 5.0 的 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-13 19:40:36 IP:211.78.xxx.xxx 未訂閱
好像 MY SQL 不支援TRANSACTION
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-13 19:59:49 IP:211.74.xxx.xxx 未訂閱
mysql 4.1 以上就支援 transaction 了 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
whyzn
中階會員


發表:46
回覆:149
積分:54
註冊:2002-06-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-13 20:30:53 IP:220.141.xxx.xxx 未訂閱
雞婆一下  
 
procedure TsysMainFrm.Button1Click(Sender: TObject);
var
   cmd: TADOCommand;
   FConnection: TADOConnection;
begin
  FConnection := sysCommDM.AdoConn;
  cmd:=TADOCommand.Create(self);
  cmd.Connection:=FConnection;
  try
    cmd.Connection.BeginTrans;
    while not qry.eof do
    begin
       cmd.CommandText:='insert into onlinesysnc_error (price)' 
                         ' values(:price)';
       cmd.Parameters.ParamByName'price').Value:=qry.FieldByName'price').AsFloat);
             cmd.Execute;
      qry.next;
    end;
    if qry.recordcount>10 then
       cmd.Connection.RollbackTrans;
    cmd.Connection.CommitTrans;
  except
    cmd.Connection.RollbackTrans;
  end;
end;        
[red] ●○○○○○●○○○○○● 竹密不妨水過,山高無礙雲飛
------
●○○○○○●○○○○○●
竹密不妨水過,山高無礙雲飛
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-06-13 20:49:03 IP:61.59.xxx.xxx 未訂閱
狠一點先把 FConnection.CommitTrans 給拿掉看還會不會存入. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-06-13 20:52:11 IP:61.59.xxx.xxx 未訂閱
另外確認一下 qry 連接的資料表為何? 其中的資料筆數有多少呢? 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-06-13 21:34:19 IP:61.59.xxx.xxx 未訂閱
首先 MySQL 5 還是發展中的版本, 使用上有可能會出現問題. 可是 MySQL 4 有開始支援 Transaction 是沒錯, 但是請注意只是指有支援喔, 並不代表使用者所建立的 database, table 就一定是啟動 Transaction 的功能. 而是在建立 Table 時所指定的參數以及 MySQL DB Server 的預設環境設定來決定. 請針對所連接的 batabase 執行 show table status 的 SQL 指令, 請確認顯示結果中的 Eengine 欄必須是 InnoDB 的 Table 才有支援 Transaction . 詳細資料建議參考 MySQL 說明文件. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶 發表人 - bestlong 於 2005/06/13 21:41:55
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-06-13 22:43:33 IP:211.74.xxx.xxx 未訂閱
對喔,要將 table 的  Eengine 欄位設為 InnoDB  才有支援 Transaction . 我竟然忘了 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福
------
Thomas Chiou
系統時間:2024-06-27 22:15:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!