【问题标题】:TClientDataset ApplyUpdates error because of database table constraint由于数据库表约束,TClientDataset ApplyUpdates 错误
【发布时间】:2012-04-22 20:54:19
【问题描述】:

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

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

问题是,有时,在这一堆记录中存在一个会触发数据库约束的记录; Delphi 触发 ApplyUpdates 异常

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

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

我不想为速度问题对每个附加记录应用更新。

【问题讨论】:

  • 可能最好的方法是仅在异常之后对 500 条记录应用更新。
  • @philnext 我不明白你的意思。
  • ApplyUpdates 对 500 条记录,如果一切正常,对接下来的 500 条记录执行此操作,如果您有异常,请为每条 500 条记录应用更新,直到出现异常,处理它并继续.. .
  • @philnext:已经是这样了。问题是我需要知道导致异常的一条记录; TLama指出了好的方向

标签: database delphi delphi-7 tclientdataset


【解决方案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 描述了更新应用工作流。

【讨论】:

  • 但是something 告诉我它可能会起作用,请参阅ApplyUpdates 做什么的段落。
  • 我已经扩展了我未经测试的代码,我认为可能会显示消息,其中包含有关无法更新的记录的信息以及描述原因的错误。
  • 希望如此,遗憾的是我现在无法验证这一点。那么,您能否在测试后提供一些反馈,好吗?谢谢!
  • 关于Action 值描述here 的一件事。我使用了raSkip 恕我直言,这意味着您跳过记录更新错误但将其保留在更改日志中,因此在没有该记录修复的情况下下一次尝试ApplyUpdates 将再次引发此问题。也许raCancel 可能更适合你。它应该恢复数据集上这条记录的更改(所以在插入时,它应该从数据集中删除它);或raRefresh 应该将记录值更新为服务器端的值。
  • 谢谢,我已经在 ReconcileErrorEvent 中快速测试了类似您的显示消息,它看起来可以正常工作。对软件的更改现在已冻结,但如果错误再次出现,我将确切知道该怎么做:登录到文件和 Action=raCancel。再次感谢您
【解决方案2】:

实施OnReconcileError 将使您能够访问导致异常的记录和数据。一个简单的方法是添加一个“协调错误对话框”。它位于文件 | 显示的“新项目”对话框中。新 |其他。一旦你将它添加到你的项目中并在客户端数据集的表单中使用它。下面的代码展示了它是如何被调用的。

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

它将显示而不是异常对话框。它将允许您查看有问题的数据并选择您希望如何进行。距离我上次使用它已经 5 年多了,希望我没有忘记一些细节。

【讨论】:

    猜你喜欢
    • 2018-07-14
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多