很抱歉出现长文本。
问题:在以下代码段中,我很难删除ADOX的"CREATE"方法生成的LDB。请提供一些解决方案的提示/指针,谢谢。
目标:创建(动态)一个新的访问数据库,然后将数据(如Arena模块)导出到新创建的数据库中。
预期:新创建的访问数据库应该能够被一些外部操作使用,例如access.exe,在子程序结束后,并且不退出当前VB程序。
-
我测试了"Arena代码"对ldb文件的创建/发布没有任何作用。
-
我在连接字符串中测试了"独占模式",但访问文件仍然被vb程序锁定。
-
我在VB环境中测试了两者,并直接调用了从Explorer中生成的,得到了相同的结果。
-
其他数据库格式不是我的选择。(由于竞技场出口限制)
-
它不是一个网络应用程序。
代码:
Sub Method1()
Dim logs As New System.Collections.Generic.List(Of String)
Dim arenaApp As Arena.Application = Nothing
Try
logs.Add("Creating access database")
Try
Dim cat As New ADOX.Catalog
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=new.mdb;Jet OLEDB:Engine Type=5")
cat = Nothing
Catch ex As Exception
logs.Add(ex.Message)
logs.Add(ex.StackTrace)
Finally
logs.Add("End creating access database")
End Try
'Opening Arena model"
arenaApp = New Arena.Application()
arenaApp.Models.Open(fileName)
arenaApp.ActiveModel.ExportModules("", "new.mdb", "TableName", "", Arena.smExportType.smExportAll)
Catch ex As Exception
logs.Add(ex.Message)
logs.Add(ex.StackTrace)
Finally
...
End Try
End Sub
平台:
- Windows 7 64位,Office 2010(32)
- VB 2010 express
- Lib:MS ADO Ext.2.8用于DDL和安全
创建后关闭mdb,然后重新打开它怎么样
我不是VS专家,但在Access中,"设计模式"中的许多事情都将mdb置于独占模式。。。我怀疑,如果不先关上它,你就无法切换回来。
如果你想创建一个数据库,PInvoke SQLConfigDataSource可能更简单。然后,您可以通过ADODB、ADO.NET或您选择的VB.NET数据访问方法连接到它。
我没有在VB.NET中这样做的例子,但这个C#类和这个powershell脚本演示了如何调用该函数。
我知道这是个老问题。我今天遇到了完全相同的问题。有些评论问为什么要使用ADOX,因为首先,它来自遗留代码,其次,我没有找到任何其他方法来动态创建mdb文件。
在VB6中,无论何时设置adox=Nothing,此com对象都将立即释放,ldb文件也是如此。
在.Net中,在ldb文件解锁之前,您必须依靠GC来收集adox。
所以,我做了下面的把戏。我知道这很难看,但我没有找到任何其他方法,至少我的把戏奏效了。
Dim t As New Thread(
Sub
'All adox code should be here
'....
'....
adox = Nothing
End Sub
)
t.Start()
t.Join()
t = Nothing
GC.Collect()
Sleep(50)