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

用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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值