Löschen von sqlite db-Datei
Ich bin der Entwicklung einer C# - Anwendung mit backend sqlite. In meiner Anwendung habe ich einen button für die Bereinigung der Datenbank (löschen der .db-Datei und erstellen Sie es erneut mit einigen anfänglichen Daten). Manchmal, wenn ich versuche zu löschen, die db sagt, es kann nicht gelöscht werden, weil es von einem anderen Prozess verwendet. Vor dem löschen bin ich über die enge Verbindung, entsorgen und klaren pool-Funktionen. Selbst dann wirft er die gleiche Ausnahme. Hier ist mein code:
string targetDataBaseFilePath = Path.Combine(dataDirectoryPath, "local.db");
ThingzDatabase.Create(targetDataBaseFilePath, "touchdb");
In der create-Funktion definiere ich den folgenden code, von wo bekomme ich die Fehlermeldung:
if (File.Exists(DatabaseFileName))
{
try
{
ThingzDatabase.localdb.conn.Close();
ThingzDatabase.localdb.conn.Dispose();
SQLiteConnection.ClearAllPools();
}
catch (Exception)
{
}
File.Delete(DatabaseFileName); //error throws from here.
}
Wie kann ich verhindern, dass des Fehlers geworfen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
sollte der Aufruf dieser Zeile glaube ich.
SQLiteConnection.ClearAllPools()
Landete ich nur Fragen, die Frage mich. Die Lösung war, dass die garbage collection ausgeführt werden, die für ein bisschen.
In der Verbindungszeichenfolge verwenden Sie dieses Pooling=False; ich hatte das gleiche problem mit der Bündelung auf.
Ich glaube, Sie haben noch immer nicht entsorgt, etwas zurück von der API.
Die sqlite-wrapper, die Sie verwenden? Sie zitiert haben, verwenden Sie Ihre benutzerdefinierten Funktionen, was tun Sie?
Können Sie ein procmon wie diese ein von Mark Russinovich.
Dann können Sie die Anzeige filtern, auf der Grundlage der mit dem Namen.
Sobald dies erledigt ist, können Sie genau sehen, welcher Prozess sperren Sie diese Datei aus, und Debuggen Sie entsprechend.
Sehe ich eine Menge Arbeit mit Prozessen. Aber sqlite ist eine Methode für Sie.
VAKUUM
https://sqlite.org/lang_vacuum.html