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

ADOCommand.Execute方法無法取RecordsAffected值

尚未結案
Arlung Miao
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-11 17:28:46 IP:61.235.xxx.xxx 未訂閱
各位大蝦,本人使用ADOCommand.Execute執行Update... SQL語句。如下 但是,我無法通過RecordsAffected參數得知是否有記錄被更改,這是Delphi的Bug嗎(我在VB在測試ADO 2.0 - ADO2.7均沒有問題)? Database: SQL Server 2000
 
var
  cSql: string;
  iAffect: Integer;
  adoCmd: TADOCommand;
  ...
begin
  adoCmd := TADOCommand.Create(nil);
  ...
  cSql := 'UPDATE Table1 SET Field1 = 100 WHERE Field < 100'
  adoCmd.CommandText := cSql;
  adoCmd.Execute(iAffect);
  //以上部分均能正常執行
  //但是即使有記錄被更改,iAffect仍然返回 0
end;    
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-11 21:04:15 IP:219.81.xxx.xxx 未訂閱
請修改成:adoCmd.Execute(iAffect, ''); 詳情請參閱 online help 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
Arlung Miao
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-12 08:46:00 IP:61.235.xxx.xxx 未訂閱
Sryang,感謝你的回答,問題確實得到解決。但是,我不明白其中原因。因爲第二個參數是可選的。爲什麽在Delphi中有問題,而在VB中沒有問題呢? 你提示看Online Help,是指Delphi的亦或MSDN中的關於ADO的Help?(可是兩個我都又看了一遍,但沒有切實的發現) 請大蝦再給盞指路明燈
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-12 13:18:18 IP:211.21.xxx.xxx 未訂閱
我指的是 Delphi 的 on-line help,抱歉沒有說明清楚。    在 Delphi 中,TADOCommand.Execute 有 3 個 overload (函式重載):
function Execute: _Recordset; overload;
function Execute(const Parameters: OleVariant): _Recordset; overload;
function Execute(var RecordsAffected: Integer; const Parameters: OleVariant): _RecordSet; overload;
函式 overload 會由引數的數量和型態來決定使用哪一個 所以,在你原先的寫法,用的是第二個 overload,所以傳入的 iAffect 被當作是 Parameters 這個引數,而修改過後的寫法,用的是第三個 overload,這時 iAffect 才被當作是 RecordsAffected 這個引數 這一部份,請參閱 Delphi 的 on-line help 中 "Overloading procedures and functions" 部分 這跟「可選的引數」意義不同,可選的引數並不是 overload,而是在宣告函式時,引數之後加上了 = (預設值)。例如:
function Foo(index: integer; name: string = 'ABC'): integer;
函式 Foo 有兩個引數:index 是必須傳入的,而 name 可傳可不傳,不傳時的值是 'ABC' 這一部份,請參閱 Delphi 的 on-line help 中 "Default parameters" 部分 至於 VB 使用 ADO Command.Execute 時,引數的順序是這樣的
command.Execute(RecordsAffected, Parameters, Options)
第一個引數就是 RecordsAffected,所以在 VB 中傳一個 int 引數就可以取得這一個 command 執行後影響到的資料列數量。 加油喔,喵~ 發表人 - sryang 於 2005/05/12 14:40:37
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
Arlung Miao
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-12 14:18:15 IP:61.235.xxx.xxx 未訂閱
弄明白了。沒有注意到這裡有Overload的其它方法,而不是可選參數的問題。再次感謝!    另外再請教高人Srlong一個問題: 我在MS-SQL使用TAdoConnection的Execute執行一批次的SQL,如果第二個以後的SQL發生類似違反Not Null約束或者長度超過欄位定義的長度時,Execute方法並不會返回錯誤。而在連接Oracle數據庫時,卻會返回錯誤。Why?    比如:表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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-14 10:33:05 IP:211.21.xxx.xxx 未訂閱
關於這一點,可能是 Oracle 跟 SQL Server 處理批次 SQL 政策不同的關係 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2024-06-28 1:52:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!