加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:28:52 所属栏目:大数据 来源:网络整理
导读:我的Delphi项目在MS Sql Server 2014服务器上有一个TAdoQuery访问数据,而TClientDataSet通过TDataSetProvider接收AdoQuery数据.这是从我设置的项目模板创建的. 通常,我发现这个设置可以完美地工作,但是对于这个特定的项目,我遇到了一个问题:ApplyUpdates()
我的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,ReconcileError弹出窗体上的消息是“无法找到记录.没有指定密钥”的效果.

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

CDS1.Fields[0].ProviderFlags := [pfInKey];

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读