如何在 .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 的引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET Core 3.0 中替换 AddJwtBearer 扩展

如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1

如何在 .NET Core 3.0 Entity Framework 中执行组加入?

如何将 .NET Core 2.2 Web API 迁移到 .NET Core 3.0?

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

如何在 Visual Studio 2019 和 .NET Core 3.0 中使用 ODBC 连接?