sqlite数据库在插入时被锁定

时间:2014-03-24 14:52:31

标签: c# sqlite hang

有一个简单的代码

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

然后失败,异常“数据库被锁定”。 为什么会这样?应用程序不是多线程的。数据库文件刚刚创建。

3 个答案:

答案 0 :(得分:2)

问题解决了。 在此代码之前,调用了SqlCommand.ExecuteReader()。虽然处理了创建这个阅读器的连接和命令,但是这个阅读器本身并没有被处理掉。用"使用(阅读器)"连接正确关闭,上面的错误消失了。

总的来说:即使连接和SqlCommand被明确部署,DataReader仍然可以保持连接。

答案 1 :(得分:0)

请注意,如果 SQLite 浏览器 正在运行并且有任何未保存的更改,请在 SQLite 浏览器上单击 Write changes

Sqlite browser

在我的情况下,我很愚蠢,我在 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;