【问题标题】:Communication between two MS Access application?两个 MS Access 应用程序之间的通信?
【发布时间】:2012-02-24 23:47:20
【问题描述】:

我正在寻找一种在两个正在运行的 MS Access 应用程序之间进行有效通信的解决方案。

目前我尝试的方法是使用通用链接表并使用 MSMQ 服务进行通信。这两种方法都有效,但是没有办法将数据或命令从一个应用程序“推送”到另一个应用程序,而且由于 MS Access 不支持 VBA 代码的多线程执行,因此很难在没有性能劣势的情况下实现轮询。

同时,VBA 确实支持addressof 运算符(从 2000 版开始),这意味着我们理论上也可以在 VBA 和 MS Access 中实现回调函数。但是我从未见过任何示例如何将其用于进程间通信,并且希望有任何最小的示例如何在不一直监视共享表的情况下将字符串从一个 MS Access 应用程序发送到另一个应用程序。

【问题讨论】:

标签: ms-access communication inter-process-communicat


【解决方案1】:

您可以使用GetObject() 从另一个正在运行的数据库返回Access.Application 对象。使用应用程序对象,您几乎可以访问您可能需要的所有内容。这是一个人为的打开表单的示例(但您可以使用 Application 对象做很多其他事情):

Sub TestInterop()
Const mdbPath As String = "C:\OtherApp.mdb"
Dim OtherApp As Access.Application

    Set OtherApp = GetObject(mdbPath)
    OtherApp.Visible = True
    OtherApp.DoCmd.OpenForm "Accounts"
End Sub

如果程序尚未运行,GetObject() 调用将启动应用程序(如果您安装了多个版本的 Access,则需要小心,因为在运行时很难知道哪个版本会实际打开 .mdb )。但是,如果GetObject() 需要启动应用程序,它将在可见性设置为 False 的情况下执行此操作,因此我们将其显式设置为 True。如果应用已经在运行,将其 Visibility 设置为 True 将无效。

【讨论】:

    【解决方案2】:

    认为这是一个疯狂的想法,但可能会将您的所有表放入 sql express 和/或 sql ce 中并使其看起来像这些表的前端?

    【讨论】:

    • 这正是我们现在正在做的,也是我所说的“共享表”。但是,如果将某些数据插入此表中,则无法实现触发触发器——您必须不断轮询它以查找更改,这会显着降低 MS Acess 应用程序的性能......
    • @Alexander Galkin:显着降低性能?我很惊讶,因为我一直在使用轮询(以低间隔,比如 1 分钟)而没有显着影响。这里的诀窍是让连接保持打开状态。
    • @iDevlop 我们想要的是将一个 MS Access 应用程序中的上下文菜单单击传达给另一个应用程序,而 1 分钟的间隔太长了。只要我们使用 1 秒轮询,我们就会看到性能问题(鼠标光标冻结几分之一秒)。
    • Access 实例是否在同一个 LAN 上?如果是,您是否考虑过 DDE ?搜索“ms access vba dde”会给你一些例子。
    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多