【发布时间】:2017-03-09 13:14:46
【问题描述】:
我正在开发一个通过TSimpleDataSet(dbExpress 组件)在DBGrid 中显示信息的软件
有问题的软件由 2 个不同的人在 2 台不同的计算机上使用。
他们都在不同的时间查看和编辑相同的信息。
我正在尝试找出一种方法来自动更新计算机 B 上的 DBGrid(或者更确切地说是 DataSet,对吗?),一旦计算机 A 对一行进行更改(编辑某些东西/什么),反之亦然.
目前我已经设置了一个名为Refresh 的TButton,一旦点击它就会执行以下代码:
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 数据库。
谢谢!
【问题讨论】:
-
当然更好的方法是由数据库服务器通知。为此,数据库服务器(如果有的话)需要提供这样的功能,并且访问驱动程序也需要支持它。 DBX 可能不会,但应该可以使用辅助连接。就像 IBEventAlerter 一样,例如 interbase/firebird。
-
为什么这会比计时器更好?只是出于好奇。另外,我正在使用 MySQL,是的,数据集已连接到数据库
-
您的程序不需要经常敲击服务器。可能 99% 的刷新都是空手而归。如果您延长间隔以避免这种情况,那么您将承担不通知更改的风险。
-
按照您的方式进行操作需要重复往返服务器(每次调用 MergeChangeLog,一次调用 ApplyUpdates,一次调用 Refresh),其中绝大多数除了浪费网络带宽和CPU 周期。想象一下在办公室里移动的文件。您的代码相当于沿着大厅跑到同事的办公桌前寻找新工作,回到您的办公桌,然后又立即回到大厅。不是认真去工作的,对吧?使用服务器通知意味着坐在你的办公桌前工作,然后让你的同事在工作到达时给你打电话。
-
@KenWhite 你的例子让我大笑起来,哈哈。所以基本上我可以设置你提到的服务器通知并将其绑定到我的软件,以便它在收到通知时更新(触发计时器/Tbutton?)?希望我做对了。如果是这样,我想这有很多事情要做,而且不适合这个问题,所以你能在评论中提供一些链接,这样我就可以阅读并开始这个问题了吗?谢谢!
标签: delphi dataset refresh dbgrid ttimer