You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:SQLite数据库锁定错误及未处理SQLiteException异常(附代码)

嘿,这个SQLite数据库锁定的问题我碰到过不少,来帮你捋捋原因和解决办法:

核心问题分析与修复方案

首先,SQLite作为文件型数据库,锁定通常是因为数据库连接没有被正确释放,或者有其他进程/线程在占用数据库文件。结合你的代码,主要有几个关键问题要修正:

1. 连接未安全释放(最可能的原因)

你当前的代码直接调用con.Open()和con.Close(),但如果执行过程中抛出异常(比如SQL语法错误),con.Close()就不会执行,导致连接一直挂着,直接把数据库锁死。

正确做法:用using语句自动管理资源

using语句会在代码块结束时自动释放连接(不管有没有异常),这是.NET里管理资源的标准做法:

private void button1_Click(object sender, EventArgs e)
{
    // 用using包裹连接对象,自动关闭释放
    using (var con = new SQLiteConnection("你的数据库连接字符串"))
    {
        con.Open();
        string name = textBox1.Text;
        
        // 命令对象也用using包裹,确保资源释放
        using (var kom = con.CreateCommand())
        {
            // 改用参数化查询,同时解决SQL注入问题
            kom.CommandText = "insert into test(name) values(@name)";
            kom.Parameters.AddWithValue("@name", name);
            kom.ExecuteNonQuery();
        }
        
        textBox1.Clear();
    } // 这里会自动执行con.Close(),无需手动调用
}

2. 必须修复的SQL注入漏洞

你原来的代码直接把用户输入的textBox1.Text拼接到SQL语句里,这不仅会导致输入带单引号时抛出语法错误,还会引发严重的SQL注入攻击。上面的代码已经用参数化查询解决了这个问题,一定要这么写。

3. 其他可能的锁定排查点

  • 检查有没有其他程序(比如SQLite可视化工具)正在打开这个数据库文件,外部程序持有连接会直接导致锁定。
  • 如果你的程序其他地方也用到了这个数据库,确保那些地方也用了using或者正确关闭了连接,不要让连接长时间处于打开状态。
  • SQLite对多线程/多进程操作支持有限,尽量保证同一时间只有一个活跃连接在操作数据库。

内容的提问来源于stack exchange,提问作者user9011395

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:36:46