我有一个旧的 Delphi 7 应用程序,它从一个数据库表中加载数据,进行许多操作和计算,最后将记录写入目标表。
出于性能原因,这个旧应用程序每 500 条记录调用一次 ApplyUpdates 。
问题是,有时,在这一堆记录中存在一个会触发数据库约束的记录;Delphi在 ApplyUpdates 上引发异常。
我的问题是我不知道是哪条记录导致了这个异常。有500名候选人!
是否可以询问 TClientDataset 哪个是违规记录?
我不想为速度问题对每个附加记录应用更新。
我有一个旧的 Delphi 7 应用程序,它从一个数据库表中加载数据,进行许多操作和计算,最后将记录写入目标表。
出于性能原因,这个旧应用程序每 500 条记录调用一次 ApplyUpdates 。
问题是,有时,在这一堆记录中存在一个会触发数据库约束的记录;Delphi在 ApplyUpdates 上引发异常。
我的问题是我不知道是哪条记录导致了这个异常。有500名候选人!
是否可以询问 TClientDataset 哪个是违规记录?
我不想为速度问题对每个附加记录应用更新。
我认为您可以尝试为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
描述了更新应用工作流程。
实施OnReconcileError
将使您能够访问导致异常的记录和数据。一个简单的方法是添加一个“协调错误对话框”。它位于文件 | 显示的“新项目”对话框中。新 | 其他。一旦你将它添加到你的项目中并在客户端数据集的表单中使用它。下面的代码展示了它是如何被调用的。
procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet;
E: EReconcileError; UpdateKind: TUpdateKind;
var Action: TReconcileAction);
begin
Action := HandleReconcileError(DataSet, UpdateKind, E);
end;
它将显示而不是异常对话框。它将允许您查看有问题的数据并选择您希望如何进行。自从我上次使用它已经超过 5 年了,希望我没有忘记一些细节。