Удалить файл sqlite db - PullRequest
       57

Удалить файл sqlite db

4 голосов
/ 17 июня 2011

Я занимаюсь разработкой приложения на 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 ]

2 голосов
/ 16 декабря 2011

Я просто задал вопрос . Решение состояло в том, чтобы позволить сборке мусора немного поработать.

2 голосов
/ 16 декабря 2011
ThingzDatabase.localdb.conn.ClearAllPools(); 

должен быть вызов этой линии, я верю.

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

В строке подключения используйте this Pooling = False; У меня была такая же проблема с пулом.

0 голосов
/ 25 сентября 2017

Я вижу много работы с процессами. Но у sqlite есть метод для этого. ВАКУУМНАЯ

Команда VACUUM перестраивает файл базы данных, перепаковывая его в минимальный объем дискового пространства.

https://sqlite.org/lang_vacuum.html

0 голосов
/ 16 декабря 2011

Вы можете использовать procmon как этот one от Mark Russinovich.
Затем вы можете отфильтровать отображение на основе имени файла.
После этого вы можете точно определить, какой процесс блокирует этот файл, и выполнить соответствующую отладку.

0 голосов
/ 10 декабря 2011

Полагаю, вы еще не избавились от чего-то, возвращенного из API.

Какую упаковку sqlite вы используете? Вы цитируете использование своих пользовательских функций, что они делают?

...