delphi - 浏览数据集时显示实际数据库数据(FireDac、FDQuery)

标签 delphi firedac

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

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

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

问题:

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

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

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

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

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

before after

--

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

--

当前解决方案:

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

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

--

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

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

最佳答案

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

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

另请参阅:Database Alerts (FireDAC)

The DBMS alert refers to a database notification or alert sent by a database trigger or stored procedure with the purpose of notifying a database client about some events at database side.

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

关于delphi - 浏览数据集时显示实际数据库数据(FireDac、FDQuery),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33408658/

相关文章:

Delphi对象内存分配

datetime - 获取当前日期的年份

delphi - 恢复Delphi环境路径

delphi - FDManager.DeleteConnectionDef 不删除连接定义

delphi - 将长 Unicode 字符串传递给 FireDac TADQuery 参数

SQLite FireDAC 尾随空格

Delphi:从接口(interface)引用调用子类的方法

sql-server - 更新后检索列的值?

sqlite - FDQuery 附加给出错误 "no such table"

sql - 如何使用 ADO 查询参数指定表名和字段名?