如何在创建MS Access LDB锁定文件后释放它



很抱歉出现长文本。

问题:在以下代码段中,我很难删除ADOX的"CREATE"方法生成的LDB。请提供一些解决方案的提示/指针,谢谢。

目标:创建(动态)一个新的访问数据库,然后将数据(如Arena模块)导出到新创建的数据库中。

预期:新创建的访问数据库应该能够被一些外部操作使用,例如access.exe,在子程序结束后,并且不退出当前VB程序。

  1. 我测试了"Arena代码"对ldb文件的创建/发布没有任何作用。

  2. 我在连接字符串中测试了"独占模式",但访问文件仍然被vb程序锁定。

  3. 我在VB环境中测试了两者,并直接调用了从Explorer中生成的,得到了相同的结果。

  4. 其他数据库格式不是我的选择。(由于竞技场出口限制)

  5. 它不是一个网络应用程序。

代码:

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)

最新更新