用C#和sqlite开发了一个小管理程序,但是最后测试的时候发现多次添加、删除时总会报错,database is locked,在由SQLiteConnection建立的SQLiteCommand对象执行ExcuteNonQuery()函数时抛出异常。
查了一下相关的内容,很有可能是因为sqlite对于并发改添删的执行很“粗鄙”,只提供库级锁,解决的方法是使用信号量-_-!但是我做的这个小程序要毛线并发管理,要毛线个锁。看到有人提示是连接没有关闭和销毁。
select语句中使用
(发文章没有C#代码风格的选项,我选择了Java)
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,即使抛出异常也会自动销毁。
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,即使抛出异常也会自动销毁。