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

No user transaction is currently in progress.....

尚未結案
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-15 14:01:38 IP:218.72.xxx.xxx 未訂閱
各位高手:    我碰到了一个很困惑的问题,我前台使用delphi5,后台使用sql7.0, 在我的前台中我使用了如下程式,但奇怪的是我在单机上可以实现,完全正常, 但在局域网上却不能实现,并出现以下提示:   "No user transaction is currently in progress. The ROLLBACK TRANSACTION Request has no corresponding BEGIN TRANSACTION."    code如下: first.Database1.StartTransaction; //开始事务   ... first.Database1.Commit;  //提交事务    ... first.Database1.Rollback; 
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-16 10:01:39 IP:210.65.xxx.xxx 未訂閱
Hi:    關於 StartTransaction 的用法,delphi 中 Help Example 如下
procedure TForm1.ApplyButtonClick(Sender: TObject);    begin
  with CustomerQuery do
  begin
  Database1.StartTransaction;
    try
      ApplyUpdates; {try to write the updates to the database};
      Database1.Commit; {on success, commit the changes};
    except
      Database1.Rollback; {on failure, undo the changes};
    raise; {raise the exception to prevent a call to CommitUpdates!}
    end;
  CommitUpdates; {on success, clear the cache}
  end;    end;
你可以試試看,應該不會有問題,此外,DataBase 的 HandleShared 必須設為 True -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-16 10:28:38 IP:218.72.xxx.xxx 未訂閱
问题还是存在,我的code如下: first.Database1.StartTransaction; //开始事务 try query1.close; query1.sql.clear; query1.sql.add('INSERT INTO'); query1.sql.add(first.edit2.text); query1.sql.add('.'); query1.sql.add(first.edit3.text); query1.sql.add('.dbo.ml'); query1.sql.add('SELECT *'); query1.sql.add('FROM ml_temp1'); query1.prepare; query1.execsql; query1.close; query1.sql.clear; first.Database1.Commit; //提交事务 except begin Application.Messagebox('发生错误,不能正常存盘!','信息',mb_Ok mb_Iconinformation); first.Database1.Rollback; application.Terminate; end; 在单机上时,所有的事务功能我试过都很正确,但只要连到局域网上就出错,不过如果我把“Database1.StartTransaction;Database1.Commit;Database1.Rollback; ”注释掉,就正常了,只是这样不就没有事务功能了吗? 多谢!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-16 10:51:48 IP:210.65.xxx.xxx 未訂閱
Hi:    StartTransaction 似乎只對 Applyupdates 等指令有效, Insert、Delete、Update 是對 DataBase 直接動作,無法 RollBack,若要RollBack 也必須寫在 SQL Command 中 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-16 10:52:26 IP:61.220.xxx.xxx 未訂閱
引言: 问题还是存在,我的code如下: if not first.Database1.InTransaction then first.Database1.StartTransaction; //开始事务 try query1.close; query1.sql.clear; query1.sql.add('INSERT INTO'); query1.sql.add(first.edit2.text); query1.sql.add('.'); query1.sql.add(first.edit3.text); query1.sql.add('.dbo.ml'); query1.sql.add('SELECT *'); query1.sql.add('FROM ml_temp1'); query1.prepare; query1.execsql; query1.close; query1.sql.clear; first.Database1.Commit; //提交事务 except begin Application.Messagebox('发生错误,不能正常存盘!','信息',mb_Ok mb_Iconinformation); first.Database1.Rollback; application.Terminate; end; 在单机上时,所有的事务功能我试过都很正确,但只要连到局域网上就出错,不过如果我把“Database1.StartTransaction;Database1.Commit;Database1.Rollback; ”注释掉,就正常了,只是这样不就没有事务功能了吗? 多谢!
加上紅色字體部分試試看 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-16 11:30:25 IP:218.72.xxx.xxx 未訂閱
多谢各位热心指教,但问题还在,我在google中输入那一串英文,只找到相关问题,但也找不到相关答案,可能这问题碰到过的人比较少吧
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-16 12:40:14 IP:218.72.xxx.xxx 未訂閱
fishman: 请问如何写在sql command 中,即格式如何写? 不胜感激
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-16 13:47:24 IP:210.65.xxx.xxx 未訂閱
Hi:    因我慣用的 DataBase 為 Oracle 我用此來舉例,當以下程式在 insert or delete 出現錯誤訊息時,皆會回復至原始狀態
begin
    insert into aaa select * from bbb;
    delete from bbb;
    commit; 
exception
    when others then
        rollback;
end;
SQL Server 寫法我就不知道了,不過觀念大致上是這樣 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-16 15:47:53 IP:218.72.xxx.xxx 未訂閱
感谢两位高手的指教,给了我很大的启示,虽然暂时还没解决,但我看了版主和fishman的文章后,觉得可能和我的database1.InTransaction没有连到局域网中的server上有关,我再试一下! thank you very much!
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-16 22:43:50 IP:218.32.xxx.xxx 未訂閱
luowy651 你好: T-SQL 的 Transaction 用法, 參考看看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42904
xriz8989
一般會員


發表:0
回覆:3
積分:0
註冊:2003-06-30

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-24 21:23:06 IP:211.76.xxx.xxx 未訂閱
luowy651 你好, 剛剛才看到這個問題.. TQuery.ExecSql 這個指令--用錯了,它本身就已經完成所有transaction. 所以當發生交易失敗時 try..except.. 會觸發database.rollback; 而此時因 'execsql' 已經完成 transaction, 所以會得到無交易狀況下之rollback Error TQuery.ExecSql...單一資料表...偶爾為之尚可. 針對BDE的資料元件進行交易管控(transaction)不能使用此方式. 另外由此引發的問題--如果要進行多table之transaction該如何? 如果仍舊使用你原始的方法...一定無法ROLLBACK! 下列是我常用的方式(適用各種資料庫): try db.startransaction. query1.close; query1.RequestLive := true; query1.SQL.Clear; query1.SQL.Add(必要的SQL語法); query1.active := true; {進行資料必要之編輯q.Edit(insert)...q.Post; ...很繁瑣... 但是若要使用TQuery or TTable進行資料異動, 還是得乖乖的使用傳統流程..尤其是多資料表之異動} query2.active := false; query2.RequestLive := true; query2.SQL.Clear; query2.SQL.Add(必要的SQL語法); query2.active := true; {... edit...post ...} ... ... ... ... ... ... db.commit; except db.rollback; end;
系統時間:2024-06-29 16:21:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!