2015-10-06 75 views
1

我正在VPS(Centos6)上运行电子商务订单表的MySQL表。Delphi知道查询刷新后是否有新行

我正在查询桌面应用程序,通知何时有新订单。 我有一个查询(TFDQuery)在FormCreate事件中运行。我用TTimer刷新了这个查询。

是否有一些NATIVE方法来知道刷新后是否存在新行?

我现在在干什么?

我使用query.RecordCount计算行数;在FormCreate上查询后,将其设置为公共变量。在Timer事件中,我正在做同样的事情,但使用本地变量。

-

public 
    a : integer; 
.... 

查询结果后FORMCREATE事件:

a := query.RecordCount; 

计时器事件:

var 
    b: Integer; 
begin 
    query.Refresh(); 
    b:=query.RecordCount; 
    if (b>a) then 
    begin 
    //do what i want to do 
    a := query.RecordCount; 
    end; 
end; 

好了,一切工作正常。但这是正确的方式吗?我一直在寻找像我这样的案件,但我没有找到任何东西。

有没有一些本地的方式来做到这一点?

我确实有DevExpress组件。

+0

无论如何,您是否正在用TTImer刷新其他用途,或者只是为了确定添加的记录? –

+0

我假设你没有行被删除的可能性,否则删除+添加=根据你的逻辑没有改变。不知道本地方法,但取决于查询的性质,然后检查autoinc字段的最大值可能会更好/更安全? –

+0

为什么你想知道是否添加行?这是一个多用户的情况? Plaese [编辑]并更新你的问题。 –

回答

1

从您的参考FDQuery,我假设你使用FireDAC,所以理论上你应该能够做到这一点使用TFDEventAlerter,可以从各种RDMSs接收事件并将它们提供给您的应用程序作为德尔福类型的事件, 。

http://docwiki.embarcadero.com/RADStudio/XE8/en/Database_Alerts_%28FireDAC%29

不幸的是,现在你已经在评论你的关系数据库管理系统是MySQL的提到的,我不认为会TFDEventAlerter帮助,因为我不认为它的RDMSs是TFDEventAlerter支持之中。我不认为MySQL可以提供TFDEventAlerter需要的通知类型。但不要拿我的话来说,试试吧。

顺便说一句,如果你的表行有一个行ID列,那么一种方法来确定行是否被另一个用户在服务器上加载的次数少于完全刷新的时间,是记录最高的ID您的查询返回并定期执行

Select Count(*) from mytable where ID > :ID 

并且只有刷新您的查询,如果返回的值大于零。

顺便说一句,在之前XE8一些德尔福版本中,有一个TFDEventAlerter演示:

C:\用户\公用\文档\ Embarcadero公司\工作室\ 14.0 \样本\ Object Pascal的\数据库\ FireDAC \样本\ Comp Layer \ TFDEventAlerter。

但是这个演示似乎从XE8中丢失(在我的设置中,无论如何),并且由于FireDAC.Stan.Intf单元中所做的更改,早期版本中的代码不能在XE8中编译。

+0

我发现为什么我最初无法使用OnAlert来触发并更新我的答案。 – MartynA

+0

我在网上找到了这样的东西,但这不适用于MySQL,它呢? –

+0

对不起,我没有意识到你正在使用MySQL,但如果你是,我不认为TFDEventAlerter会帮助 - 在我的回答中,没有列出DocWiki文章中的RDMSs中的MySQL,无论如何,我想我已经在某处,MySQL没有提供TFDEventAlerter使用的事件的本地支持。顺便说一句,你应该提到你在q中使用的RDMS。 – MartynA