很遗憾,您不能这样做。
虽然互操作确实有很多技巧,并使用一种“编组”形式来允许进程内 x64 启动 + 自动化 32 位版本的 word,或者在本例中是 Access,但互操作编组系统确实不支持数据库引擎。
所以,下面是“如果”这可行的话,你可以如何编写代码:
Dim accessApp As New Access.Application
accessApp.OpenCurrentDatabase("\\ALBERTKALLAL-PC\test\vbtest\test44.accdb")
Dim strSQL As String
accessApp.Visible = True
Application.DoEvents()
strSQL = "select * from tblHotels3"
Dim rst As Access.Dao.Recordset
Dim strBuf As String = ""
rst = accessApp.CurrentDb.OpenRecordset(strSQL)
Do While rst.EOF = False
strBuf += vbCrLf & rst("ID").Value & "," & rst("HotelName").Value
rst.MoveNext()
Loop
Me.TextBox1.Text = strBuf
accessApp.Quit()
所以,如果可能的话,上面的代码就是你如何使用互操作。
但是,请记住,您需要完整版的 Access 才能使用“createObject()”或创建 Access 的实例。运行时版本不支持此功能(因此,请记住,虽然您已成功创建 Access 实例,但您无法使用运行时执行此操作。(现在,您显然确实安装了完整版的访问权限)。
通过创建一个完整的访问实例,所有的启动代码和该访问应用程序的一部分都将开始运行。更好的是简单地创建数据库引擎的一个实例,因此您无需启动 Access + VBA + 整个应用程序。要使用互操作,此代码将起作用:
Dim db As New Access.Dao.DBEngine
Dim MyDatabase As Access.Dao.Database
db.OpenDatabase("\\ALBERTKALLAL-PC\test\vbtest\test44.accdb")
Dim rst As Access.Dao.Recordset
Dim strSQL As String = "select * from tblHotels3"
Dim strBuf As String = ""
rst = db.Workspaces(0)(0).OpenRecordset(strSQL)
Do While rst.EOF = False
strBuf += vbCrLf & rst("ID").Value & "," & rst("HotelName").Value
rst.MoveNext()
Loop
rst.Close()
db.Workspaces(0)(0).Close()
Me.TextBox1.Text = strBuf
然而,再一次,当您尝试使用 .net 本地的数据引擎时,您正在跨进程内 (x64) 进行编组,因此上述再次不起作用。
然而,如果你想修改一个文本文件,你可以让word打开文本文件,执行word命令来修改文档,然后保存。这在理论上应该并且应该在 x32/x64 桥上工作。
事实上,以下 Access 互操作代码应该可以工作,但不能:
Dim accessApp As New Access.Application
accessApp.OpenCurrentDatabase("\\ALBERTKALLAL-PC\test\vbtest\test44.accdb")
Dim strSQL As String
strSQL = "update tblHotels3 set City = 'zoo' "
accessApp.DoCmd.RunSQL(strSQL)
accessApp.Quit()
请注意,在上面,我们尝试使用 Access 模型进行“更新”。但是,即时访问尝试运行+使用数据库引擎,它失败了。上面的例子应该可以工作,但是如果上面的 .net (vb.net) 代码是作为 x64 运行的,那么会发现:
代码确实创建了一个正确运行的 Access 实例(.net = x64,Access = x32)。
但是,似乎在我们尝试尝试运行 + 使用 Access 数据引擎的那一刻,然后 .net 就会抛出一条错误消息
(所以上面失败了
accessApp.DoCmd.RunSQL(strSQL)
- 那是我们尝试使用数据引擎的时候。
因此,虽然 inter-op 可以启动 + 为您提供 Access 的运行副本,但尝试使用数据引擎会失败。
我确实发现您可以告诉 MSAccess 运行一些 VBA 代码。所以这会起作用:
Dim accessApp As New Access.Application
accessApp.OpenCurrentDatabase("\\ALBERTKALLAL-PC\test\vbtest\test44.accdb")
accessApp.Visible = True
Application.DoEvents()
MsgBox("access open = ok - show access ok")
accessApp.Run("MyUpdate")
accessApp.Quit()
还有,上面的 VBA 代码?
VBA 代码 - 不是 vb.net:
Public Sub MyUpdate()
MsgBox "about to update"
CurrentDb.Execute "update tblHotels3 set city = 'zoozoo'"
MsgBox "upate ok"
End Sub
我可以确认上述方法有效:
所以,这里的问题是 Access 数据库引擎被视为外部数据库对象,而 inter-op marshalling 不支持来自 .net 的数据库引擎。
解决此问题的唯一方法是安装 Access 数据引擎的 x64 位版本。您可以单独安装引擎,而不必安装 Access,但据我所知,在 .net 中,除非您拥有 x64 位版本的数据引擎,否则无法执行此操作。