C#出现sqlite的database is locked的解决方法

来源:互联网 发布:手机验证码源码 编辑:程序博客网 时间:2024/04/29 05:19

转载:http://blog.csdn.net/goodelephant/article/details/20488711


用C#和sqlite开发了一个小管理程序,但是最后测试的时候发现多次添加、删除时总会报错,database is locked,在由SQLiteConnection建立的SQLiteCommand对象执行ExcuteNonQuery()函数时抛出异常。

查了一下相关的内容,很有可能是因为sqlite对于并发改添删的执行很“粗鄙”,只提供库级锁,解决的方法是使用信号量-_-!但是我做的这个小程序要毛线并发管理,要毛线个锁。看到有人提示是连接没有关闭和销毁。


select语句中使用

(发文章没有C#代码风格的选项,我选择了Java)


[csharp] view plain copy
  1. try  
  2. {  
  3.     conn = new SQLiteConnection("Data Source=test.db");  
  4.     conn.Open();  
  5.     cmd = conn.CreatCommand();  
  6.     cmd.CommandText="select * from haha";  
  7.     reader = cmd.ExcuteQuery();  
  8.     while(reader.Read()){  
  9.         ...  
  10.     }  
  11. }  
  12. catch(Exception){}  
  13. finally{  
  14.     if(reader!=null) reader.Close();  
  15.     if(cmd!=null)cmd=null;  
  16.     if(conn!=null)conn.Close();  
  17. }  


没有出错,但是移植在ExcuteNonQuery();增删改几次就不好用了。


百度“C# sqlite database is locked”前几页果然没有适合C#的方法,bing看到英文论坛上有个解决方法,就是使用C#的using语句对于资源的释放的特点,当语句完成后会自动关闭连接并销毁SQLiteConnection和SQLiteCommand,即使抛出异常也会自动销毁。

[csharp] view plain copy
  1. private int doNonQuery(string command)  
  2. {  
  3. int ret = -1;  
  4.         using (SQLiteConnection conn = new SQLiteConnection("Data Source=jiancai.db"))  
  5.         {  
  6. using (SQLiteCommand cmd = new SQLiteCommand(command, conn))  
  7.                 {  
  8.                         cmd.Connection.Open();  
  9.                         ret = cmd.ExecuteNonQuery();  
  10.                 }  
  11.          }  
  12. }  


在调用函数中使用try...catch块包含调用语句进行异常管理。连续测试多次添加、修改、删除操作,没有再抛出locked异常

百度“C# sqlite database is locked”前几页果然没有适合C#的方法,bing看到英文论坛上有个解决方法,就是使用C#的using语句对于资源的释放的特点,当语句完成后会自动关闭连接并销毁SQLiteConnection和SQLiteCommand,即使抛出异常也会自动销毁。