ADOX оставив файловые ручки открытыми - PullRequest
0 голосов
/ 27 апреля 2011

Кто-нибудь когда-нибудь испытывал проблемы с библиотекой ADOX, оставляя открытыми дескрипторы файлов?

У меня странная проблема с преобразованием VB6 -> VB.Net.Существует функция, которая использует ADOX для просмотра таблиц в данной базе данных и сбрасывает начальные значения любых столбцов в указанных таблицах со свойством автоматического приращения, установленным в значение true.

Я отследил проблему довызов "col.Properties (" Автоинкремент "). Значение".Если эта строка кода закомментирована, то дескриптор файла корректно завершается, когда я закрываю соединения ADO и ADOX в конце функции.Если я оставлю эту строку, дескриптор остается открытым, несмотря на закрывающие вызовы и принудительную сборку мусора.

Вот как я закрываю объекты:

System.Runtime.InteropServices.Marshal.ReleaseComObject(adoConn)  
Dim connection As ADODB.Connection = cat.ActiveConnection  
If Not connection Is Nothing Then  
   connection.Close()  
End If  
cat.ActiveConnection = Nothing  
cat = Nothing  

adoConn - это соединение ADO, иcat является объектом ADOX.Catalog.col (ранее) - это объект ADOX.Column, используемый с объектом каталога.

Первоначально я пытался преобразовать этот алгоритм в ADO.Net, и с помощью объекта DataSet я подошел близко, но не смог выяснитьКак определить, был ли столбец таблицы установлен на автоприращение.Это с базами данных Access 2000 между прочим.

1 Ответ

1 голос
/ 11 января 2012

У меня просто была проблема с файлом блокировки, оставленным после создания базы данных с использованием ADOX. Убедиться, что соединение закрыто и файл блокировки не используется ни одной из ваших программных ресурсов, может помочь:

System.Runtime.InteropServices.Marshal.ReleaseComObject(adoConn)

Dim connection As ADODB.Connection = cat.ActiveConnection

If Not connection Is Nothing Then
  connection.Close()   
End If   

'Try adding this below
System.Runtime.InteropServices.Marshal.ReleaseComObject(connection)
System.Runtime.InteropServices.Marshal.ReleaseComObject(cat)
GC.Collect()

cat.ActiveConnection = Nothing   
cat = Nothing 
...