2016-11-09 136 views
0

我有一個包含四個字段的表,其中一個字段是主鍵。 當我運行下面的命令:在Delphi中通過TADOCommand插入數據

var 
    iAffectedRows: integer; 
begin 
    ADOCommand1.CommandText := 'insert into table_1(Field_1, Field_2, Field_3) values(:A_Field_1, :A_Field_2, :A_Field_3)';  

    ADOCommand1.Parameters.FindParam('A_Field_1').Value := '100'; 
    ADOCommand1.Parameters.FindParam('A_Field_2').Value := '200'; 
    ADOCommand1.Parameters.FindParam('A_Field_3').Value := '300'; 

    ADOCommand1.Execute(iAffectedRows); 
end; 

結果是:

enter image description here

Field_1值爲0

(此結果是由於運行命令: ADOCommand1.Execute(iAffectedRows)

但是用這個命令一切都是正確:ADOCommand1.Execute()

有沒有解決這個問題的方法?

回答

3

看來你已經有了解決方案 - 調用Execute()的無參數版本。

function Execute: _Recordset; 

要調用的Execute() 1參數版本,這也影響了行不輸出數量:

function Execute(const Parameters: OleVariant): _Recordset; 

通過傳遞iAffectedRows到這個版本,您要更換與第一個參數值無論價值iAffectedRows最初包含,這恰好爲0

如果你想獲得受影響的行數,你需要使用的Execute() 2個參數的版本而不是:

function Execute(var RecordsAffected: Integer; const Parameters: OleVariant): _Recordset; 

例如:

var 
    iAffectedRows: integer; 
begin 
    ADOCommand1.CommandText := 'insert into table_1(Field_1, Field_2, Field_3) values(:A_Field_1, :A_Field_2, :A_Field_3)'; 

    ADOCommand1.Parameters.FindParam('A_Field_1').Value := '100'; 
    ADOCommand1.Parameters.FindParam('A_Field_2').Value := '200'; 
    ADOCommand1.Parameters.FindParam('A_Field_3').Value := '300'; 

    ADOCommand1.Execute(iAffectedRows, EmptyParam); 
end; 

或者:

var 
    iAffectedRows: integer; 
begin 
    ADOCommand1.CommandText := 'insert into table_1(Field_1, Field_2, Field_3) values(:A_Field_1, :A_Field_2, :A_Field_3)';  
    ADOCommand1.Execute(iAffectedRows, VarArrayOf('100', '200', '300')); 
end;