Delphi 德尔福+;FireDAC在ApplyUpdate上获取数据库错误

Delphi 德尔福+;FireDAC在ApplyUpdate上获取数据库错误,delphi,transactions,firebird,master-detail,firedac,Delphi,Transactions,Firebird,Master Detail,Firedac,在内存中使用FireDAC(CachedUpdates),我很难找到正确的方法来获取ApplyUpdate方法上的错误 以下是我的场景,一个主-细节关系,由以下因素构成: 1TFD连接 2TFDQuery 2TDataSource 1TFDSchemaAdapter 这两个查询都设置为CachedUpdates,并链接到FDSchemaAdapter。 FDQuery2(详细信息)通过MasterSource属性与主机链接主字段和索引字段名称设置为“idMaster”。属性FetchOpti

在内存中使用FireDAC(CachedUpdates),我很难找到正确的方法来获取
ApplyUpdate
方法上的错误

以下是我的场景,一个主-细节关系,由以下因素构成:

  • 1
    TFD连接
  • 2
    TFDQuery
  • 2
    TDataSource
  • 1
    TFDSchemaAdapter
这两个查询都设置为
CachedUpdates
,并链接到
FDSchemaAdapter
FDQuery2
(详细信息)通过
MasterSource
属性与主机链接<代码>主字段和
索引字段名称
设置为“idMaster”。属性
FetchOptions.DetailCascade
也被选中

我还有一个按钮来执行应用:

  try
    FDConnection1.StartTransaction;

    FDSchemaAdapter1.ApplyUpdates(0);

    FDQuery1.CommitUpdates;
    FDQuery2.CommitUpdates;

    FDConnection1.Commit;
  except on E: Exception do
    begin
      FDConnection1.Rollback;
      raise Exception.CreateFmt('Something went wrong. Error: %s', [E.Message]);
    end;
  end;
到目前为止一切正常

当我的数据库抛出异常时,就会出现问题,例如违反约束。例外情况不是提出。因此,我的事务不是“回滚”的

ps:我使用Delphi XE7和Firebird 2.5作为状态:

ApplyUpdate返回遇到的错误数。基于 已成功应用此返回值和Amaxerror设置 将从集中式更改日志中删除更新。如果更新 在应用所有更新之前中止进程,任何未应用的更新 更新仍保留在更改日志中

ApplyUpdate不会引发 例外。相反,应用程序应该检查错误的记录 使用Reconcide和OnReconcileRow事件处理程序或 每个数据集的FilterChanges和RowError属性。更多 详细信息,请阅读缓存更新时的“查看错误”


所以。。。您不应该期望出现异常,但您应该检查ApplyPDates返回的值,以确定是否可以提交或处理错误。

可能是在某个地方捕获和沉默异常。要找到答案:确保在“工具|选项|调试器选项”下选中了“语言异常通知”,并在“项目|选项”下选中了“使用调试DCU”。将应用程序运行到您期望发生异常的位置,并查看调试器是否中断执行。如果是,请使用View | Debug windows |调用堆栈来定位它。@MartynA只有在调试模式下才会触发ApplyUpdate异常。我已经尝试过使用OnReconcienceError事件,但没有成功当我使用ClientDataSet时,仅使用OnReconcienceError事件就足以捕获错误消息。顺便说一句,FireDAC并没有那么简单,因为我已经尝试使用FDSchemaAdapter.Reconcile和OnReconcileRow,但到目前为止没有成功:-(