我很难找到在ApplyUpdates
方法上使用FireDAC在内存中获取错误的正确方法(CachedUpdates)。
这是我的场景,一个主 - 细节关系,复合:
TFDConnection
TFDQuery
TDataSource
TFDSchemaAdapter
这两个查询都设置为CachedUpdates
,并且链接到FDSchemaAdapter
。
FDQuery2
(详细信息)通过MasterSource
属性与主数据链接。 MasterFields
和IndexFieldNames
被设置为" 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
答案 0 :(得分:3)
正如documentation所述:
ApplyUpdates 会返回遇到的错误数。基于 应用此返回值和AMaxErrors的设置成功 更新将从集中更改日志中删除。如果更新 在应用所有更新之前中止进程,任何未应用的更新 更新仍保留在更改日志中。
ApplyUpdates 不会引发 例外。相反,应用程序应该检查错误的记录 使用Reconcile和OnReconcileRow事件处理程序或 每个数据集的FilterChanges和RowError属性。更多 详细信息,请阅读缓存更新中的“查看错误”。
所以...你不应该期待一个异常,但你应该检查ApplyUpdates返回的值,以决定你是否可以提交或处理错误。