DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: shz0000
今日帖子: 0
在线用户: 5
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 fxl33331 (fan) ★☆☆☆☆ -
普通会员
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版本
都是什么?
我也试一下。
----------------------------------------------
-我的博客
作者:
男 fxl33331 (fan) ★☆☆☆☆ -
普通会员
2020/6/29 13:28:41
2楼: uniDAC版本:7.4.12
数据库:SQL2008
delphi版本:10.3


上面说的

(目前有一种情况:删除Z3,再增加一条记录Z4,程序里面已经更新了UniQuery数据)

写错了,应该是删除Z2

下面的例子还使用了DEV表格控件
此帖子包含附件:fxl33331_2020629132841.rar 大小:54.2K
----------------------------------------------
-
作者:
男 blacktulip (blacktulip) ★☆☆☆☆ -
盒子活跃会员
2020/6/30 9:25:04
3楼: 理解成 a、b列是联合主键,
b列 取a列相等时b列的最大值,什么问题都没有了。要从数据库里取
----------------------------------------------
-
作者:
男 fxl33331 (fan) ★☆☆☆☆ -
普通会员
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;
此帖子包含附件:fxl33331_2020630111130.rar 大小:54.7K
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
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/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行104.9805毫秒 RSS