2016-10-27 33 views
1

我開發通過TSimpleDataSet(dbExpress組件)顯示在DBGrid信息自動刷新數據集組件/ DBGrid的

有問題的軟件是在2級不同的計算機由兩個不同的人使用的軟件。

他們都在不同的時間查看和編輯相同的信息。 我試圖找出一種方法來自動更新DBGrid(或更確切地說,DataSet,對嗎?)一旦計算機A對行進行更改(編輯某物/其他),反之亦然。

目前我已經成立了一個名爲RefreshTButton,一旦點擊執行以下代碼:

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西雅圖和dbExpress組件,數據集連接到我的網站的託管MySQL數據庫。

謝謝!

+0

當然,更好的方法是由數據庫服務器通知。爲此,數據庫服務器(如果有的話)需要提供這樣的功能,並且訪問驅動程序也需要支持它。 DBX可能不會,但應該可以使用輔助連接。像IBEventAlerter例如interbase/firebird一樣。 –

+0

爲什麼這是一個更好的方式,而不是定時器?只是出於好奇。另外,我正在使用MySQL,並且是將數據集連接到數據庫。 – Petzy

+1

您的程序不需要頻繁敲擊服務器。可能99%的刷新是空手迴歸。如果您延長時間間隔以避免這種情況發生,那麼您將承擔不通知變更的風險。 –

回答

2

那麼,Ken White和Sertac Akyuz肯定是正確的,即使用服務器發起的通知來確定何時刷新本地數據集比持續重新讀取服務器上使用的所有數據更可取。

問題AFAIK是沒有Emba提供的與MySql一起使用的通知系統。見FireDAC的數據庫警報支持的數據庫,這個名單:

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

,並請注意,它不會列出MySQL的。

幸運的是,我認爲有一個解決方法應該是可行的,像你現在這樣的小型系統。據我瞭解,你和你的同事的個人電腦在局域網上,MySql服務器在局域網和互聯網之外。在這種情況下,它不需要往返服務器,讓其中一個人得到另一個已經改變數據庫內容的通知。用一個類似於Ken的類比,你可以像現在這樣依靠桌子,對同事說:「嘿,我已經改變了一些東西,所以你需要刷新你的數據。」

一種非常低技術的實現方式是在局域網的某個地方有一個你可以輕易獲得的資源,當你對數據庫進行更改時可以更新這個資源,這意味着另一個你應該從服務器更新你的數據。一種方法是建立一個小的共享數據文件,其中包含大量記錄,每個服務器數據庫表有一個數據庫表,其中有一些時間戳或版本ID號,當您更新相應的服務器表時,這些數據庫會被更新。然後,您可以定期檢查(輪詢)此數據文件,以查看自上次檢查後給定的表是否已更改;顯然,如果有的話,你可以從服務器重新讀取你想要的數據,並更新你從共享文件中讀取的信息的本地記錄。

您可以使用處理程序更新您的Delphi客戶端數據集事件的共享文件。

這個主題有很多不同的變化,我相信對你來說很明顯;實施細節確實無關緊要。

要更新我在談論的共享文件,您需要在寫入時鎖定它。這樣的回答:

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

會告訴你如何做到這一點。

當然,共享本地資源不一定是數據文件。一種替代方法是使用Microsoft Message Queue服務,該服務有時用於這類事情,但其學習曲線比共享數據文件更陡峭。

順便說一下,如果您使用三層數據庫訪問(例如使用datasnap),則這種事情要容易得多(至少在像您這樣的小規模上)。 在三層系統中,只有中間層(您編寫的Delphi datasnap服務器,但並不那麼難)與服務器進行通信,客戶端只與中間層進行通信。這使得中間層服務器可以很容易地在其中一個客戶端更改db數據時通知其他客戶端。

三層安排還有助於最大限度地減少通過Internet訪問數據庫服務器的安全問題,因爲您只需要一個到服務器的安全連接,而不是每個客戶端一個。但是這有點遠離你的眼前的問題。

我希望所有這一切都清楚,如果不是的話,問。

+0

非常有幫助,謝謝,只是閱讀大部分內容,並會盡快嘗試。 – Petzy