2016-11-09 101 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;