2012-02-24 94 views
1

我正在尋找一種解決方案來有效地溝通兩個運行的MS Access應用程序。兩個MS Access應用程序之間的通信?

到目前爲止,我嘗試的方法是使用公共鏈接表並使用MSMQ服務進行通信。這兩種方法都可以工作,但是無法將數據或命令從一個應用程序「推送」到另一個應用程序,並且由於MS Access不支持多線程執行VBA代碼,因此實現無輪詢的輪詢非常困難。

同時,VBA確實支持addressof運算符(從版本2000開始),這意味着我們理論上也可以在VBA和MS Access中實現回調函數。但我從來沒有見過任何示例如何將其用於進程間通信,並希望瞭解如何在不監視共享表的情況下將字符串從一個MS Access應用程序發送到另一個應用程序的最小示例。

+1

在這裏的一些有趣的鏈接:http://stackoverflow.com/q/393996/78522 – 2012-02-24 14:43:15

回答

1

您可以使用GetObject()從另一個正在運行的數據庫中返回Access.Application對象。通過應用程序對象,您可以訪問所有您可能需要的東西。下面是打開窗體的一個人爲的例子(但你可以做其他的事情無數與Application對象):

Sub TestInterop() 
Const mdbPath As String = "C:\OtherApp.mdb" 
Dim OtherApp As Access.Application 

    Set OtherApp = GetObject(mdbPath) 
    OtherApp.Visible = True 
    OtherApp.DoCmd.OpenForm "Accounts" 
End Sub 

如果程序沒有運行,則GetObject()通話將啓動應用程序(你需要如果你安裝了多個Access版本,要小心,因爲在運行時很難知道哪個版本實際上會打開.mdb)。但是,如果GetObject()需要啓動應用程序,它將在可見性設置爲False時這樣做,因此我們明確將其設置爲True。如果應用程序已經運行,將其可見性設置爲True將不起作用。

0

認爲這是一個瘋狂的想法,但可能會把你所有的表格放到sql express和/或sql ce中,並使它看起來像這些表的前端?

+0

這正是我們現在正在做的以及我的意思是「共享表」。但是,如果將某些數據插入此表中,則無法實施將觸發的觸發器 - 您必須繼續輪詢它以查找更改,這會顯着降低MS Acess應用程序的性能... – 2012-02-24 10:00:49

+1

@Alexander Galkin:顯着降低性能?我很驚訝,因爲我一直在使用民意測驗(間隔時間很短,比如說1分鐘),沒有顯着的影響。這裏的訣竅是讓連接處於打開狀態。 – 2012-02-24 10:09:13

+0

@iDevlop我們想要的是將一個MS Access應用程序中的上下文菜單單擊到另一個應用程序中,並且1分鐘間隔太長。只要我們使用1秒輪詢,我們就會看到性能問題(鼠標光標凍結幾分之一秒)。 – 2012-02-24 10:11:43

相關問題