delphi – TClientDataSet.ApplyUpdates()不应用更新

delphi – TClientDataSet.ApplyUpdates()不应用更新,第1张

概述我的Delphi项目在MS Sql Server 2014服务器上有一个TAdoQuery访问数据,而TClientDataSet通过TDataSetProvider接收AdoQuery数据.这是从我设置的项目模板创建的. 通常,我发现这个设置可以完美地工作,但是对于这个特定的项目,我遇到了一个问题:ApplyUpdates()无提示失败,并且Sql Server数据没有更新.在我的精简版调试项目 我的Delphi项目在MS sql Server 2014服务器上有一个TAdoquery访问数据,而TClIEntDataSet通过TDataSetProvIDer接收Adoquery数据.这是从我设置的项目模板创建的.

通常,我发现这个设置可以完美地工作,但是对于这个特定的项目,我遇到了一个问题:ApplyUpdates()无提示失败,并且sql Server数据没有更新.在我的精简版调试项目中,除了一个调用它的按钮单击处理程序之外,我唯一的代码是:

procedure TForm1.ApplyUpdates;var  Errors : Integer;begin  Errors := ClIEntDataSet1.ApplyUpdates(0);  Caption := IntToStr(Errors) + '/' + IntToStr(ClIEntDataSet1.ChangeCount);end;

执行此 *** 作后,表单的标题当然应为0/0,但它实际上是0/1.所以从表面上看,没有发生任何错误,但CDS的ChangeCount没有被重置为零.我的问题是,ApplyUpdates如何不返回任何错误,但服务器数据集不会更新.

Fwiw,我添加了ChangeCount显示作为我调试问题的努力的一部分.但我担心我无法按照DataSetProvIDer与其DataSet之间的“对话”细节进行 *** 作,以在服务器上应用更新.

解决方法 我最近在一个快速的项目中遇到了这个问题,我没有预先设置OnReconcileError处理程序,如@mjn所查询的那样.

一旦我设置了OnReconcileError处理程序,很明显问题是提供程序的TsqlResolver无法识别要更新的行. Iirc,ReconcileErrord出窗体上的消息是“无法找到记录.没有指定密钥”的效果.

所以,我尝试的第一件事就是把它包含在我的CDS的AfterOpen中:

CDS1.FIElds[0].ProvIDerFlags := [pfinkey];

(CDS1.FIElds [0]是数据集的PK字段)

与我的期望相反,这并没有解决它.在我挠了一会儿之后,我仔细查看了服务器,发现我使用的最近重新创建的表没有主键索引.

一旦我在服务器上创建了主键索引,ApplyUpdates问题就消失了.

然而,令我困惑的是,你的q提示,我删除了我的服务器表上的主键索引,问题还没有再次开始(!).我猜这是由于我的机器上的某种缓存效应,但我真的不想立即重启它来调查.

总结

以上是内存溢出为你收集整理的delphi – TClientDataSet.ApplyUpdates()不应用更新全部内容,希望文章能够帮你解决delphi – TClientDataSet.ApplyUpdates()不应用更新所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1261308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存