【问题标题】:Show actual database data when browsing through dataset (FireDac, FDQuery)浏览数据集时显示实际的数据库数据(FireDac、FDQuery)
【发布时间】:2016-01-29 06:22:44
【问题描述】:

我正在编写一个使用 FireDac 组件访问多用户数据库的程序。

我有一个“客户”表,我在其中存储了一些客户数据。

用户应该始终看到存储在数据库中的当前实际数据。

问题:

假设有 2 个用户(用户 A 和用户 B)登录了它。 所以我的应用程序在 2 台不同的电脑上打开了 2 次。

两者同时登录并查看相同的数据记录。

用户 A 决定将第一个客户名称从“John Doe”编辑为“Tom Smith”,并将其保存 (.Post) 到数据库中。

新名称现已正确存储在数据库中。

用户 B 仍在查看客户 #1 并且没有看到所做的更改(这很好,因为他在更改后没有浏览或刷新此数据记录)。 但是,如果用户 B 浏览到客户 #2,然后返回到 #1,他仍然会看到旧数据(“John Doe”而不是“Tom Smith”)。

--

因此,如果用户浏览数据集,他会看到查询获取数据时的数据值。

--

当前解决方案:

每次数据集“显示”不同的记录时,都会触发“AfterScroll”/“BeforeScroll”事件。

所以我所做的是在这些事件中调用 FDQuery1.Refresh 以确保显示实际数据。

--

修改所说的事件是解决我的问题的“正确”解决方案还是有更好的方法来完成我想要的?

希望您能理解我的问题并感谢您的阅读。

【问题讨论】:

  • 保存时计算客户 ID。
  • 在 Before/AfterScroll 事件中调用 .Refresh 通常是个坏主意。除了它不符合 TDataSet 的状态和事件的内部模型之外,滚动事件被调用得太频繁以至于没有用处。尝试在网格中连续按下向下键。相反,在 OnTimer 事件中进行刷新,或者更好的是,在后台线程中进行。
  • 顺便说一句,您使用的是什么数据库服务器后端?
  • @MartynA 我目前正在使用 Oracle,但也想支持 MSSQL 和 MySql。
  • 嗯,MJN 给了你一个很好的答案,如果你使用 FireDAC,你可以使用它的事件警报器来处理 MS SQL 和 Oracle。问题是,MySQL 不支持 FireDAC 事件警报器,所以如果你想要一个通用的解决方案来解决这三个问题,你需要别的东西。如果客户端都是 LAN 上的 Windows PC,请考虑使用 MS Message Queue 的 DIY 警报系统;不过,不确定如何为 MySQL 实现它。

标签: delphi firedac


【解决方案1】:

您可以使用单独的通知机制向所有感兴趣的客户广播“新订单到货”、“客户记录已修改”等事件。

一些数据库包含对这种技术的内置支持(例如Firebird events)。它避免了频繁重新加载数据,因此可以最大限度地减少网络流量并提高应用程序的响应能力。

另见:Database Alerts (FireDAC)

DBMS 警报是指数据库通知或警报由 数据库触发器或存储过程,用于通知 数据库客户端关于数据库端的一些事件。

但您不仅限于这些 FireDac 特定警报。您可以使用许多其他方式和协议(例如 Sockets、HTTP、MQTT、STOMP 等)在客户端之间构建自己的、独立于数据库的通知系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多