[英]sqlite database is locked on insertion
有一个简单的代码
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();
然后失败并出现异常“数据库被锁定”。 为什么会发生这种情况? 应用程序不是多线程的。 DB 文件是刚刚创建的。
问题解决了。 在此代码之前,已调用SqlCommand.ExecuteReader()。 尽管创建了该读取器的连接和命令已被处置,但该读取器本身并未被处置。 用“ using(reader)”修复后,连接已正确关闭,上述错误消失了。
总计:即使显式处理了connection和SqlCommand,DataReader仍然可以保持连接。
请注意,如果SQLite 浏览器正在运行并且有任何未保存的更改,请单击在SQLite 浏览器上Write changes
更改!
在我的情况下,我很愚蠢,我在 SQLite 浏览器中进行了更改并且没有单击写入更改,这锁定了要由服务修改的数据库。 单击“写入更改”按钮后,所有发布请求都按预期工作。
根据本主题中的@Rohan Shenoy: SQLite Database Locked exception
您的代码缺少对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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.