Ho problemi a chiudere il database prima di tentare di eliminare il file. Il codice è giusto
myconnection.Close();
File.Delete(filename);
E Elimina genera un'eccezione che il file è ancora in uso. Ho riprovato Delete () nel debugger dopo pochi minuti, quindi non è un problema di temporizzazione.
Ho un codice di transazione ma non viene eseguito affatto prima della chiamata Close (). Quindi sono abbastanza sicuro che non sia una transazione aperta. I comandi sql tra open e close sono solo selezioni.
ProcMon mostra il mio programma e il mio antivirus guardando il file del database. Non mostra il mio programma che rilascia il file db dopo close ().
Visual Studio 2010, C #, System.Data.SQLite versione 1.0.77.0, Win7
Ho visto un bug di due anni proprio come questo ma il log delle modifiche dice che è stato risolto.
C'è qualcos'altro che posso controllare? C'è un modo per ottenere un elenco di eventuali comandi o transazioni aperti?
Nuovo codice funzionante:
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);