如何在 .Net Core 3.0 中获得对 MS Access 的引用?

Posted

技术标签:

【中文标题】如何在 .Net Core 3.0 中获得对 MS Access 的引用?【英文标题】:How do I get a reference to MS Access in .Net Core 3.0? 【发布时间】:2020-02-24 20:59:46 【问题描述】:

我正在寻求帮助。我需要弄清楚如何获取对 Microsoft Access 2013 的对象引用,以便我可以(通过自动化)调用 accdb 中已定义的一些函数。例如;我想自动化“RelinkODBCTables”函数的过程,它将链接表从我的 .net core 3.0 c# 应用程序重新指向另一个数据源。 我无法成功获得对互操作的引用,但我可能做得不对。

任何帮助将不胜感激。

D-

【问题讨论】:

【参考方案1】:

如果你愿意

创建一个访问实例。

调用 VBA 子程序(比如您的重新链接代码)。

关闭数据库。

退出访问。

您可以使用以下代码:


object AccessApp;

AccessApp = Interaction.CreateObject("Access.Application");

AccessApp.OpenCurrentDatabase(@"c:\test\test44.accdb");

AccessApp.Run("MyLinker");

AccessApp.CloseCurrentDatabase();
AccessApp.Quit();


因此,您根本不需要任何参考。只需创建给定应用程序的实例(word、Excel 或按照上述 Access)。

此时,您已经充分利用了对象模型,并且可以使用 run 来调用一些 VBA 例程。在上面,我们调用了一个名为 MyRelinker 的 VBA Sub。

这里唯一要注意的是,当您创建该对象的实例时,应用程序的所有启动代码都会运行。因此,如果 Access 程序的开发人员在启动时启动任何提示的表单和 UI,则您无法“回答”该提示。因此,这在很大程度上取决于应用程序在启动时的运行情况,以及调用这些 VBA 例程中的任何一个都不会触发该 Access 应用程序中的某种提示。如果是这样,那么您就有麻烦了,因为您无法“回答”任何表单或代码提示,访问很可能会出现在最终用户身上。

而且,如果您在编码过程中确实需要一些“智能感知”,那么您可以为您的项目添加一个办公室“互操作”引用。它不是必需的,但是如果您不是很熟悉 Access VBA + 对象模型,那么如果您确实引用了办公室程序集,请使用 CreateObject("Access.Application") 代替:

Microsoft.Office.Interop.Access
C:\Program Files (x86)\Microsoft Visual Studio 12.0\
Visual Studio Tools for Office\PIA\Office14\
Microsoft.Office.Interop.Access.dll

那么你的代码就变成了这样:


Microsoft.Office.Interop.Access.Application AccessApp = 
  new Microsoft.Office.Interop.Access.Application();

AccessApp.OpenCurrentDatabase(@"c:\test\test44.accdb");
AccessApp.Run("MyLinker");

AccessApp.CloseCurrentDatabase();

AccessApp.Quit();

但是,虽然您通过引用获得了更强的键入能力,但您通常会将您的代码“绑定”到给定版本的 Access,并且 CreateObject() 的简单使用意味着您可以创建安装的 Any Access 的实例在目标计算机上,它应该可以一直追溯到 Office 2000 - 一个很好的 20 年“覆盖”。

请记住,您不能创建 Access 运行时的实例,目标计算机将需要完整版本来“创建”Access.Application 对象的实例。

您“可以”自动化运行时版本。这涉及启动 Access 运行时(通过 Shell()),然后使用“GetObject()”代替 CreateObject() 获取一个实例。

编辑

我应该指出,在上面的第二个代码示例中,并使用 office interop-assembly 引用,我选择了 office 14,即 office 2010。在您的情况下,您必须使用 office 15 (2013)。

【讨论】:

以上是关于如何在 .Net Core 3.0 中获得对 MS Access 的引用?的主要内容,如果未能解决你的问题,请参考以下文章