Как освободить файл блокировки MS Access LDB после его создания - PullRequest
2 голосов
/ 17 февраля 2012

извините за длинный текст.

Проблема: у меня проблемы с удалением LDB, сгенерированного методом "CREATE" ADOX в следующем фрагменте кода. Пожалуйста, предоставьте некоторые подсказки / указатели к решениям, и спасибо.

Цели: Создать (на лету) новую базу данных доступа, а затем экспортировать данные (например, модули Arena) в эту вновь созданную базу данных.

Ожидается: вновь созданная база данных доступа должна использоваться некоторыми внешними операциями, например Access.exe, после завершения подпрограммы и без выхода из текущей программы VB.

  1. Я проверял, что «код арены» ничего не делает для создания / выпуска файла ldb.

  2. Я протестировал «Эксклюзивный режим» в строке подключения, но файл доступа по-прежнему заблокирован программой vb.

  3. Я тестировал как внутри среды VB, так и напрямую вызывал сгенерированные из Проводника результаты.

  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 64bit, Office 2010 (32)
  • VB 2010, экспресс
  • Lib: MS ADO Ext. 2.8 для DDL и безопасности

Ответы [ 3 ]

0 голосов
/ 09 декабря 2013

Если вы хотите создать базу данных, возможно, проще: PInvoke SQLConfigDataSource .Затем вы можете подключиться к нему через ADODB, ADO.NET или методику доступа к данным VB.NET.

У меня нет примера сделать это в VB.NET, но это C #класс и этот сценарий powershell демонстрирует, как вызывать функцию.

0 голосов
/ 27 декабря 2018

Я знаю, что это старый вопрос. Я столкнулся с точно такой же проблемой сегодня. В некоторых комментариях спрашивается, зачем использовать ADOX, потому что, во-первых, это из унаследованного кода, а во-вторых, я не нашел других способов динамического создания файла MDB.

В VB6 всякий раз, когда вы устанавливаете adox = Nothing, этот com-объект будет немедленно освобожден, как и файл ldb.

В .Net вы должны полагаться на сборщик мусора, прежде чем файл ldb будет разблокирован.

Итак, я сделал следующий трюк. Я знаю, что это некрасиво, но я не нашел других путей, и по крайней мере мой трюк сработал.

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)
0 голосов
/ 23 февраля 2012

Как насчет закрытия mdb после создания, а затем его открытия?
Я не эксперт по VS, но в Access многие вещи в «режиме разработки» переводят mdb в эксклюзивный режим ... и вы не можете переключиться обратно, не закрыв сначала, я подозреваю.

...