2012-02-22 87 views
1

我有一個Winforms C#應用程序,我希望能夠連接到Access 2007應用程序。基本上,用戶單擊winforms應用程序中的一個按鈕,然後將它們轉到他們運行的MS訪問應用程序中的特定表單。MS Access應用程序和C#Winforms應用程序之間的鏈接

這可能嗎?

謝謝

+1

這可能不是你要找的答案,但爲什麼不用WinForms重寫Access應用程序? – jrummell 2012-02-22 19:41:19

+1

訪問應用程序是整個公司用來完成日常工作的大型遺留應用程序。實際上,Winforms應用程序是Acess應用程序的替代品,但僅佔其中的一小部分。用戶需要能夠從新應用程序鏈接到現有的應用程序。 – user948060 2012-02-22 19:52:54

回答

0

是的,這是可能的。你將不得不使用DDE。醜陋的舊技術,但它仍然在Access 2007中。我在codeplex上使用NDde庫。

using (DdeClient client = new DdeClient("MSACCESS", "MyDB.accdb")) 
{ 
      String DdeCommand = 
      "[OpenForm frmNavigate,,,,,,UserOpenArgs]"; 
     try 
     { 
      client.Connect(); 
      client.Execute(DdeCommand, 5000); 
     } 
     catch (NDde.DdeException ex) 
     { 
      // MessageBox.Show(ex.Message); 
      Logger.Write(ex.ToString()); 
     } 
} 
+0

非常好,謝謝,我會檢查NDde。要清楚,Access應用程序是連接到MS SQL數據庫的訪問表單。沒有.accdb文件...這是否改變了什麼? – user948060 2012-02-22 19:58:03

+0

你必須有一個accdb或accde文件,你的訪問表單是否正確?我們使用SQLServer鏈接表,並有一個accdb文件進行開發,然後將其轉換爲accde文件進行部署。這將與任何一個工作。 – user957902 2012-02-22 21:44:37

+0

user957902:我有一個adp文件,就是這樣。 – user948060 2012-02-22 22:40:01

2

作爲使用DDE的替代方案,請考慮自動化。你需要添加引用相關PIA庫,然後你可以有代碼稍微比較熟悉的Access開發人員,像這樣:

var access = new Access.Application(); 
access.OpenCurrentDatabase("MyDB.accdb"); 
access.OpenForm("frmNavigate"); 
+0

我發現使用自動化總是啓動一個新的Access實例。 DDE將找到一個已經運行的實例。 – user957902 2012-02-22 21:45:48

+0

@ user957902你可以用'System.Runtime.InteropServices.Marshal.GetActiveObject'獲取一個現有的實例(雖然這種方法也有問題)。有關示例,請參閱http://support.microsoft.com/kb/316126。 – phoog 2012-02-22 22:03:53

相關問題