Delphi + FireDAC在ApplyUpdates上获取数据库错误

时间:2017-03-29 19:10:11

标签: delphi transactions firebird master-detail firedac

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

这是我的场景,一个主 - 细节关系,复合:

  • 1 TFDConnection
  • 2 TFDQuery
  • 2 TDataSource
  • 1 TFDSchemaAdapter

这两个查询都设置为CachedUpdates,并且链接到FDSchemaAdapterFDQuery2(详细信息)通过MasterSource属性与主数据链接。 MasterFieldsIndexFieldNames被设置为" 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

1 个答案:

答案 0 :(得分:3)

正如documentation所述:

  

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

     

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

所以...你不应该期待一个异常,但你应该检查ApplyUpdates返回的值,以决定你是否可以提交或处理错误。