TClientDataSet.ApplyUpdates() 不应用更新
TClientDataSet.ApplyUpdates() doesn't apply updates
我的 Delphi 项目有一个 TAdoQuery 访问 MS Sql Server 2014 服务器上的数据,以及通过 TDataSetProvider 接收 AdoQuery 数据的 TClientDataSet。这是根据我设置的项目模板创建的。
通常,我发现这个 set-up 可以完美地工作,但是对于这个特定的项目我遇到了一个问题:ApplyUpdates() 无提示地失败并且 Sql 服务器数据没有更新.在我精简的调试项目中,除了调用它的 button-click 处理程序之外,我拥有的唯一代码是:
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 return 怎么可能没有错误但服务器数据集没有得到更新。
首先,我添加了 ChangeCount 显示作为调试问题的一部分。但恐怕我无法了解 DataSetProvider 及其 DataSet 之间 "conversation" 的详细信息中应该发生的事情以在服务器上应用更新。
我 运行 最近在一个快速项目中遇到了这个问题,我在没有设置 OnReconcileError 处理程序的预防措施的情况下匆匆忙忙,正如@mjn 所查询的那样。
一旦我设置了 OnReconcileError 处理程序,很明显问题是提供程序的 TSqlResolver 无法识别要更新的行。 IIrc,ReconcileError 弹出窗体上的消息是 "Unable to locate record. No key specified."
的效果
所以,我尝试的第一件事就是将其包含在我的 CDS 的 AfterOpen 中:
CDS1.Fields[0].ProviderFlags := [pfInKey];
(CDS1.Fields[0]为数据集的PK字段)
出乎我的意料,这并没有解决问题。挠了挠头,仔细看了下服务器,发现我用的最近重新创建的table没有主键索引
一旦我在服务器上创建了主键索引,ApplyUpdates 问题就消失了。
然而,令我困惑的是你的 q 提示,我在我的服务器上删除了主键索引 table 并且问题没有再次出现(!)。我猜这是由于我的机器上的某种缓存效应,但我真的不想现在重新启动它来进行调查。
我的 Delphi 项目有一个 TAdoQuery 访问 MS Sql Server 2014 服务器上的数据,以及通过 TDataSetProvider 接收 AdoQuery 数据的 TClientDataSet。这是根据我设置的项目模板创建的。
通常,我发现这个 set-up 可以完美地工作,但是对于这个特定的项目我遇到了一个问题:ApplyUpdates() 无提示地失败并且 Sql 服务器数据没有更新.在我精简的调试项目中,除了调用它的 button-click 处理程序之外,我拥有的唯一代码是:
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 return 怎么可能没有错误但服务器数据集没有得到更新。
首先,我添加了 ChangeCount 显示作为调试问题的一部分。但恐怕我无法了解 DataSetProvider 及其 DataSet 之间 "conversation" 的详细信息中应该发生的事情以在服务器上应用更新。
我 运行 最近在一个快速项目中遇到了这个问题,我在没有设置 OnReconcileError 处理程序的预防措施的情况下匆匆忙忙,正如@mjn 所查询的那样。
一旦我设置了 OnReconcileError 处理程序,很明显问题是提供程序的 TSqlResolver 无法识别要更新的行。 IIrc,ReconcileError 弹出窗体上的消息是 "Unable to locate record. No key specified."
的效果所以,我尝试的第一件事就是将其包含在我的 CDS 的 AfterOpen 中:
CDS1.Fields[0].ProviderFlags := [pfInKey];
(CDS1.Fields[0]为数据集的PK字段)
出乎我的意料,这并没有解决问题。挠了挠头,仔细看了下服务器,发现我用的最近重新创建的table没有主键索引
一旦我在服务器上创建了主键索引,ApplyUpdates 问题就消失了。
然而,令我困惑的是你的 q 提示,我在我的服务器上删除了主键索引 table 并且问题没有再次出现(!)。我猜这是由于我的机器上的某种缓存效应,但我真的不想现在重新启动它来进行调查。