如果我只想停止执行并报告错误,在 Delphi TDataSetProvider.OnUpdateError中该怎么做?

8cdiaqws  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(136)

我有 Delphi 应用程序,它带有TIBQUery-TDataSetProvider-TClientDataSet,或多或少地模拟了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的指导方针是什么?我希望应用程序中没有智能-我只能提供更有意义的错误消息,但所有的更正都应该由用户完成。

rfbsl7qr

rfbsl7qr1#

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

相关问题