2012-02-22 73 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

相关问题