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

TAdoConnection.Execute 批次執行SQL時可能有陷阱

尚未結案
Arlung Miao
初階會員


發表:9
回覆:44
積分:25
註冊:2004-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-14 16:22:52 IP:61.235.xxx.xxx 未訂閱
我在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-14 17:49:09 IP:211.21.xxx.xxx 未訂閱
在 SQL Server 的線上叢書裡,有 @@ERROR 和 @@ROWCOUNT 的用法,可參考一下 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
Arlung Miao
初階會員


發表:9
回覆:44
積分:25
註冊:2004-08-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-14 20:18:07 IP:219.134.xxx.xxx 未訂閱
我想,我們不太會願意每次用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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-15 13:16:29 IP:219.81.xxx.xxx 未訂閱
@@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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-16 13:12:14 IP:61.235.xxx.xxx 未訂閱
謝謝Sryong提供的資訊。 實際上,我的側重點在於理論上Delphi提供的對ADO支援是基於Microsoft的ADO(ActiveX Data Objects)。所以,平常的,我們會認爲Delphi提供的ADO的功能應該和原本的ADO的功能相同,或者有所提高。而不是有自己獨特的行爲模式。這樣,才能保證我們在系統移植時能夠比較容易。 備註: 之所以提出此問題,是由於我們在進行系統轉換時(VB -> Delphi)發生了一系列問題。而經過痛苦的調試,才發現了在VB和Delphi下ADOConnection的行爲有之前提到的不同。
系統時間:2024-06-28 2:24:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!