在 Delphi 中通过 TADOCommand 插入数据

Moh*_*mad 0 delphi ado delphi-xe5

我有一个包含四个字段的表,其中一个字段是主键。当我运行以下命令时:

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;
Run Code Online (Sandbox Code Playgroud)

结果是:

在此处输入图片说明

所述Field_1值是0。

(这个结果是由于运行命令:ADOCommand1.Execute(iAffectedRows)

但是有了这个命令,一切都是正确的:ADOCommand1.Execute()

这个问题有解决方案吗?

Rem*_*eau 5

看来您已经有了解决方案 - 调用Execute().

function Execute: _Recordset;
Run Code Online (Sandbox Code Playgroud)

您正在调用 的 1 参数版本Execute(),它不会输出受影响的行数:

function Execute(const Parameters: OleVariant): _Recordset;
Run Code Online (Sandbox Code Playgroud)

通过传递iAffectedRows到这个版本,您将第一个参数值替换为iAffectedRows最初包含的任何值,恰好是 0。

如果要接收受影响的行数,则需要使用 2 参数版本Execute()

function Execute(var RecordsAffected: Integer; const Parameters: OleVariant): _Recordset;
Run Code Online (Sandbox Code Playgroud)

例如:

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;
Run Code Online (Sandbox Code Playgroud)

或者:

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;
Run Code Online (Sandbox Code Playgroud)