請問Delphi 7.0 + MySQL如何處理rollback?? |
尚未結案
|
Angi
一般會員 發表:16 回覆:56 積分:14 註冊:2005-01-12 發送簡訊給我 |
|
JackTasy
初階會員 發表:22 回覆:97 積分:28 註冊:2002-06-06 發送簡訊給我 |
先說抱歉我沒有確切的答案,僅提供之前經驗參考。
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 發送簡訊給我 |
為了測試
我在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 發送簡訊給我 |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
|
JackTasy
初階會員 發表:22 回覆:97 積分:28 註冊:2002-06-06 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
每家数据库除了支持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 發送簡訊給我 |
我來個總結
正如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 發送簡訊給我 |
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,記得將空白拿掉
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |