Дескриптор файла базы данных SQLite никогда не закрывается C#C#

Место общения программистов C#
Ответить
Anonymous
 Дескриптор файла базы данных SQLite никогда не закрывается C#

Сообщение Anonymous »

Я пытаюсь удалить файл базы данных SQLite из моего приложения C#. Одно и то же приложение выполняет несколько запросов RW к БД, каждый раз создавая и удаляя новое соединение.
При попытке удалить БД (в тот момент, когда я могу гарантировать, что программа не запрос к БД, поэтому активных соединений нет) Я столкнулся с ошибкой:

Код: Выделить всё

IOException: The process cannot gain access to  because is being used by another process.
Я исследовал несколько часов: мой код, SO-вопросы, использование procmon и resmon, чтобы убедиться, что мой процесс был единственным, который содержал активный дескриптор файла.
После всего этого я определил, что файл БД закрывается неправильно всякий раз, когда я создаю соединение с БД. Ниже следует объяснение:
У меня есть следующая функция для выполнения запроса и загрузки результатов в DataTable:

Код: Выделить всё

public DataTable PerformQuery(string query) {
try {
DataTable table = new DataTable();
using(SQLiteConnection connection = new SQLiteConnection(connString)) {
SQLiteCommand cmd = connection.CreateCommand();
cmd.CommandText = query;
connection.Open();
if (!query.StartsWith("SELECT")) {
cmd.ExecuteNonQuery();
} else {
SQLiteDataReader reader = cmd.ExecuteReader();
FillTable(reader, table);
}
// Despite using the using scope, close and dispose the connection manually
connection.Close();
connection.Dispose();
}
// Kill all pools and call GC
SQLiteConnection.ClearAllPools();
GC.Collect();
GC.WaitForPendingFinalizers();
return table;
} catch (Exception ex) {
// Handle error... (not relevant)
return null;
}
}
Что ж, используя SysInternals handle.exe в бесконечном цикле (выполняющемся каждую секунду) и пошагово отлаживая программу с помощью отладчика Visual Studio, я обнаружил, что файл дескриптор моего файла БД не закрывается, несмотря на:
  • Вызов Close
  • Вызов Dispose
  • Выход из области использования
  • Уничтожение всех пулов
  • Выполнение GC и ждём завершения
Мне действительно нужно удалить файл БД из кода, но я не могу, поскольку дескриптор файла никогда не закрывается.
Как я могу решить эту проблему?
РЕДАКТИРОВАТЬ 1:
  • Использование .NET Приложение Winforms с System.Data.SQLite
  • Уже пробовал добавить Pooling=false в строку подключения.


Подробнее здесь: https://stackoverflow.com/questions/751 ... ed-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»