【问题标题】:What to do in Delphi TDataSetProvider.OnUpdateError if I just want to stop execution and report error?如果我只想停止执行并报告错误,在 Delphi TDataSetProvider.OnUpdateError 中该怎么办?
【发布时间】:2018-12-12 14:53:05
【问题描述】:

我有带有 TIBQUery-TDataSetProvider-TClientDataSet 的 Delphi 应用程序,它或多或少地模拟了 CachedUpdates 模式(在之前的 BDE 组件中)。目前没有错误处理代码,因此根本没有错误消息。我只想启用以下场景:当查询遇到来自数据库的任何错误时,所有链应该停止工作,保持在当前值,回滚已经发布的更改并显示消息。我猜——所有这些都可以通过实现 TDataSetProvider.OnUpdateError 来完成。我有 2 个代码提案。第一个:

procedure TBillDM.BillProvUpdateError(Sender: TObject;
  DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
  var Response: TResolverResponse);
begin
  inherited;
  raise E;
end;

另一种变体:

procedure TBillDM.BillProvUpdateError(Sender: TObject;
  DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
  var Response: TResolverResponse);
begin
  inherited;
  Response:=rrAbort;
  BillQry.Transaction.RollbackRetaining;
  ShowMessage(E.Message);
end;

这些代码模式是否合理?如果只想停止执行并报告错误,OnUpdateError 的指导方针是什么?我希望应用程序中的零智能 - 我只能提供更有意义的错误消息,但所有更正都应由用户完成。

【问题讨论】:

  • 您是否尝试过处理TIBUpdateErrorEvent 并指定uaAbortuaFail 的UpdateAction?
  • 只要抛出一个异常。这是一种常见的模式,RTL 甚至具有抛出“静默”异常的 abort 方法。它会破坏流动。简单的出路,也可用于没有其他救助方式的事件。
  • 不要抛出异常。将异常用于控制流被认为是不好的做法。非必要时不要抛出异常,并尽快捕获其他异常并将其转换为正常的应用程序流程。在这种情况下,请将解析器响应设置为指示您不想继续。
  • 听 Golez,而不是 Golez!

标签: delphi error-handling tclientdataset tdatasetprovider


【解决方案1】:

如果您想让您的应用程序多层化,您不希望在提供程序事件处理程序中显示消息。只需使用 cds.ApplyUpdates 和 0 作为最大错误计数并利用 OnReconcileError 事件处理程序。以下是“应用更新”帮助主题的摘录: “ApplyUpdates 采用单个参数 MaxErrors,它指示提供程序在中止更新过程之前应该容忍的最大错误数。如果 MaxErrors 为 0,那么一旦发生更新错误,整个更新过程就会终止。没有变化被写入数据库,并且客户端数据集的更改日志保持不变”。这不是你所追求的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 2021-08-06
    • 1970-01-01
    • 2014-02-13
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多