delphi FireDAC使用ApplyUpdates批量提交数据
简单的设计一下界面,大致如下:
要求:审核或者反审核用户选择的数据
1.正常点审核时,审核=true,审核人=当前用户名
2.反审核时,审核=false,审核人=null
实现代码:
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的性能,还是什么原因.服务器的负荷是减少了,但花费的时间变多了
说一下多选数据时的问题:
然后ACXTV.Controller.SelectedRows[i].index这个属性,在使用时也要注意一下,这个值不一定会等于RecNo的值,所以我们不能用它来设置游标位置.
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;---