如何在 .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?