Обнаружил ту же проблему некоторое время назад, когда писал уровень абстракции БД для C #, и я так и не смог найти причину проблемы.Я просто закончил тем, что выдал исключение, когда вы пытались удалить базу данных SQLite, используя мою библиотеку.
Во всяком случае, сегодня днем я снова просмотрел все это и решил, что постараюсь выяснить, почему это происходит один раз.и для всех, вот что я нашел до сих пор.
Что происходит, когда вы звоните SQLiteConnection.Close()
, это то, что (вместе с рядом проверок и других вещей) SQLiteConnectionHandle
указывает наЭкземпляр базы данных SQLite расположен.Это делается с помощью вызова SQLiteConnectionHandle.Dispose()
, однако это на самом деле не освобождает указатель, пока сборщик мусора в CLR не выполнит некоторую сборку мусора.Поскольку SQLiteConnectionHandle
переопределяет функцию CriticalHandle.ReleaseHandle()
для вызова sqlite3_close_interop()
(через другую функцию), это не закрывает базу данных.
С моей точки зрения, это очень плохой способ сделать что-то, так как программистна самом деле не уверен, когда база данных будет закрыта, но это именно так, как это было сделано, поэтому я думаю, что мы должны с этим пока жить или внести несколько изменений в System.Data.SQLite.Любые добровольцы могут сделать это, к сожалению, у меня нет времени сделать это до следующего года.
TL; DR Решение состоит в том, чтобы принудительно собрать GC после вашего звонка на SQLiteConnection.Close()
и перед вашим звонком на File.Delete()
.
Вот пример кода:
string filename = "testFile.db";
SQLiteConnection connection = new SQLiteConnection("Data Source=" + filename + ";Version=3;");
connection.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
File.Delete(filename);
Удачи с этим, и я надеюсь, что это поможет