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

来源:互联网 发布:自己编曲的软件 编辑:程序博客网 时间:2024/05/15 07:01

用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,即使抛出异常也会自动销毁。
0 0