TClientDataSet.ApplyUpdates()不应用更新

时间:2016-07-03 16:01:52

标签: delphi ado tclientdataset

我的Delphi项目在MS Sql Server 2014服务器上有一个TAdoQuery访问数据,以及通过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之间的“对话”细节进行操作,以便在服务器上应用更新。

1 个答案:

答案 0 :(得分:5)

我最近在一个快速的项目中遇到了这个问题,我没有预先设置OnReconcileError处理程序,而是由@mjn查询。

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

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

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

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

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

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

然而,令我困惑的是,你的q提示,我将主键索引丢弃在我的服务器表上,问题还没有再次开始(!)。我猜这是因为我的机器上有某种缓存效果,但我现在不想重新启动它来进行调查。