Удалить файл sqlite db
Я занимаюсь разработкой приложения на C# с бэкэндом sqlite. В моем приложении у меня есть кнопка для очистки базы данных (удаление файла.db и создание его заново с некоторыми исходными данными). Иногда, когда я пытаюсь удалить базу данных, она говорит, что не может быть удалена, потому что она используется другим процессом. Перед удалением я использую закрытое соединение, удаляю и очищаю функции пула. Даже тогда это бросает то же самое исключение. Вот мой код:
string targetDataBaseFilePath = Path.Combine(dataDirectoryPath, "local.db");
ThingzDatabase.Create(targetDataBaseFilePath, "touchdb");
В функции создания я определяю следующий код, откуда я получаю ошибку:
if (File.Exists(DatabaseFileName))
{
try
{
ThingzDatabase.localdb.conn.Close();
ThingzDatabase.localdb.conn.Dispose();
SQLiteConnection.ClearAllPools();
}
catch (Exception)
{
}
File.Delete(DatabaseFileName); //error throws from here.
}
Как я могу предотвратить появление ошибки?
6 ответов
FileInfo fi = new FileInfo(DatabasePath);
try
{
if (fi.Exists)
{
SQLiteConnection connection = new SQLiteConnection("Data Source=" + DatabasePath + ";");
connection.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
fi.Delete();
}
}
catch(Exception ex)
{
fi.Delete();
}
DatabasePath - это путь к файлу вашей базы данных
Я просто задал вопрос сам. Решение состояло в том, чтобы позволить сборке мусора немного поработать.
ThingzDatabase.localdb.conn.ClearAllPools();
должен быть призыв к этой линии, я верю.
В строке подключения используйте этот Pooling=False; У меня была такая же проблема с пулами.
Я полагаю, что вы до сих пор не удалили что-то, возвращенное из API.
Какую упаковку sqlite вы используете? Вы цитируете использование своих пользовательских функций, что они делают?
Вы можете использовать такой прокмон от Марка Руссиновича.
Затем вы можете отфильтровать отображение на основе имени файла.
После этого вы можете точно определить, какой процесс блокирует этот файл, и выполнить соответствующую отладку.
Я вижу много работы с процессами. Но у sqlite есть метод для этого. ВАКУУМНАЯ
Команда VACUUM перестраивает файл базы данных, перепаковывая его в минимальный объем дискового пространства.
Я могу предложить вам это, просто обходной путь,
Создайте новую базу данных и сделайте запись для того же самого в вашем файле конфигурации:
overwriting the exisiting config or Setting.Setting file
,Clear all pools
как предложено выше.Перезапустите приложение, используя
Process.kill(name of your app exe)
а потомProcess.start(your exe)
с помощьюProcess class
Перезапуск обновит строку подключения и присоединит исполняемый файл с новой базой данных.
Enumerate all db except the newly created in the target dirs
и делай что хочешь используяFileInfo