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

請問Delphi 7.0 + MySQL如何處理rollback??

尚未結案
Angi
一般會員


發表:16
回覆:56
積分:14
註冊:2005-01-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-19 10:33:12 IP:211.20.xxx.xxx 未訂閱
如題,Delphi 7.0 MySQL如何處理rollback? 若可以該如何撰寫程式 若不行,是因為Delphi 7.0沒辦法處理 還是任何版本都不行支援MySQL rollback?
JackTasy
初階會員


發表:22
回覆:97
積分:28
註冊:2002-06-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-19 16:56:01 IP:211.76.xxx.xxx 未訂閱
先說抱歉我沒有確切的答案,僅提供之前經驗參考。 1.MySQL 在某版本前尚沒有支援 Transaction 能力,所以當然本身不支援 Rollback了。至於哪個版本開始有支援請上 MySQL 官網查。 (若我沒記錯好像 5.x 開始才有...) 2.Paradox 這樣的 File-Base 當然也沒有支援交易能力,但過去我做過簡單測試居然也能讓我 Rollback 成功,可能是 BDE 的幫助吧。 結論: 建議先確定你的 MySQL 版本是否支援 Transaction 後,再用 Delphi 7.0 寫個簡單的測試程式自己試試看吧,這樣結果是最保險的。 JackTasy
------
JackTasy
Angi
一般會員


發表:16
回覆:56
積分:14
註冊:2005-01-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-21 17:28:37 IP:211.20.xxx.xxx 未訂閱
為了測試 我在Webmin中直接下SQL語法 START TRANSACTION; select * from Bid; COMMIT; 結果是正確的...也可以查詢出結果 但是把它搬到使用Delphi,就失敗了 應該是連語法都不合吧 測試一: SQLQuery1.Active := False; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add('START TRANSACTION; select * from Bid; COMMIT;'); SQLQuery1.Active := True; 測試結果: Check the manual that corresponds to your MySQL server version for the right syntax to use near ';select * from Bid; COMMIT' at line 1. 測試二: SQLQuery1.Active := False; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add('START TRANSACTION'); SQLQuery1.SQL.Add('select * from Bid'); SQLQuery1.SQL.Add('COMMIT'); SQLQuery1.Active := True; 測試結果: You Have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from Bid COMMIT' at line 2. 請問大大,有沒有人知道這是為什麼呢??
ship88
一般會員


發表:7
回覆:7
積分:2
註冊:2004-02-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-24 08:27:57 IP:61.59.xxx.xxx 未訂閱
其實Mysql 只要不寫sql 去execsql 是可以達到一致性的.. 資料庫輸入的檢查要在前端.. 這是什麼理論,機密..
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-24 10:28:14 IP:218.80.xxx.xxx 未訂閱
mysql有很多引擎,现在的InnoDB引擎4.1版本是支援transaction的。 为什么不用TSQLConnection.StartTransaction/Commit/Rollback来使用transaction呢? 如果用TADOConnection也可以。     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
JackTasy
初階會員


發表:22
回覆:97
積分:28
註冊:2002-06-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-24 15:16:23 IP:211.21.xxx.xxx 未訂閱
引言: mysql有很多引擎,现在的InnoDB引擎4.1版本是支援transaction的。
喔對,我想起來了,mustapha.wang 說的對,我當初是用 MySQL 3.23 版的,但必須套上 InnoDB 才具有 Transaction 能力。 另外 Angi 用來測試 Transaction 的方法好像有點奇怪,我的認知理若只是 select 資料的話不需要管也不需要用 Transaction ,異動資料才需要吧,你要測試的話或許應換個方式。 JackTasy
------
JackTasy
Angi
一般會員


發表:16
回覆:56
積分:14
註冊:2005-01-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-28 15:43:41 IP:211.20.xxx.xxx 未訂閱
引言: 另外 Angi 用來測試 Transaction 的方法好像有點奇怪,我的認知理若只是 select 資料的話不需要管也不需要用 Transaction ,異動資料才需要吧,你要測試的話或許應換個方式。    我的目的不是要測 Transaction 是否成功, 而只是要測試我的SQL語法, 是否被Delphi所接受, 因為我那段語法直接在Webmin中下SQL, 是可以成功執行的...也許我的測試方法真的不太對, 但我真不知該怎麼測試了.. 另外, 要怎麼樣才能套上
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-01 08:48:59 IP:218.80.xxx.xxx 未訂閱
每家数据库除了支持sql92标准,还会有自己的一些特殊语法,就拿transaction的控制来说,有的是begin transaction,有的是start transaction要看具体的帮助,但如果使用TSQLConnection元件,那么可以用原件的StartTransaction/Commit/Rollback,具体什么指令就是驱动程序的事了。 另外,不返回结果的sql语句,要用TSQLConnection.Execute。 如TSQLConnection.Execute('START TRANSACTION'); 在Mysql管理工具中,可以设定某个表使用什么引擎。     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
Angi
一般會員


發表:16
回覆:56
積分:14
註冊:2005-01-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-04 14:18:34 IP:211.20.xxx.xxx 未訂閱
我來個總結 正如mustapha.wang所言,mysql有很多引擎,现在的InnoDB引擎4.1版本是支援transaction的。 至於怎麼做呢? [新增Table] create table inventory( product_id int not null primary key, in_stock int not null )type=innodb; [修改Table] ALTER table table_name type=innodb; 再來Delphi 程式撰寫內容: procedure TForm1.Button1Click(Sender: TObject); var TD: TTransactionDesc; begin if not SQLConnection1.InTransaction then begin TD.TransactionID := 1; TD.IsolationLevel := xilREADCOMMITTED; SQLConnection1.StartTransaction(TD); try SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add('INSERT INTO test (testfield) VALUES (''3'')'); SQLQuery1.ExecSQL(); SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add('INSERT INTO test1 (test1field, datefield, enumfield) VALUES (1, , )'); //這是錯誤的SQL語法 SQLQuery1.ExecSQL(); SQLConnection1.Commit(TD); {on success, commit the changes}; except SQLConnection1.Rollback(TD); {on failure, undo the changes}; end; end; end; 執行結果:資料不會被寫入 SQLConnection1.Rollback(TD); 若SQL語法都是正確的, 將二筆皆被寫入 SQLConnection1.Commit(TD); ps.此程式碼使用全形空白,若需要copy,記得將空白拿掉
Angi
一般會員


發表:16
回覆:56
積分:14
註冊:2005-01-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-07 15:11:14 IP:211.20.xxx.xxx 未訂閱
function寫法: uses function sql_add(sqlstr: string): string; //記得要加 procedure TForm1.Button1Click(Sender: TObject); var TD: TTransactionDesc; begin if not SQLConnection1.InTransaction then begin TD.TransactionID := 1; TD.IsolationLevel := xilREADCOMMITTED; SQLConnection1.StartTransaction(TD); try sql_add('INSERT INTO test (testfield) VALUES (''3'')'); sql_add('INSERT INTO test2 (test2field) VALUES (3)'); SQLConnection1.Commit(TD); {on success, commit the changes}; except SQLConnection1.Rollback(TD); {on failure, undo the changes}; end; end; end; function sql_add(sqlstr: string): string; begin Form1.SQLQuery1.SQL.Clear; Form1.SQLQuery1.SQL.Add(sqlstr); Form1.SQLQuery1.ExecSQL(); end; ps.此程式碼使用全形空白,若需要copy,記得將空白拿掉
系統時間:2024-06-02 15:50:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!