导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2020/6/28 16:48:14
标题:
TUniQuery控件批量更新问题
浏览:1077
加入我的收藏
楼主:
数据表 A B C 1 1 Z1 1 2 Z2 1 3 Z3 A列B列设置成主键 目前有一种情况:删除Z3,再增加一条记录Z4,程序里面已经更新了UniQuery数据为: 1 1 Z1 1 2 Z2 1 3 Z4 当ApplyUpdates时会报错插入重复值 估计可能是因为ApplyUpdates更新机制问题(不知道对不对):先删除记录,再新增记录,最后才更新记录,如果先删除,再更新,最后才删除,这样可能就不会报错了 请问各位师傅,如果使用ApplyUpdates有没有好的办法解决上面的问题?
----------------------------------------------
-
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2020/6/29 8:25:09
1楼:
uniDAC版本,数据库,delphi版本 都是什么? 我也试一下。
----------------------------------------------
-我的博客
作者:
2020/6/29 13:28:41
2楼:
uniDAC版本:7.4.12 数据库:SQL2008 delphi版本:10.3 上面说的 (目前有一种情况:删除Z3,再增加一条记录Z4,程序里面已经更新了UniQuery数据) 写错了,应该是删除Z2 下面的例子还使用了DEV表格控件
----------------------------------------------
-
作者:
2020/6/30 9:25:04
3楼:
理解成 a、b列是联合主键, b列 取a列相等时b列的最大值,什么问题都没有了。要从数据库里取
----------------------------------------------
-
作者:
2020/6/30 11:11:30
4楼:
大概找出问题所在了,估计是跟TUniQuery控件设计逻辑有关,猜测每一次数据改变TUniQuery都会按顺序记录相应的变更信息,批量更新时会按变更顺序依次执行。 所以上述删除第二条记录-->新增记录-->更新B列-->保存为批量更新执行的顺序,这样会导致上述错误 改进:删除第二条记录-->(自动更新记录)-->新增记录-->更新B列-->保存,这样就基本解决了上述问题 只要在TUniQuery的AfterDelete事件中做一次记录更新即可 procedure TForm2.UniQuery1AfterDelete(DataSet: TDataSet); var i:Integer; s:TBookmark; begin try UniQuery1.DisableControls; S := UniQuery1.GetBookmark; UniQuery1.First; i:=0; while not UniQuery1.Eof do begin i:=i+1; UniQuery1.Edit; UniQuery1.FieldByName('B').Value:=i; UniQuery1.Post; UniQuery1.Next; end; UniQuery1.GotoBookmark(S); finally UniQuery1.FreeBookmark(S); UniQuery1.EnableControls; end; end;
----------------------------------------------
-
作者:
2020/6/30 13:52:34
5楼:
感谢分享 经验收下了。
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/