0

我有带有 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如果只想停止执行并报告错误,有哪些指导方针?我希望应用程序中的零智能 - 我只能提供更有意义的错误消息,但所有更正都应由用户完成。

4

1 回答 1

2

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

于 2018-12-13T06:53:31.873 回答