delphi FireDAC 批量执行命令(批量插入、更新、删除)

发布时间 2023-09-01 19:54:46作者: txgh

FireDAC 批量执行命令(批量插入、更新、删除)

代码

批量插入

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  //建立连接
  FDConnection1.Connected := True;
  //开启事务
  FDConnection1.StartTransaction;
  try
    //设置语句
    FDCommand1.CommandText.Text := 'INSERT INTO tceshi VALUES(:ID, :Code, :Name, :Amount)';
    //设置参数类型和大小(ftString / ftWideString不设置大小会使用默认大小,占用缓冲区大小)
    FDCommand1.ParamByName('ID').DataType := ftInteger;
    FDCommand1.ParamByName('Code').DataType := ftString;
    FDCommand1.ParamByName('Code').Size := 10;
    FDCommand1.ParamByName('Name').DataType := ftString;
    FDCommand1.ParamByName('Code').Size := 20;
    FDCommand1.ParamByName('Amount').DataType := ftFloat;
    //设置插入的记录数
    FDCommand1.Params.ArraySize := 10000;
    //设置插入的内容
    for I := 0 to FDCommand1.Params.ArraySize - 1 do
    begin
      FDCommand1.ParamByName('ID').AsIntegers[I] := I + 1;
      FDCommand1.ParamByName('Code').AsStrings[I] := I.ToString;
      FDCommand1.ParamByName('Name').AsStrings[I] := I.ToString;
      FDCommand1.ParamByName('Amount').AsFloats[I] := I * 1.2;
    end;
    //设置进度条
    ProgressBar1.Max := 100;
    ProgressBar1.Position := 0;
    //循环批量提交
    for I := 1 to 100 do
    begin
      //从第0个索引项开始,插入100条记录
      //FDCommand1.Execute(100, 0);
      //从第100个索引项开始,插入200条记录
      //FDCommand1.Execute(300, 100);
      //循环执行,每次插入100条记录
      FDCommand1.Execute(100 * I, 100 * (I - 1));
      //更新进度条
      ProgressBar1.Position := I;
      Application.ProcessMessages;
    end;
    //提交事务
    FDConnection1.Commit;
  except on E: Exception do
    //回滚事务
    FDConnection1.Rollback;
  end;
end;

方法

FireDAC.Comp.Client.TFDCustomCommand.Execute

FireDAC.Comp.DataSet.TFDDataSet.Execute

procedure Execute(ATimes: Integer = 0; AOffset: Integer = 0; ABlocked: Boolean = False);

执行CommandText指定的SQL命令,它不返回结果集。如果命令返回结果集,则所有结果集都将被丢弃。

TFDCustomCommandTFDQueryTFDStoredProc 具有 Execute (ATimes: Integer = 0; AOffset: Integer = 0) 方法。

命令将从 AOffset 行开始执行 (ATimes - AOffset) 次。 ATimes 必须等于或小于 Params.ArraySize

参数

ATimes 定义了数组的长度。

AOffset 是数组中第一个项的索引。

参考

https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Array_DML_(FireDAC)