ADOCommand.Execute方法無法取RecordsAffected值 |
尚未結案
|
Arlung Miao
初階會員 發表:9 回覆:44 積分:25 註冊:2004-08-25 發送簡訊給我 |
各位大蝦,本人使用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 發送簡訊給我 |
|
Arlung Miao
初階會員 發表:9 回覆:44 積分:25 註冊:2004-08-25 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
我指的是 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 發送簡訊給我 |
弄明白了。沒有注意到這裡有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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |