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

如果我只想停止执行并报告错误,在Delphi TDataSetProvider.onUpdate中该怎么做?,delphi,error-handling,tclientdataset,tdatasetprovider,Delphi,Error Handling,Tclientdataset,Tdatasetprovider,我有一个带有TIBQUery TDataSetProvider TClientDataSet的Delphi应用程序,它或多或少地模拟了CachedUpdates模式(在以前的BDE组件中)。目前没有错误处理代码,因此根本没有错误消息。我只想启用以下场景:当查询遇到来自数据库的任何错误时,所有链都应该停止工作,保持当前值,回滚已经发布的更改并显示消息。我猜-所有这些都可以通过实现TDataSetProvider.onUpdate错误来完成。我有两个代码建议。第一: procedure TBillD

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

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
的指导原则是什么?我希望在应用程序中实现零智能-我只能提供更有意义的完整错误消息,但所有更正都应由用户完成。

如果您希望使应用程序具有多层结构,则不希望在提供商事件处理程序中显示消息。只需使用最大错误计数为0的cds.applyUpdate,并使用OnReconcienceError事件处理程序。以下是“应用更新”帮助主题的摘录:
ApplyUpdate采用单个参数MaxErrors,该参数指示提供程序在中止更新过程之前应允许的最大错误数。如果MaxErrors为0,则一旦发生更新错误,整个更新过程即终止。不会将任何更改写入数据库,客户端数据集的更改日志也会保留完好无损”。这不是你想要的吗?

如果你想让你的应用程序多层化,你就不想在提供者事件处理程序中显示消息。只需使用最大错误计数为0的cds.applyUpdate,并使用OnReconcienceError事件处理程序。以下是“应用更新”帮助主题的摘录:
ApplyUpdate采用单个参数MaxErrors,该参数指示提供程序在中止更新过程之前应允许的最大错误数。如果MaxErrors为0,则一旦发生更新错误,整个更新过程即终止。不会将任何更改写入数据库,客户端数据集的更改日志也会保留完好无损”。这不是你想要的吗?

你是否尝试过处理
TIBUpdateErrorEvent
并指定更新操作
uaAbort
uaFail
?只需抛出一个异常。这是一种常见的模式,RTL甚至有一个abort方法,它抛出一个“静默”异常。它将打破流动。简单的解决方法,在没有其他解决方法的事件中也可用。不要抛出异常。在控制流中使用异常被认为是不好的做法。如果不必抛出异常,请不要抛出异常,并尽快捕获其他异常并将其转换为正常的应用程序流。在这种情况下,设置解析器响应以表明您不想继续。请听Golez的,而不是Golez!您是否尝试过处理
TIBUpdateErrorEvent
并指定更新操作
uaAbort
uaFail
?只需抛出异常即可。这是一种常见的模式,RTL甚至有一个abort方法,它抛出一个“静默”异常。它将打破流动。简单的解决方法,在没有其他解决方法的事件中也可用。不要抛出异常。在控制流中使用异常被认为是不好的做法。如果不必抛出异常,请不要抛出异常,并尽快捕获其他异常并将其转换为正常的应用程序流。在这种情况下,设置解析器响应以表明您不想继续。请听Golez的,而不是Golez!