浏览数据集时显示实际的数据库数据(FireDac,FDQuery)

时间:2015-10-29 07:54:26

标签: delphi firedac

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

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

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

问题:

想象一下,有2个用户(用户A和用户B)记录了它。 所以我的应用程序在2台不同的PC上打开了2次。

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

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

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

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

before after

-

因此,如果用户浏览数据集,他会从查询中获取数据值。

-

当前解决方案:

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

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

-

修改上述事件是解决我问题的“正确”方法,还是有更好的方法来实现我的目标?

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

1 个答案:

答案 0 :(得分:2)

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

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

另请参阅:Database Alerts (FireDAC)

  

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

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