由于数据库表约束,TClientDataset ApplyUpdates错误

时间:2012-04-10 14:44:04

标签: database delphi delphi-7 tclientdataset

我有一个旧的Delphi 7应用程序,它从一个数据库表加载数据,进行许多操作和计算,最后将记录写入目标表。

由于性能原因,这个旧应用程序会调用 ApplyUpdates每500条记录

问题在于,有时候,在这一堆记录中会出现一个会触发数据库约束的记录; Delphi在ApplyUpdates 上触发异常。

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

是否可以询问TClientDataset哪个是违规记录?

我不希望ApplyUpdates foreach附加记录的速度问题。

2 个答案:

答案 0 :(得分:7)

我认为您可能会尝试为每个无法应用于数据集的记录实施一次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描述了应用工作流程的更新。

答案 1 :(得分:2)

实施OnReconcileError将允许您访问负责该异常的记录和数据。一个容易实现的就是添加一个“Reconcile Error Dialog”。它位于“新项目”对话框中,该对话框由“文件”|显示新的|其他。将它添加到项目中并在带有clientdataset的表单中使用它之后。以下代码显示了如何调用它。

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

将显示而不是异常对话框。它将允许您查看有问题的数据并选择您要继续的方式。自从我上次使用它已经超过5年了,希望我没有忘记一些细节。