Sto riscontrando un problema nel chiudere il database prima di tentare di eliminare il file. Il codice è soloSystem.Data.SQLite Close() non rilascia file di database
myconnection.Close();
File.Delete(filename);
E l'Elimina genera un'eccezione che il file è ancora in uso. Ho re-provato il Delete() nel debugger dopo pochi minuti, quindi non è un problema di temporizzazione.
Ho un codice di transazione ma non viene eseguito prima della chiamata a Close(). Quindi sono abbastanza sicuro che non si tratti di una transazione aperta. I comandi sql tra open e close sono solo selezionati.
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 la chiusura().
Visual Studio 2010, C#, System.Data.SQLite versione 1.0.77.0, Win7
vidi un bambino di due anni bug, proprio come questo, ma il changelog dice che è fisso.
C'è qualcos'altro che posso controllare? C'è un modo per ottenere un elenco di comandi o transazioni aperti?
Nuovo, il codice di lavoro:
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);
Hai provato: myconnection.Close(); myconnection.Dispose(); ? – UGEEN
Quando si utilizza [sqlite-net] (https://github.com/praeclarum/sqlite-net/), è possibile utilizzare 'SQLiteAsyncConnection.ResetPool()', vedere [questo problema] (https://github.com/ praeclarum/sqlite-net/pull/399) per i dettagli. –