自动刷新 TDataSet / DBGrid

Auto refresh a TDataSet / DBGrid

我正在开发一个通过 TSimpleDataSet(dbExpress 组件)

DBGrid 中显示信息的软件

有问题的软件由 2 个不同的人在 2 台不同的计算机上使用。

他们在不同的时间查看和编辑相同的信息。 我正在尝试找出一种方法,一旦计算机 A 对某行进行更改(编辑 something/whatever) 反之亦然。

目前我已经设置了一个名为 RefreshTButton,点击后会执行以下代码:

procedure TForm2.actRefreshDataExecute(Sender: TObject);

begin
    dbmodule.somenameDataSet.MergeChangeLog;
    dbmodule.somenameDataSet.ApplyUpdates(-1);
    dbmodule.somenameDataSet.Refresh;
    dbmodule.somename1DataSet.MergeChangeLog;
    dbmodule.somename1DataSet.ApplyUpdates(-1);
    dbmodule.somename1DataSet.Refresh;
    dbmodule.somename2DataSet.MergeChangeLog;
    dbmodule.somename2DataSet.ApplyUpdates(-1);
    dbmodule.somename2DataSet.Refresh;
    dbmodule.somename3DataSet.MergeChangeLog;
    dbmodule.somename3DataSet.ApplyUpdates(-1);
    dbmodule.somename3DataSet.Refresh;
end;

点击后效果很好,按预期工作。 我想要一个自动更新功能,例如当计算机 A 连续编辑信息时,计算机 B 的 DBGrid 应该相应地更新它的显示,而无需单击刷新按钮。

我想我会使用 TTimer 并将其设置为特定的时间间隔,在两台 PC 的两个软件上。

我的实际问题是:

有没有比 TTimer 更好的方法?如果是这样,请详细说明。 此外,如果 TTimer 路线是通往任何进一步信息的途径,您可能会发现有用的陈述将不胜感激(赞成和反对等等)

我正在使用 Rad Studio 10 Seattle 和 dbExpress 组件,数据集连接到我网站所在主机上的 MySQL 数据库。

谢谢!

好吧,Ken White 和 Sertac Akyuz 肯定是正确的,使用服务器发起的通知来确定何时刷新本地数据集比不断地从服务器重新读取您正在使用的所有数据更可取。

问题 AFAIK 是没有 Emba 提供的通知系统可以与 MySql 一起使用。查看 FireDAC 的数据库警报支持的数据库列表:

http://docwiki.embarcadero.com/RADStudio/XE8/en/Database_Alerts_(FireDAC)

并注意它没有列出 MySql。

幸运的是,我认为有一个解决方法应该适用于像您目前这样的小型系统。据我了解,您和您同事的 PC 位于 LAN 上,而 MySql 服务器位于您的 LAN 之外并位于 Internet 上。在那种情况下,不需要往返服务器就可以让你们中的一个人收到另一个人更改了数据库中某些内容的通知。使用类似于 Ken 的类比,您可以靠在桌子上对您的同事说 "Hey, I've changed something, so you need to refresh your data."

一种非常低技术含量的实现方式是在您的 LAN 上的某处拥有一个你们双方都可以轻松获取的资源,当您对数据库进行更改时可以更新该资源,这意味着另一个你应该从服务器更新你的数据。一种方法是创建一个包含多条记录的小型共享数据文件,每个服务器 db table 一个,它具有某种时间戳或版本 ID 号,当您更新相应的记录时,它会更新服务器 table。然后,您可以定期检查(轮询)此数据文件以查看自上次检查以来给定的 table 是否已更改;显然,如果它有,您然后从服务器重新读取您想要的数据,并更新您从共享文件读取的信息的本地记录。

您可以使用 Delphi 客户端数据集事件的处理程序更新共享文件。

这个主题有很多变体,我相信您会很清楚;实施细节真的无关紧要。

要更新我所说的共享文件,您需要在写入时将其锁定。本回答:

How do I get the handle for locking a file in Delphi?

将向您展示如何操作。

当然,共享的本地资源不一定是数据文件。一种替代方法是使用 Microsoft Message Queue 服务,该服务有时用于此类事情,但学习曲线比共享数据文件更陡峭。

顺便说一句,如果您使用 3 层数据库访问(例如使用 datasnap),这种事情就容易得多(至少在像您这样的小规模上)。 在三层系统中,只有中间层(您编写的 Delphi datasnap 服务器,但这并不难)与服务器通信,客户端仅与中间层通信。这使得中间层服务器很容易在其中一个更改数据库数据时通知其他客户端。

三层安排还有助于最大限度地减少通过 Internet 访问数据库服务器的安全问题,因为您只需要一个到服务器的安全连接,而不是每个客户端一个。但这离你眼前的问题有点远。

我希望所有这些都清楚,如果没有,请问。

只需使用计时器并使其每 5 分钟刷新一次数据集。没什么大不了的。 如果使用不频繁,则可以将其设置为每 10 或 15 分钟触发一次。 如果定时器设置的时间间隔较长,则没有任何问题。 今天的宽带连接可以轻松处理流量,Access 也可以。 如果table当然不是很大。