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;