这个很想不通,假如本人进去以后多次执行查询以后,就不会出现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++)
{
下面是本人的错误:
未处理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()
}
其二,你把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还是不要使用多线程访问了吧。
这就是桌面版的数据库,你不能把他当企业级使用
这就是桌面版的数据库,你不能把他当企业级使用