Проверка существования таблицы с сохранением открытого соединения в SQLite
Итак, у меня есть метод, который должен проверить, существует ли таблица в базе данных, которая определяется следующим образом:
internal override bool TableExists(string tableName)
{
bool tableExists = false;
// Check the Tables schema and see if the table exists
using (SQLiteConnection conn = (SQLiteConnection) CreateConnection())
{
conn.Open();
DataRow[] rows = conn.GetSchema("Tables").Select(string.Format("Table_Name = '{0}'", tableName));
tableExists = (rows.Length > 0);
}
// Actually called elsewhere in the code, just here for testing.
File.Delete(DatabaseEnvironmentInfo.GetPrimaryDataFile(DatabaseName));
return tableExists;
}
CreateConnection()
просто создает новое соединение со строкой соединения, поэтому я не думаю, что проблема есть. Если у меня есть удалить строку conn.GetSchema("Tables")...
и я могу удалить файл базы данных, но если я добавлю эту строку обратно, я получаю следующее исключение при попытке удалить после using
:
System.IO.IOException: процесс не может получить доступ к файлу 'C:\db.sqlite', поскольку он используется другим процессом.
Делать DataRow
объекты поддерживают связь с базой данных или кто-нибудь знает, в чем проблема? Если есть лучший способ проверить, существует ли таблица в SQLite, я также открыт для этого.
Спасибо!
3 ответа
Итак, я выяснил проблему, поэтому я опубликую ее здесь на случай, если кто-нибудь столкнется с той же проблемой. В основном у меня был включен пул соединений, поэтому соединения поддерживали открытое соединение с базой данных, и именно поэтому я увидел исключение. Просто добавьте следующее после using
:
SQLiteConnection.ClearAllPools();
У меня была похожая проблема без использования пула соединений. Я обнаружил, что проблема была вызвана отсутствием утилизации SQLiteCommand
s в TableAdapters.
Вы можете найти дополнительные детали здесь.
Если вы добавите conn.Close() в конце вашего использования, вы можете удалить свою базу данных?