2015-10-06 54 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