通过 TADOCommand 在 Delphi 中插入数据
Insert data by TADOCommand in Delphi
我有一个包含四个字段的 table,其中一个字段是主键。
当我运行以下命令时:
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;
结果是:
Field_1值为0。
(此结果是由于 运行 命令:ADOCommand1.Execute(iAffectedRows)
)
但是使用这个命令一切都是正确的:ADOCommand1.Execute()
这个问题有解决办法吗?
看来您已经有了解决方案 - 调用 Execute()
的无参数版本。
function Execute: _Recordset;
您正在调用 Execute()
的 1 参数版本,它不输出受影响的行数:
function Execute(const Parameters: OleVariant): _Recordset;
通过将 iAffectedRows
传递给此版本,您将第一个参数值替换为 iAffectedRows
最初包含的任何值,恰好是 0。
如果要接收受影响的行数,则需要使用 Execute()
的双参数版本:
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;
我有一个包含四个字段的 table,其中一个字段是主键。 当我运行以下命令时:
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;
结果是:
Field_1值为0。
(此结果是由于 运行 命令:ADOCommand1.Execute(iAffectedRows)
)
但是使用这个命令一切都是正确的:ADOCommand1.Execute()
这个问题有解决办法吗?
看来您已经有了解决方案 - 调用 Execute()
的无参数版本。
function Execute: _Recordset;
您正在调用 Execute()
的 1 参数版本,它不输出受影响的行数:
function Execute(const Parameters: OleVariant): _Recordset;
通过将 iAffectedRows
传递给此版本,您将第一个参数值替换为 iAffectedRows
最初包含的任何值,恰好是 0。
如果要接收受影响的行数,则需要使用 Execute()
的双参数版本:
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;