2013-02-14 17 views
1

我有一個Microsoft Access 2000數據庫。有一個類型的模塊聲明:調用從VB.NET代碼返回UDT的Access Interop函數拋出錯誤

Type MyTestType 
    Something As String 
End Type 

還有一個返回上述類型的函數:

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

我試圖函數的調用從.NET 4.0控制檯自動化使用VB.NET的應用程序。我有一個方法如下:

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應用程序中成功接收對象?

回答

0

用戶定義類型在VBA中相當有限。
例如,從內部訪問本身,你不能做到這一點:

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

你會得到一個運行時錯誤「5」:無效的過程調用或參數
UDF的可見性非常有限,以至於外界根本看不到它。
Application.Run使用OLE自動化來執行函數調用。由於您的UDF只在數據庫範圍內知曉,並且不會導出到任何地方,因此外部世界沒有任何類型信息可用,並且從Application.Run使用它將在訪問本身內部使用並且在從.Net調用時擴展時使用。

如果你的函數只是返回一個字符串,它會完美的工作。

+0

我知道返回一個字符串的作品。有什麼方法可以導出UDT,以便我的.NET應用程序知道它們? – CamronBute 2013-04-23 14:06:59

+0

@CamronBute,據我所知,沒有。將原始內存數據轉換爲已經在.Net應用程序中定義的類型是可能的,但它可能會非常複雜和脆弱,並且可能會花費更多的努力。您可以嘗試將數據「序列化」爲一個字符串,並將這些數據重新組合到.Net對象/ VBA代碼中,但您只會傳遞副本,效率不高。 – 2013-04-27 03:50:48

相關問題