System.Data.SQLite Close() not releasing database file -


i'm having problem closing database before attempt delete file. code just

 myconnection.close();      file.delete(filename); 

and delete throws exception file still in use. i've re-tried delete() in debugger after few minutes, it's not timing issue.

i have transaction code doesn't run @ before close() call. i'm sure it's not open transaction. sql commands between open , close selects.

procmon shows program , antivirus looking @ database file. not show program releasing db file after close().

visual studio 2010, c#, system.data.sqlite version 1.0.77.0, win7

i saw 2 year old bug changelog says it's fixed.

is there else can check? there way list of open commands or transactions?


new, working code:

 db.close();  gc.collect();   // yes, release 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 throws on locking     {        tries++;     }  }  if (!worked)     throw new ioexception("unable close file" + filename); 

encountered same problem while ago while writing db abstraction layer c# , never got around finding out issue was. ended throwing exception when attempted delete sqlite db using library.

anyway, afternoon looking through again , figured try , find out why doing once , all, here i've found far.

what happens when call sqliteconnection.close() (along number of checks , other things) sqliteconnectionhandle points sqlite database instance disposed. done through call sqliteconnectionhandle.dispose(), doesn't release pointer until clr's garbage collector performs garbage collection. since sqliteconnectionhandle overrides criticalhandle.releasehandle() function call sqlite3_close_interop() (through function) not close database.

from point of view bad way things since programmer not when database gets closed, way has been done guess have live now, or commit few changes system.data.sqlite. volunteers welcome so, unfortunately out of time before next year.

tl;dr solution force gc after call sqliteconnection.close() , before call file.delete().

here sample code:

string filename = "testfile.db"; sqliteconnection connection = new sqliteconnection("data source=" + filename + ";version=3;"); connection.close(); gc.collect(); file.delete(filename); 

good luck it, , hope helps


Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -