【问题标题】:FireDAC ApplyUpdates without clearing the DeltaFireDAC ApplyUpdates 不清除 Delta
【发布时间】:2021-01-14 01:41:09
【问题描述】:

是否可以在缓存更新模式下在 FireDAC 查询上调用 Applyupdates 而无需清除其 Delta?

这样做的原因是因为我有 4 个 FDQuery,我想一起保存或在其中任何一个出错时一起取消。如果发生任何问题,我可以使用单个事务来回滚所有更改,但这会使每个应用更新成功的 FDQuery 的 Delta 为空。

所以我想调用某种不会清除 Delta 的 ApplyUpdates,并且只有当所有 FDQuery ApplyUpdates 都成功时,我才会提交事务并在每个 FDQuery 上调用 CommitUpdates 以清除它们的 Delta。但是如果其中一个失败,每个 FDQuery 的更改仍将保留在它们的 Delta 中,因此我回滚事务,用户仍然可以修复数据并尝试再次保存它们。

更新:正如@Brian 所评论的,将属性 UpdateOptions.AutoCommitUpdates 设置为 False 可以解决问题并且不会清除 Delta。

【问题讨论】:

  • 看起来将 AutoCommitUpdates 设置为 false 可以实现这一点。文档有点难以阅读 - 但它看起来像清除 delta = 提交对 TFDCustomMemTable 后代的更改。看起来是正确的,因为另一个主题说调用 CommitUpdates 来清除数据集更改日志。
  • 您是否尝试过将TFDSchemaAdapter 用于Centralized Cached Updates
  • 是的,谢谢@PeterWolf。它非常适用于主从关系,但在这种情况下它们是不相关的。
  • 是的,文档中的示例演示了主从场景中的用法,但我认为TFDSchemaAdapter 可以用作单个点来应用来自多个不相关数据集的更新。

标签: delphi firedac delphi-10.4-sydney


【解决方案1】:

UpdateOptions.AutoCommitUpdates 设置为 false 将在调用 ApplyUpdates 时单独保留增量。但是,目前缺少 AutoCommitUpdates 的帮助,并且以令人困惑的方式错误地描述了 False 设置。它应该更像:

AutoCommitUpdates 控制缓存更新的自动提交。

指定是否启用自动提交更新或 已禁用。

  • 如果 AutoCommitUpdates 为 True,则调用 ApplyUpdates 应用的所有成功更新的记录都将自动标记为未更改。您无需显式调用 CommitUpdates。
  • 如果 AutoCommitUpdates 为 False,则您的应用程序必须显式调用 CommitUpdates 以将所有更改的记录标记为未更改。

我输入了一张票来修复帮助:RSP-31141

【讨论】:

  • 还值得注意的是,该属性的默认值似乎是 False(未选中),而实际上它是未定义的,因此 FireDAC 默认应用 AutoCommitUpdates。您需要选中并清除复选框才能真正将其设置为 false。 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多