-->

因为数据库表约束的TClientDataSet的ApplyUpdates错误(TClientData

2019-09-16 11:09发布

我有一个从一个数据库表中的数据加载一个老德尔福7应用程序,使许多操作和计算,最后将记录写入到目标表。

这旧的应用程序调用每500个记录的ApplyUpdates,演出的原因。

问题是,有时,在这一群人的记录就在于一个将触发数据库约束; 德尔福触发的ApplyUpdates方法例外

我的问题是我不知道哪条记录是负责此异常。 有500名人选!

是否有可能要问的TClientdataSet这是有问题的记录?

我不想对速度问题的ApplyUpdates的foreach追加的记录。

Answer 1:

我想你可能会尝试实现OnReconcileError它正在为不能被应用到数据集中的每个记录触发一次事件。 所以我想尝试下面的代码, raSkip意味着此处跳过当前记录:

procedure TForm1.ClientDataSet1ReconcileError(DataSet: TCustomClientDataSet;
  E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
  Action := raSkip;
  ShowMessage('The record with ID = ' + DataSet.FieldByName('ID').AsString +
    ' couldn''t be updated!' + sLineBreak + E.Context);
end;

但请注意,我以前从来没有尝试这样做,我不知道,如果它不是太晚忽略由提出的错误ApplyUpdates功能。 忘了提,尝试使用传递的参数DataSet应包含不能被更新的记录; 它可能是,以确定哪些记录而引发的问题的方式。

here介绍的工作流应用的更新。



Answer 2:

实施OnReconcileError会给你访问记录和数据负责例外。 一个容易完成,这是增加了“调和错误对话框”。 它位于其上的文件显示“新项目”对话框| 新| 其他。 一旦你把它添加到您的项目,并与ClientDataSet的形式来使用它。 下面的代码显示了它是如何调用。

procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet;
  E: EReconcileError; UpdateKind: TUpdateKind;
  var Action: TReconcileAction);
begin
  Action := HandleReconcileError(DataSet, UpdateKind, E);
end;

它会显示,而不是例外对话框。 这将允许您查看有问题的数据,并选择您要如何继续。 它已经,因为我最后一次使用它超过5年,希望我没有忘记一些细节。



文章来源: TClientDataset ApplyUpdates error because of database table constraint