c#操作sqlite出现错误,database is locked

.Net技术 码拜 8年前 (2016-06-08) 4140次浏览
这个很想不通,假如本人进去以后多次执行查询以后,就不会出现database is locked,但是只执行一到两次次查询以后,就会出现database is locked。求高手帮助。
下面是本人的错误:
未处理System.Data.SQLite.SQLiteException
HResult=-2147467259
Message=database is locked
database is locked
Source=System.Data.SQLite
ErrorCode=5
下面是本人的代码:
private void save_Click(object sender, EventArgs e)
{
for (int i = 0; i < user_dataGridView.Rows.Count – 1; i++)
{

try
{
using (SQLiteConnection cnn = new SQLiteConnection(value.connstr))
{
cnn.Open();
string sql = “UPDATE banma_user SET user_name = “” + user_dataGridView.Rows[i].Cells[1].Value.ToString() + “”,user_password = “” + user_dataGridView.Rows[i].Cells[2].Value.ToString() + “” WHERE user_id = ” + user_dataGridView.Rows[i].Cells[0].Value.ToString();
using (SQLiteCommand cmd = new SQLiteCommand(sql, cnn))
{
cmd.ExecuteNonQuery();
textBox1.Text += i.ToString() + “success!” + “\r\n”;
cmd.Dispose();
cnn.Close();
cnn.Dispose();
}
}
}
catch
{
textBox1.Text += i.ToString() + “error!” + “\r\n”;
}

//textBox1.Text += sql + “\r\n”;
}
}//保存

解决方案

26

首先,你这个程序看起来并不是多线程,理论上一般不会导致这个问题
其二,你把cnn.Open();写在for循环里完全没有必要,在一个快速的循环中,反复的连接和断开数据库,从本身这个代码看起来,是单线程的,数据库连接是断开后,再执行下个循环的连接,但是你知道sqlite是怎么断开数据库的呢?说不定它的断开是多线程的。所以有可能导致你说的lock问题。 解决方法就是把cnn.Open();放循环外,这样也才是最高效的。
其三,假如还不行,就加lock
static object obj = new object();
lock(obj)
{
conn.open()
//你的代码
//conn.close()
}

1

不清楚,什么是快速的执行,什么是慢慢的执行

5

LZ你在循环体中打开连接并更新数据,本人可以保证这样是非常慢的,未显示启用事务的情况下,任何变更数据的语句都默认启动一个事务,正确的做法是显示启动一个事务,然后执行语句再提交事务。至于锁的问题,你先把本人说的逻辑修改过来再看。

1

http://www.cnblogs.com/Bonker/p/3445240.html

5

ye.Dispose();有什么用,去掉试试

2

sqlite还是不要使用多线程访问了吧。
这就是桌面版的数据库,你不能把他当企业级使用

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c#操作sqlite出现错误,database is locked
喜欢 (0)
[1034331897@qq.com]
分享 (0)