【发布时间】: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 实现它。