插入时 SQLite 数据库被锁定

4

有一个简单的代码

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();

然后出现了异常“数据库被锁定”。为什么会发生这种情况?应用程序不是多线程的。数据库文件刚刚创建。


请检查您的任务管理器,看看是否有进程占用了您的SQLite数据库。 - Habib
OpenConnection() 函数是用来做什么的? - ba__friend
存在与活动事务相关的其他连接。这可能来自相同或另一个进程。 - CL.
是的,你说得对。在这段代码之前,有一个 SqlCommand.ExecuteReader 的调用。尽管创建该阅读器的连接和命令已经被销毁了,但是这个阅读器本身没有被释放。通过使用“using(reader)”进行修复,连接被正确关闭,上述错误也消失了。 - Evil Beaver
3个回答

4
问题已解决。 在这段代码之前,有一个对SqlCommand.ExecuteReader()的调用。虽然连接和创建该读取器的命令已被释放,但该读取器本身未被释放。在使用“using(reader)”进行修复后,连接被正确关闭,上述错误消失了。
总之:即使明确释放了连接和SqlCommand,DataReader仍然可以保持连接。

1
请问您能否分享一下插入数据的示例? - OPV
不好意思,我已经离开了这个项目并且把代码删除了。 - Evil Beaver

2

请注意,如果SQLite浏览器正在运行且存在未保存的更改,请点击写入更改

Sqlite browser

在我的情况下,我非常愚蠢,我正在SQLite浏览器中进行更改,并没有点击“写入更改”,这导致了DB被锁定,无法被服务修改。当我点击“写入更改”按钮后,所有的POST请求都按预期工作。
根据@Rohan Shenoy在此主题中的说法:SQLite数据库锁定异常


-2

你的代码缺少调用 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;

这是一个英语论坛,请只用英语书写。 - Alejandro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接