通常,我发现这个设置可以完美地工作,但是对于这个特定的项目,我遇到了一个问题: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处理程序,很明显问题是提供程序的TsqlResolver无法识别要更新的行. Iirc,ReconcileError弹出窗体上的消息是“无法找到记录.没有指定密钥”的效果.
所以,我尝试的第一件事就是把它包含在我的CDS的AfterOpen中:
CDS1.Fields[0].ProviderFlags := [pfinkey];
(CDS1.Fields [0]是数据集的PK字段)
与我的期望相反,这并没有解决它.在我挠了一会儿之后,我仔细查看了服务器,发现我使用的最近重新创建的表没有主键索引.
一旦我在服务器上创建了主键索引,ApplyUpdates问题就消失了.
然而,令我困惑的是,你的q提示,我删除了我的服务器表上的主键索引,问题还没有再次开始(!).我猜这是由于我的机器上的某种缓存效应,但我真的不想立即重启它来调查.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。