天天看點

C#出現sqlite的database is locked的解決方法

轉載: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,即使抛出異常也會自動銷毀。

c#