轉載:http://blog.csdn.net/goodelephant/article/details/20488711
用C#和sqlite開發了一個小管理程式,但是最後測試的時候發現多次添加、删除時總會報錯,database is locked,在由SQLiteConnection建立的SQLiteCommand對象執行ExcuteNonQuery()函數時抛出異常。
查了一下相關的内容,很有可能是因為sqlite對于并發改添删的執行很“粗鄙”,隻提供庫級鎖,解決的方法是使用信号量-_-!但是我做的這個小程式要毛線并發管理,要毛線個鎖。看到有人提示是連接配接沒有關閉和銷毀。
select語句中使用
(發文章沒有C#代碼風格的選項,我選擇了Java)
[csharp] view plain copy
- try
- {
- conn = new SQLiteConnection("Data Source=test.db");
- conn.Open();
- cmd = conn.CreatCommand();
- cmd.CommandText="select * from haha";
- reader = cmd.ExcuteQuery();
- while(reader.Read()){
- ...
- }
- }
- catch(Exception){}
- finally{
- if(reader!=null) reader.Close();
- if(cmd!=null)cmd=null;
- if(conn!=null)conn.Close();
- }
沒有出錯,但是移植在ExcuteNonQuery();增删改幾次就不好用了。
百度“C# sqlite database is locked”前幾頁果然沒有适合C#的方法,bing看到英文論壇上有個解決方法,就是使用C#的using語句對于資源的釋放的特點,當語句完成後會自動關閉連接配接并銷毀SQLiteConnection和SQLiteCommand,即使抛出異常也會自動銷毀。
[csharp] view plain copy
- private int doNonQuery(string command)
- {
- int ret = -1;
- using (SQLiteConnection conn = new SQLiteConnection("Data Source=jiancai.db"))
- {
- using (SQLiteCommand cmd = new SQLiteCommand(command, conn))
- {
- cmd.Connection.Open();
- ret = cmd.ExecuteNonQuery();
- }
- }
- }
在調用函數中使用try...catch塊包含調用語句進行異常管理。連續測試多次添加、修改、删除操作,沒有再抛出locked異常
百度“C# sqlite database is locked”前幾頁果然沒有适合C#的方法,bing看到英文論壇上有個解決方法,就是使用C#的using語句對于資源的釋放的特點,當語句完成後會自動關閉連接配接并銷毀SQLiteConnection和SQLiteCommand,即使抛出異常也會自動銷毀。