VB.NET 与 Microsoft Access 交谈 - 可以进行回调吗?

Posted

技术标签:

【中文标题】VB.NET 与 Microsoft Access 交谈 - 可以进行回调吗?【英文标题】:VB.NET talking with Microsoft Access - can one do callbacks? 【发布时间】:2014-10-14 18:46:24 【问题描述】:

我正在 VB.NET(特别是 Visual Basic)中构建一个附加 UI 系统,它使用来自旧版 Microsoft Access 系统的数据(至少在一段时间内需要通过其旧的内部 UI 使用) .我几乎可以从 VB.net 完成我需要做的所有事情 - 使用数据表、调用包含不错功能的 Access 函数等。

我想弄清楚的是 Microsoft Access 是否可以将 back 调用到 VB.NET(例如,可能允许我传入要调用的函数引用)。

具体的动机是有 2 或 3 个耗时的 Microsoft Access 函数会产生关键的输出数据 - 如果您直接通过 MS Access 界面调用它们,您会看到进度条和偶尔的文本更新等内容工作阶段、进度百分比等的一种形式。如果从 VB.net 调用,我可以修改 MS Access 代码不做这些事情,但我真的宁愿让 MS Access 代码到达回到 VB.net,以便我可以在新界面中提供一些进度反馈。

如上所述,一个优雅的解决方案是让 VB.NET 传入函数委托以供 MS Access 调用 - 但由于这些是完全不同的内存空间等,我认为需要一些内部框架让这样的事情工作 - 可能以某种方式通过共享 DLL。我可以走旧的“轮询”路线,其中 MS Access 将状态写入表,(异步)VB.NET 应用程序轮询该表并使用那里的内容。这似乎是一种不雅的hack,不必要地浪费资源并且可能容易出错,我讨厌走这条路。如果我可以只构建一个 MS Access 可以使用的函数,它只是传递一个状态字符串,我认为这将涵盖绝大多数情况。

欢迎提出任何建议。

【问题讨论】:

【参考方案1】:

我经常在 .net 中创建 COM 对象以用于 Access。因此,在您的访问代码中,您当然可以让进程循环“调用”.net 对象来更新进程。

但是,您可能正在自动化 Access 的副本,因此希望 Access 调用 EXISTING 自动化客户端中的例程,而不是让 Access 实例调用自定义 .net 对象。但是,我认为构建自定义 .net 对象将是最少的工作和麻烦。换句话说,你改变了你的方法。您首先启动 Access,它使用您的 .net 应用程序作为 COM 对象。这样,您的应用程序中的任何例程都可以从 Access VBA 中使用和调用。

如果主 .net 应用程序真的需要从 Access 接收消息,而不是 Access 简单地调用 + 使用自定义 .net 对象来显示进程信息,那么我会走上实现回调的唯一原因。 (因此非常容易构建一个 .net 对象来显示进度)。

所以最好的办法是采用将现有应用程序转换为 COM 对象以供 Access 使用的想法。这很容易。

一旦你做了以上,那么

Access 首先启动,然后创建应用程序的实例。 (因此可以从 VBA 调用/使用 .net 应用程序中公开的任何 .net 子程序或函数)。

即使您不先启动 Access,Access 在启动时也可以获取应用程序的运行实例(就像您可以在 Access/VBA 中获取 Excel 或 Word 的运行实例一样)。

最后但并非最不重要的; 您可能可以实现回调,但我只是不知道这是否可能无需创建一个 .net COM 对象作为中间人。因此,无论如何,最好让 Access 选择一个正在运行的 .net 应用程序实例。

所以我会将您的 .net 应用程序公开为 COM 不稳定对象。

因此,最少的工作是创建一个单独的 .net COM 对象供访问使用,但如果您假设将来 VBA 应该能够调用任何 vb.net 例程,那么我将因此构建您的 .net 应用程序作为可消耗的 COM 对象。

【讨论】:

以上是关于VB.NET 与 Microsoft Access 交谈 - 可以进行回调吗?的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 连接access数据库

将 VB.NET 代码从 Visual Studio Express 复制到 Microsoft Access 2013

使用 asp.net、vb.net 和 ms-access 的时间戳

vb.net 怎么操作数据库

VB.Net 2008 连接到 MS Access

使用 VB.NET 从 Access 中检索长二进制数据(图像)