打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Clientdataset关于record change by another user错误的总结
Clientdataset提交数据时服务器端比对提交数据Delta中的原始数据,如果比对数据不符则报告上述错误,一般发生在插入操作后更新,对于单表发生错误原因如下:
1 数据库有自增长字段.测试发现ADO可以在插入数据后自动刷新自增长字段值,在afterupdaterecord事件中加入下面语句可以在更新后同步刷新clientdataset
  if (updatekind=ukinsert) then begin
    deltads.FieldByName('name').ReadOnly:=false;
    deltads.FieldByName('name').NewValue:=qry1name.Value;
    deltads.FieldByName('id').ReadOnly:=false;
    deltads.FieldByName('id').NewValue:=qry1ID.Value;
    deltads.FieldByName('myDate').ReadOnly:=false;
    deltads.FieldByName('myDate').NewValue:=qry1myDate.Value;
  end;
resolvetodataset必须为true才行.详细说明见流水号产生一文.DbExpress测试发现无法刷新自增长字段,所以建议在数据库中不要随意使用自增长字段,很多人使用自增长字段只是为了做关键字,从数据库设计的原理上看,这样的做法是对簇索引的极大浪费.
2 数据库字段有Default值,用1的方法刷新Clientdataset可以解决.
3 关键字中有浮点数,日期类(Delphi处理为浮点数)字段,测试发现在Access上面如果使用这些字段,会因为Delphi自身的误差导致无法按照关键字检索到数据,解决方法是用序号或者流水号作为关键字.
4 params造成的数据"消失".很多系统一打开窗口不是查询表所有的数据,而是默认查询当天或者指定查询条件的数据,一般在数据集中设定好Param来配合查询,这时问题就出现了,比如我查询的是当天的业务数据,可以我录入的时候日期是昨天的,在C/S架构中,数据保存后依然在数据集中存在,ado不会因为刷新而使新添加的数据消失.但在midas架构中则有所不同,Clientdataset提交数据后,数据正常插入,Clientdataset中数据也不会因为不满足查询条件而自动消失.但马上提交修改时,privoder接收到修改数据,会自动去关连的ado中查询数据是否存在,此时会出现查询不到数据的情况,报告题目中的错误,我猜测是服务器端没有为客户端保存任何数据和连接,Insert成功后,ado数据集马上被关闭了,下次更新数据时,再根据param打开ado查询,此时就会发生上述错误了.
我的解决方法是Clientdataset.afterapplyupdate中判断更新的数据集是否复核查询条件,如果不满足,则自动扩展查询条件,自动查询一次,这样就不会出现上述错误.
另外,在子母表中,我还没有找到什么方法可以刷新自增长字段和Default字段的方法,因为子表是整个数据集作为一个字段传输的,如果谁有方法和刷新子表字段请通知我一声.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ClientDataSet upWhereKeyOnley
Delphi DataSnap方法实现BLOB字段的读写
TClientDataSet[23]: 使用数据集字段(TDataSetField)
解决DBGridEh遍历记录后不移动当前行位置的方法
FieldByName速度优化
基于Delphi的三层数据库系统的实现方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服