C# sqlite数据库在插入时被锁定
有一个简单的代码C# sqlite数据库在插入时被锁定,c#,sqlite,freeze,C#,Sqlite,Freeze,有一个简单的代码 var insert = @"INSERT INTO [files] ( [Name], [FullName], [MD5]) VALUES (@Name, @FullName, @MD5);"; using (var con = _db.OpenConnection()) { using (var cmd = con.CreateCommand()) { cmd.CommandText = in
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();
然后失败,出现异常“数据库已锁定”。
为什么会这样?应用程序不是多线程的。数据库文件刚刚创建。问题已解决。
在此代码之前,有对SqlCommand.ExecuteReader()的调用。虽然创建此读取器的连接和命令已被释放,但此读取器本身未被释放。使用“使用(读卡器)”修复后,连接正确关闭,上述错误消失
总的来说:即使显式地释放了connection和SqlCommand,DataReader仍然可以保持连接。您的代码缺少对
prepare()的调用。
检查您的任务管理器,看看是否有一个进程保存在您的SQLite数据库中。OpenConnection()做什么?还有其他与活动事务的连接。这可能来自同一个或另一个过程。是的,你是对的。在此代码之前,有对SqlCommand.ExecuteReader的调用。虽然创建此读取器的连接和命令已被释放,但此读取器本身未被释放。用“使用(阅读器)”修复后,连接正确关闭,上面的错误消失。你能分享一下插入数据的例子吗?不,不合适,我离开了这个项目,把代码扔掉了。这是一个讲英语的论坛。请只用英语写。
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;