从.Net调用访问模块中的例程?

Posted

技术标签:

【中文标题】从.Net调用访问模块中的例程?【英文标题】:Call Routine in Access Module From .Net? 【发布时间】:2009-05-08 00:48:57 【问题描述】:

我无法从 .Net(VB 或 C#)自动化 Access 2007。我想要做的就是从 .Net 调用 Access 模块中的子例程。

最终,我必须让它在 VB 中工作,但我一直在尝试两者,结果相同。

下面是我的 VB 测试表单中的代码。它导致错误:

System.Runtime.InteropServices.COMException (0x800A9D9F):来自 HRESULT 的异常:Microsoft.Office.Interop.Access.ApplicationClass.Run 的 0x800A9D9F(字符串过程,对象& Arg1,对象 &Arg2,...,对象 &Arg30)

我在 Access 中的测试 Sub 名为“MyTest”,并且是名为“Module1”的模块。它所做的只是在表中插入一条记录。它在 Access 中运行良好。我尝试了“Module1.MyTest”、“MyTest()”、“Call MyTest”等的各种排列,但没有成功。

我在自动化 Access(和其他 Office 应用程序)的网络上找到了一些其他示例,但似乎无法正常工作。如果有人能指出一个可行的例子,我将不胜感激。

示例代码:

Imports Access = Microsoft.Office.Interop.Access
Imports Microsoft.Office.Core

Public Class FormTest
    Private Sub cmdTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTest.Click

        Dim aa As New Access.Application()

        Try
            aa.OpenCurrentDatabase("c:\Test.accdb")
            aa.Run("MyTest")
        Catch ex As Exception
            MsgBox(ex.ToString())
        Finally
            If aa IsNot Nothing Then
                aa.Quit(Access.AcQuitOption.acQuitSaveNone)
            End If
            Me.Close()
        End Try

    End Sub
End Class

【问题讨论】:

【参考方案1】:

这是安全性。在 Access 中,我不得不关闭所有安全检查。一旦我这样做了,它就可以正常工作了。

【讨论】:

我们通过 Access 2007 中的信任中心将 MDB 添加到信任位置。 @CamronBute 你可以使用these instructions from Microsoft for Access 2007。【参考方案2】:

尝试查看 InnerException(错误的实际原因)。

另外,如果您了解 VB6 - 请尝试在 VB6 中编写相同的代码,看看是否可行。 如果您没有遇到任何错误,它应该在 VB.net 中工作相同

编辑:MyTest 是公共方法吗?

【讨论】:

InnerException 为空。我没有 VB6,但我已经从 FoxPro 尝试过,使用 aa = CREATEOBJECT("Access.Application") 并且当我运行时,我得到“OLE 错误代码 0x800A9D9F:未知的 COM 状态代码”。【参考方案3】:

如果您的访问过程的目标是操作访问文件中的表,为什么不打开与 .mdb 文件的 ODBC 或 OLEDB 连接,然后直接在表上执行工作,或者通过打开记录集并对其进行操作,还是通过发送相应的 SQL 指令?

您至少可以节省创建新 Access 实例所需的所有时间。

【讨论】:

以上是关于从.Net调用访问模块中的例程?的主要内容,如果未能解决你的问题,请参考以下文章

从 VBA 中的不同模块调用子例程

如何访问已调用 setState 的函数主体中的更新状态?

访问由另一个线程创建的对象而不每次都调用?

Excel VBA:将集合从类传递到模块问题

go例程的子集上的waitgroup

使用 if 语句后跟调用似乎在批处理文件中不起作用