gpt4 book ai didi

delphi - Delphi中是否有某种方法可以缓存主从行并同时发布主从子行

转载 作者:行者123 更新时间:2023-12-03 14:48:58 31 4
gpt4 key购买 nike

我想在内存中发布一些子行,然后有条件地发布它们,或者不将它们发布到底层 SQL 数据库,具体取决于是否发布了父行。我不需要完整的 ORM,但也许只是这样:

  • 用户单击添加医生。添加医生对话框打开。
  • 在添加医生上单击确定之前,在添加医生对话框中,用户添加一名或多名仅保留在内存中的患者。
  • 用户在添加医生窗口中单击确定。现在所有的病人都被存储了,加上新的医生。
  • 如果用户在医生窗口单击取消,则所有医生和患者信息都将被丢弃。

  • 如果您愿意,请尝试想象您如何使用 delphi 数据感知控件和 TADOQuery 或其他 ADO 对象来完成上述操作。如果有一种非 ADO 特定的方法来执行此操作,我也对此感兴趣,我只是将 ADO 扔在那里,因为我碰巧在我当前的应用程序中使用 MS-SQL Server 和 ADO。

    所以在我工作了很短时间的以前的雇主那里,他们有一个名为 TMasterDetail 的类(class)。这是专门为将上述内容添加到 ADO 记录集而编写的。它有时有效,有时却以一些非常有趣且难以修复的方式失败。

    VCL 中是否有任何内置的东西,或者任何第三方组件具有执行此技术的稳健方式?如果不是,我在上面所说的是否需要 ORM?我认为 ORM 被很多人认为是“坏的”,但以上是一种非常自然的 UI 模式,可能会出现在百万个应用程序中。如果我使用的是非 ADO 非 Delphi-db-dataset 工作方式,那么在我可能编写的几乎任何持久层中,上述内容都不会成为问题,但是当具有使用标识值链接的主键的数据库时主行和详细行进入图片,事情变得复杂。

    更新:在这种情况下,交易并不理想。 (提交/回滚对于我的目的来说是一种过于粗糙的机制。)

    最佳答案

    你问两个不同的问题:

  • 如何缓存更新?
  • 如何同时提交对相关表的更新。

  • 缓存更新可以通过多种不同的方式完成。哪个最好取决于您的具体情况:

    ADO 批量更新

    由于您已经声明您正在使用 ADO 访问数据,因此这是一个合理的选择。您只需在打开数据集之前将 LockType 设置为 ltBatchOptimistic 并将 CursorType 设置为 ctKeySet 或 ctStatic。然后在准备好提交时调用 TADOCustomDataset.UpdateBatch。

    注意:底层 OLEDB 提供程序必须支持批量更新才能利用这一点。 SQL Server 提供程序完全支持这一点。

    除了在两个数据集上按顺序调用 UpdateBatch 之外,我知道在持久化数据时没有其他方法可以强制执行主/详细信息关系。
    Parent.UpdateBatch;
    Child.UpdateBatch;

    客户端数据集

    数据缓存是 TClientDataset 的主要原因之一的存在和同步主/从关系一点也不难。

    为此,您像往常一样在两个数据集组件上定义主/详细关系(在您的情况下为 ADOQueryADOTable)。然后创建一个 提供者并将其连接到主数据集。联系 TClientDataset给提供者,你就完成了。 TClientDatset将详细数据集解释为嵌套的数据集字段,可以像任何其他数据集一样访问并绑定(bind)到数据感知控件。

    一旦到位,您只需调用 TClientDataset.ApplyUpdates并且客户端数据集将负责正确排序主/详细数据的更新。

    ORM

    关于 ORM 有很多可以说的。 StackOverflow 上的答案太多了,所以我会尽量简短。

    ORM 最近的名声不好。一些专家甚至将它们标记为反模式。个人认为这有点不公平。对象关系映射是一个很难正确解决的问题。 ORM 试图通过抽象出在关系表和对象实例之间传输数据所涉及的许多复杂性来提供帮助。但就像软件开发中的其他一切一样,没有 Elixir ,ORM 也不异常(exception)。

    对于没有大量业务规则的简单数据输入应用程序,ORM 可能是矫枉过正。但是随着应用程序变得越来越复杂,ORM 开始看起来更具吸引力。

    在大多数情况下,您会想要使用第三方 ORM 而不是自己滚动。编写一个完全符合您要求的自定义 ORM 听起来是个好主意,并且通过简单的映射很容易上手,但您很快就会遇到诸如父/子关系、继承、缓存和缓存失效之类的问题(相信我,我知道这一点)根据经验)。第三方 ORM 已经遇到了这些问题,并花费了大量资源来解决这些问题。

    使用许多 ORM,您可以用代码复杂性换取配置复杂性。他们中的大多数人都在积极努力通过转向约定和政策来减少样板配置。如果您将所有主键命名为 Id而不必映射每个表的 Id列到相应的 Id每个类的属性,您只需将这个约定告诉 ORM,它假定它知道的所有表和类都遵循约定。对于不适用的特定情况,您只需覆盖该约定。我不熟悉 Delphi 的所有 ORM,所以我不能说哪些支持这个,哪些不支持。

    在任何情况下,您都需要设计您的应用程序架构,以便尽可能推迟决定使用哪个 ORM 框架(或就此而言任何框架)。

    关于delphi - Delphi中是否有某种方法可以缓存主从行并同时发布主从子行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10939689/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com