1

我正在开发一个DBGrid通过TSimpleDataSet(dbExpress 组件)显示信息的软件

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

他们都在不同的时间查看和编辑相同的信息。我正在尝试找出一种方法来自动更新计算机 B 上的DBGrid(或者更确切地说是DataSet,对吗?),一旦计算机 A 对一行进行更改(编辑某些内容/任何内容),反之亦然。

目前我已经设置了一个TButton名称Refresh,一旦点击执行以下代码:

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 连续编辑信息时,计算机 BDBGrid应该相应地更新它的显示,而无需单击刷新按钮。

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

我的实际问题是:

有没有比 a 更好的方法TTimer呢?如果有,请详细说明。此外,如果TTimer路线是去任何进一步信息的方式,您可能会发现对状态有用的信息将不胜感激(赞成和反对等)

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

谢谢!

4

2 回答 2

2

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

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

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

并注意它没有列出 MySql。

幸运的是,我认为有一种变通方法对于像您目前这样的小型系统来说应该是可行的。据我了解,您和您同事的 PC 在 LAN 上,而 MySql Server 在您的 LAN 之外和 Internet 上。在这种情况下,你们中的一个人不需要往返服务器就可以获得另一个人更改了数据库中的某些内容的通知。使用类似于 Ken 的类比,您可以俯身在桌子上对您的同事说:“嘿,我改变了一些东西,所以您需要刷新数据。”

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

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

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

要更新我正在谈论的共享文件,您需要在写入时锁定它。这个答案:

如何获得在 Delphi 中锁定文件的句柄?

将向您展示如何做到这一点。

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

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

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

我希望这一切都清楚,如果没有,请问。

于 2016-10-27T15:08:45.543 回答
1

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

于 2018-08-08T08:25:13.410 回答