自动刷新TDataSet / DBGrid

时间:2016-10-27 01:29:15

标签: delphi dataset refresh dbgrid ttimer

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

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

他们在不同时间查看和编辑相同的信息。 我试图想办法在计算机A对某行进行更改后自动更新计算机B上的DBGrid(或更确切地说,DataSet,对吧?)(编辑某些内容/其他内容)反之亦然。

目前我已经设置了一个名为TButton的{​​{1}},一旦点击就会执行以下代码:

Refresh

一旦点击,这很好并按预期工作。 我想要一个自动更新功能,例如当计算机A连续编辑信息时,计算机B的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; 应该相应地更新它的显示,而不需要单击刷新按钮。

我想我会使用DBGrid并在两台PC上的两个软件上以特定间隔设置它。

我的实际问题是:

对于这个,有没有比TTimer更好的方法?如果是这样,请详细说明。 此外,如果TTimer路线是进行任何进一步信息的方式,您可能会发现有用的状态将被赞赏(赞成和con等)

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

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

并注意它没有列出MySql。

幸运的是,我认为有一种解决办法对于像你这样的小型系统应该是可行的。据我了解,您和您的同事的PC位于局域网上,而MySql Server位于局域网和互联网之外。在这种情况下,它不需要到服务器的往返,以便其中一个人获得另一个已经改变了数据库中某些内容的通知。使用类似于Ken的类比,你可以趴在桌子上并对你的同事说'嘿,我已经改变了一些东西,所以你需要更新你的数据。& #34;

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

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

这个主题有很多变化,我相信你会很明显;实施细节真的不重要。

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

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

将告诉你如何做到这一点。

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

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

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

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

答案 1 :(得分:1)

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