【问题标题】:Calling Access Interop function that returns UDT from VB.NET code throws error调用从 VB.NET 代码返回 UDT 的 Access Interop 函数会引发错误
【发布时间】:2013-01-30 20:19:59
【问题描述】:

我有一个 Microsoft Access 2000 数据库。有一个声明了类型的模块:

Type MyTestType
    Something As String
End Type

还有一个函数返回上述类型:

Function MyTestFunction() As MyTestType    
    Dim a As MyTestType        
    MyTestFunction = a    
End Function

我正在尝试使用 VB.NET 从 .NET 4.0 控制台应用程序自动调用函数。我有一个方法如下:

Sub ProcessAccessFunction()
    Dim access As New ApplicationClass()

    Try
        access.OpenCurrentDatabase("c:\MyTestFolder\MyTestDatabase.mdb", False)
        Dim result = access.Run("MyTestFunction")
    Finally
        access.Quit(AcQuitOption.acQuitSaveNone)
    End Try
End Sub

但是,我收到一条错误消息,提示“该值不在预期范围内”。我需要做什么才能在我的 VB.NET 应用程序中成功接收对象?

【问题讨论】:

    标签: vba ms-access com interop


    【解决方案1】:

    用户定义类型在 VBA 中非常有限。
    例如,在 Access 本身中,您不能这样做:

    ?TypeName(Application.Run("MyTestTypeFunction"))
    

    您将收到运行时错误“5”:无效的过程调用或参数
    UDF 的可见性非常有限,以至于它对外界根本不可见。
    Application.Run 使用 OLE 自动化来执行函数调用。由于您的 UDF 仅在您的数据库范围内为人所知,而不是在任何地方导出,因此外部世界没有可用的类型信息,并且从 Application.Run 使用它会失败,在访问本身内以及从 .Net 调用时通过扩展。

    如果你的函数只是返回一个字符串,它会很好地工作。

    【讨论】:

    • 我知道返回字符串有效。有什么方法可以导出 UDT,以便我的 .NET 应用了解它们?
    • @CamronBute,据我所知,没有。有可能破解并传递您转换为已在 .Net 应用程序中定义的类型的原始内存数据,但它可能会非常复杂和脆弱,并且可能会花费您更多的精力而不是值得的。您可以尝试将数据“序列化”为字符串并在 .Net 对象/VBA 代码中重新组合该数据,但您将只传递副本,而且效率低下。
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2022-11-07
    • 2020-11-15
    • 2011-10-21
    相关资源
    最近更新 更多