最新消息:

delphi FireDAC使用ApplyUpdates批量提交数据-delphi资料

其他技术 koic_zhzz 408浏览 0评论

简单的设计一下界面,大致如下:

要求:审核或者反审核用户选择的数据

1.正常点审核时,审核=true,审核人=当前用户名

2.反审核时,审核=false,审核人=nulldelphi FireDAC使用ApplyUpdates批量提交数据-1

实现代码:

procedure TForm1.UpdateData(flg: Boolean);
var
  i, n, Errors: Integer;
  PN, ID: string;
begin
  if flg then
    PN := 'TEST'     //用户名,按业务自己处理
  else
    PN := 'NULL';    //反审核,按业务自己处理

  with FDQuery1 do
  begin
    FetchOptions.AutoClose := False;  //取消自动关闭
    CachedUpdates := True;            //开户快储功能
    n := TV.datacontroller.GetSelectedCount;     //当前选择记录的长度
{*
  我不知道你们有没有出现过这种问题,当我ctrl+a全选数据时,就会弹错,原因是此时recno指到了最后一条记录
  导致下面的 TV.Controller.SelectedRows[i].Focuesd:=true; 语句出错,所以我下面做了个判断,当选择了所有的记录时,手动把游标移动到了第一条
*}
  if n=RecordCount then  
   frist;
 try 
    for i := 0 to n - 1 do
     begin 
     TV.Controller.SelectedRows[i].Focuesd:=true;
        Edit;
        FieldByName('审核').Value := BoolToStr(flg);//按业务自己处理
        FieldByName('审核人').Value := PN;//按业务自己处理
        Next;
      end;
      FDConnection1.StartTransaction;     //开始事务
      Errors := ApplyUpdates(0);        //尝试批量更新,并返回错误值
    finally
      if Errors > 0 then
        FDConnection1.Rollback  //出错回滚
      else
      begin
        FDConnection1.Commit;  
        CommitUpdates;  // 清除所有异动记录
        Refresh;          //更新数据
      end;
      CachedUpdates := False;      //关闭快储
    end;
  end;
end;
 Errors := ApplyUpdates(0);
 参数为0时,表示不容忍任何错误,直接回滚
 参数为-1时,表示尽量保存修改,更新完后再报错误.
比如你要更新十条数据,其中有五条会成功,五条会失败,此时如果你参数为0的话,程序就会直接放弃所有变更,也就是不更新了.如果参数为-1,则会更新五条,然后再告诉你有五条出错了

我用SQL语句一句句的更新,同样53条数据的时间对比如下,也不知道是不是我的数据量太少,没有体现出ApplyUpdates的性能,还是什么原因.服务器的负荷是减少了,但花费的时间变多了

delphi FireDAC使用ApplyUpdates批量提交数据-2 说一下多选数据时的问题:

然后ACXTV.Controller.SelectedRows[i].index这个属性,在使用时也要注意一下,这个值不一定会等于RecNo的值,所以我们不能用它来设置游标位置. delphi FireDAC使用ApplyUpdates批量提交数据-3

2023-02-18

以下是ChatGPT的回复

---
Q: 请用delphi写出用tfdquery组件实现批量更新的代码,要带注释
A:
//定义变量
var
  FDQuery1: TFDQuery;
  i: Integer;

//初始化
FDQuery1 := TFDQuery.Create(nil);

//设置SQL语句
FDQuery1.SQL.Text := 'update table set field1=:field1,field2=:field2 where id=:id';

//循环更新
for i := 0 to 10 do
begin
  FDQuery1.ParamByName('field1').AsString := 'value1';
  FDQuery1.ParamByName('field2').AsString := 'value2';
  FDQuery1.ParamByName('id').AsInteger := i;
  FDQuery1.ExecSQL;
end;

//释放资源
FDQuery1.Free;---

转载请注明:落伍老站长 » delphi FireDAC使用ApplyUpdates批量提交数据-delphi资料

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址