繁体   English   中英

sqlite 数据库在插入时被锁定

[英]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 浏览器

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM