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

时间:2012-02-17 11:08:59

标签: vb.net ms-access oledb ado

抱歉长篇文章。

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

目标:创建(动态)新的访问数据库,然后将数据(说竞技场模块)导出到新创建的数据库。

预期:在子例程结束后,某些外部操作(例如Access.exe)可以使用新创建的访问数据库,并且不退出当前的VB程序。

  1. 我测试过“竞技场代码”对ldb文件的创建/发布没有任何作用。

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

  3. 我在VB环境下进行了测试,直接调用了从Explorer生成的结果,并且结果相同。

  4. 其他数据库格式不适合我。 (由于竞技场出口限制)

  5. 这不是网络应用。

  6. 代码:

    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和安全

3 个答案:

答案 0 :(得分:0)

如何在创建后关闭mdb,然后重新打开它? 我不是VS专家,但是在Access中,“设计模式”中的很多东西都将mdb置于独占模式......如果没有先关闭它我就无法切换回来我怀疑。

答案 1 :(得分:0)

如果要创建数据库,它可能更简单到PInvoke SQLConfigDataSource。然后,您可以通过ADODB,ADO.NET或您选择的VB.NET数据访问方法连接到它。

我没有在VB.NET中执行此操作的示例,但this C# classthis powershell script演示了如何调用该函数。

答案 2 :(得分:0)

我知道这是一个老问题。我今天遇到了完全相同的问题。一些评论询问为什么要使用ADOX,这是因为首先,它来自旧代码,其次,我没有找到其他方法来动态创建mdb文件。

在VB6中,每当您设置adox = Nothing时,该com对象都会立即释放,而ldb文件也会被释放。

在.Net中,您必须依靠GC来收集ldb文件解锁之前的adox。

因此,我做了以下技巧。我知道这很丑陋,但我没有找到其他方法,至少我的技巧起作用了。

$myArray = Get-ADDomain
$hashtable = @{}
$myArray.psobject.properties | Foreach { $hashtable[$_.Name] = $_.Value }
# If you need to do something with the key
Foreach ($key in $hashtable.Keys) {
    $Value = $hashtable[$key]
    if ($value -like '*prod*') {
        Write-Host $key
    }
}