热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#出现sqlite的databaseislocked的解决方法

用C#和sqlite开发了一个小管理程序,但是最后测试的时候发现多次添加、删除时总会报错,databaseislocked,在由SQLiteConnection建立的SQLiteCommand对象

用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,即使抛出异常也会自动销毁。
推荐阅读
author-avatar
多米音乐_54101533
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有