TAdoConnection.Execute 批次執行SQL時可能有陷阱 |
尚未結案
|
Arlung Miao
初階會員 發表:9 回覆:44 積分:25 註冊:2004-08-25 發送簡訊給我 |
我在MS-SQL使用TAdoConnection的Execute執行一批次的SQL,如果第二個以後的SQL發生類似違反Not Null約束或者長度超過欄位定義的長度時,Execute方法並不會返回錯誤。而在連接Oracle數據庫時,卻會返回錯誤。這樣,會造成開發上的陷阱。大家有何看法? 比如:表Table1 中的Field1欄位為varchar(10)則,當使用MS-SQL Server Database時:
var adoCnt: TADOConnection; cSql: string; ... begin ... cSql := 'BEGIN' #10#13 'INSERT INTO Table1 (Field1) VALUES('''01234567890''');' #10#10 //超過10個字符 'INSERT INTO Table1 (Field1) VALUES('''012345678901234567890''');' #10#13 //超過10個字符 'END;' ; //這裡,不會有Run-time Error //但是第二個SQL沒有成功 adoCnt.Execute(cSql); cSql := 'BEGIN' #10#13 'INSERT INTO Table1 (Field1) VALUES('''012345678901234567890''');' #10#13 //超過10個字符 'INSERT INTO Table1 (Field1) VALUES('''01234567890''');' #10#10 'END;' ; //這裡,會有Run-time Error: //Run-time error '-2147217833(80040e57)': //[Microsoft][ODBC SQL Server Driver][SQL Server]String or binary data would be truncated. adoCnt.Execute(cSql); ... end;但是,如果採用Oracle則兩處均會產生Run-time error: Run-time error '-2147217833(80040e57)': [Microsoft][ODBC SQL Server Driver][Oracle]ORA-01401: inserted value too large for column ORA-06512: at line 3 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
Arlung Miao
初階會員 發表:9 回覆:44 積分:25 註冊:2004-08-25 發送簡訊給我 |
我想,我們不太會願意每次用TADOConnection.Execute執行完成之後,都再用另一個SQL取回剛才的執行狀態。另外,我們還需要考慮如果有幾個查詢(TADOQuery或者TADOCommand等)等同時使用一個連接(TADOConnection)的情況,@@Error或者@@RowCount會不會被其他SQL所改變。 我覺得最大的意外是用ADO的不同方式來執行或者在不同的數據庫上會有不同的結果:
. TADOCommand來執行就沒有問題
. 數據庫為Oracle也沒有問題 發表人 - arlung miao 於 2005/05/14 20:19:32
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
@@ERROR 和 @@ROWCOUNT 的值在每一條 SQL 執行完之後當然會改變
所以,建議的用法,是在批次 SQL 的每一行之間加上 @@ERROR 的檢查
而不是在批次SQL執行完畢後,另外用一條 SQL 去取得 @@ERROR 或 @@ROWCOUNT 的值
如果是重要的批次SQL,最好加上 Transaction 機制
請參閱:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsqlpro2k/html/sql00f15.asp 加油喔,喵~ 發表人 - sryang 於 2005/05/15 13:17:40
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
Arlung Miao
初階會員 發表:9 回覆:44 積分:25 註冊:2004-08-25 發送簡訊給我 |
謝謝Sryong提供的資訊。 實際上,我的側重點在於理論上Delphi提供的對ADO支援是基於Microsoft的ADO(ActiveX Data Objects)。所以,平常的,我們會認爲Delphi提供的ADO的功能應該和原本的ADO的功能相同,或者有所提高。而不是有自己獨特的行爲模式。這樣,才能保證我們在系統移植時能夠比較容易。 備註: 之所以提出此問題,是由於我們在進行系統轉換時(VB -> Delphi)發生了一系列問題。而經過痛苦的調試,才發現了在VB和Delphi下ADOConnection的行爲有之前提到的不同。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |