首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动刷新TDataSet / DBGrid

自动刷新TDataSet / DBGrid
EN

Stack Overflow用户
提问于 2016-10-27 01:29:15
回答 2查看 3.5K关注 0票数 1

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

该软件由两个不同的人在两台不同的计算机上使用。

他们在不同的时间查看和编辑相同的信息。我正在试图找到一种方法来自动更新DBGrid (或者更确切地说,DataSet,对吗?)在计算机B上,一旦计算机A改变了一行(编辑某物/其他东西),反之亦然。

目前,我已经设置了一个名为TButtonRefresh,一旦单击该Refresh,将执行以下代码:

代码语言:javascript
复制
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路径是进一步了解您可能发现的有用信息的方法,我们将不胜感激(pro和con,等等)。

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-27 15:08:45

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

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

(FireDAC)

请注意,它没有列出MySql。

幸运的是,我认为有一个工作应该是可行的,像你现在这样的小系统。据我所知,你和你同事的电脑在局域网上,而MySql服务器在你的局域网和互联网之外。在这种情况下,您中的一个不需要往返到服务器,就可以得到另一个在数据库中更改了什么的通知。用一个类似肯的比喻,你可以俯身在桌子上,对你的同事说:“嘿,我改变了一些东西,所以你需要刷新你的数据。”

一种非常低技术的实现方法是在局域网的某个地方拥有一种资源,您可以很容易地访问它,当您对DB进行更改时,您可以更新它,这意味着其他人应该从服务器更新您的数据。一种方法是有一个小的、共享的数据文件,其中包含许多记录,每个服务器db表都有一个,它有某种时间戳或版本ID号,在更新相应的服务器表时会被更新。然后,您可以定期检查(轮询)此数据文件,以查看自上次检查以来给定表是否发生了更改;显然,如果有,则从服务器重新读取所需的数据,并更新从共享文件中读取的信息的本地记录。

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

在这个主题上有很多不同的地方,我相信你会很清楚;实现的细节并不重要。

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

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

会教你怎么做。

当然,共享的本地资源不必是数据文件。另一种选择是使用Microsoft消息队列服务,该服务有时用于这类事情,但其学习曲线比共享数据文件更陡峭。

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

三层安排还有助于将通过互联网访问数据库服务器的安全性问题降到最低,因为您只需要一个到服务器的安全连接,而不是每个客户端一个。但这离你眼前的问题有点远。

我希望这一切都是明确的,如果没有,问一问。

票数 2
EN

Stack Overflow用户

发布于 2018-08-08 08:25:13

只需使用计时器,并使它刷新数据集每5分钟。别小题大作。如果使用不频繁,那么您可以将其设置为每10或15分钟一次。如果计时器设置的间隔较长,则没有任何问题。今天的宽带连接可以轻松地处理流量,也可以接入。当然如果桌子不是很大的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40274682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档