gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:11:04 25 4
gpt4 key购买 nike

我的 Delphi 项目有一个 TAdoQuery 访问 MS Sql Server 2014 服务器上的数据,以及一个通过 TDataSetProvider 接收 AdoQuery 数据的 TClientDataSet。这是根据我设置的项目模板创建的。

通常情况下,我发现这个设置可以完美地工作,但是对于这个特定的项目,我遇到了一个问题: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提示下,我删除了服务器表上的主键索引,并且问题没有再次发生(!)。我猜测这是由于我的计算机上存在某种缓存效应,但我现在不想重新启动它来进行调查。

关于delphi - TClientDataSet.ApplyUpdates() 不应用更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38171736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com