Mam problem z zamknięciem bazy danych przed próbą usunięcia pliku. Kod jest po prostu
myconnection.Close();
File.Delete(filename);
A Delete zgłasza wyjątek, że plik jest nadal używany. Po kilku minutach ponownie wypróbowałem funkcję Delete () w debugerze, więc nie jest to problem z synchronizacją.
Mam kod transakcji, ale w ogóle nie działa przed wywołaniem Close (). Więc jestem prawie pewien, że nie jest to otwarta transakcja. Polecenia sql między otwieraniem a zamykaniem to tylko zaznaczenia.
ProcMon pokazuje mój program i mój program antywirusowy przeglądający plik bazy danych. Nie pokazuje, że mój program zwalnia plik db po wykonaniu funkcji close ().
Visual Studio 2010, C #, System.Data.SQLite w wersji 1.0.77.0, Win7
Widziałem taki błąd sprzed dwóch lat, ale dziennik zmian mówi, że został naprawiony.
Czy jest coś jeszcze, co mogę sprawdzić? Czy jest sposób, aby uzyskać listę otwartych poleceń lub transakcji?
Nowy, działający kod:
db.Close();
GC.Collect(); // yes, really release the db
bool worked = false;
int tries = 1;
while ((tries < 4) && (!worked))
{
try
{
Thread.Sleep(tries * 100);
File.Delete(filename);
worked = true;
}
catch (IOException e) // delete only throws this on locking
{
tries++;
}
}
if (!worked)
throw new IOException("Unable to close file" + filename);