有一个简单的代码
var insert =
@"INSERT INTO [files] (
[Name],
[FullName],
[MD5])
VALUES (@Name, @FullName, @MD5);";
using (var con = _db.OpenConnection())
{
using (var cmd = con.CreateCommand())
{
cmd.CommandText = insert;
cmd.Parameters.AddWithValue("@Name", item.Name);
cmd.Parameters.AddWithValue("@FullName", item.FullName);
cmd.Parameters.AddWithValue("@MD5", item.MD5);
cmd.ExecuteNonQuery();
}
}
应用程序在执行
时会挂起一段时间cmd.ExecuteNonQuery();
然后失败,异常“数据库被锁定”。 为什么会这样?应用程序不是多线程的。数据库文件刚刚创建。
答案 0 :(得分:2)
问题解决了。 在此代码之前,调用了SqlCommand.ExecuteReader()。虽然处理了创建这个阅读器的连接和命令,但是这个阅读器本身并没有被处理掉。用"使用(阅读器)"连接正确关闭,上面的错误消失了。
总的来说:即使连接和SqlCommand被明确部署,DataReader仍然可以保持连接。
答案 1 :(得分:0)
请注意,如果 SQLite 浏览器 正在运行并且有任何未保存的更改,请在 SQLite 浏览器上单击 Write changes
!
在我的情况下,我很愚蠢,我在 SQLite 浏览器中进行更改并且没有点击写入更改,这锁定了要由服务修改的数据库。单击“写入更改”按钮后,所有发布请求都按预期工作。
根据@Rohan Shenoy 在本主题中的说法:SQLite Database Locked exception
答案 2 :(得分:-1)
您的代码缺少对prepare()
int i=0;
try
{
Conectar();
SQLiteCommand comando = new SQLiteCommand(con);
comando.CommandText = "INSERT INTO EMPRESA (NAME,ESTADO) VALUES (@name, @estado)";
comando.Parameters.AddWithValue("@name", art.NAME);
comando.Parameters.AddWithValue("@estado", art.ESTADO);
comando.Prepare();
con.Open();
i = comando.ExecuteNonQuery();
con.Close();
}
catch (SQLiteException ex)
{
string a = ex.Message.ToString();
throw;
}
return i;