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

标签 delphi ado tclientdataset

我的 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/

相关文章:

delphi - 只读 TClientDataSet 刷新因 key 冲突而失败

delphi - 使用Delphi XE8 Firemonkey + Android 4.4的黑屏

javascript - 在 JavaScript/HTM 页面中禁止 ADO 安全警告

sql-server - SQL Server ERRORLOG 文件中多次登录成功

sql-server - 如何使用 MSSQL 从联接查询中的字段获取表名? (mysql_field_table 等效)

delphi - ClientDataset 在 datasnap 中对以 ' 开头的字符串重新排序来自 Datasetprovider 的表

windows - dll 中的导出是否区分大小写?

string - 零前的Datasnap字符串参数被修剪为零

delphi - CBuilder 中的 HTTP 服务器

delphi - 对象帕斯卡 : TClientDataset Deletions