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

C#操作SQLite遇数据库锁定错误及参数化查询崩溃求助

解决C#操作SQLite时的数据库锁定问题

我来帮你排查这个数据库锁定的问题——这种情况在C#操作SQLite时挺常见的,咱们一步步来分析和解决:

首先排查外部进程占用

SQLite是文件型数据库,它的锁是文件级的。如果你此时还开着SQLite DB Browser(或者其他能访问这个数据库的程序),很可能它正保持着连接,导致你的C#程序无法获取写入锁。

  • 立刻关闭所有打开Newspaper.db的程序,包括SQLite DB Browser,然后重新运行你的C#程序测试。

代码层面的优化与问题修复

虽然你已经改用了using语句和参数化查询,但还有几个细节需要调整:

1. 确保连接绝对被释放

using语句确实会自动释放连接,但如果你的程序其他地方还有操作这个数据库的代码,一定要确保那些代码也用using包裹连接和命令,避免出现连接泄漏——残留的未关闭连接是导致数据库锁定的高频原因。

2. 修正参数类型匹配问题

你用AddWithValue传递的是文本框的字符串值,但CustomerID大概率是整数类型,Bill是数值类型(比如decimal),隐式类型转换可能会引发潜在问题(虽然不是锁定的直接原因,但可能导致其他报错)。建议显式指定参数类型:

using (SQLiteConnection myconn = new SQLiteConnection(@"Data Source = C:\Users\chick\Newspaper.db"))
{
    var sql = "Update customers SET Bill = Bill - @pay WHERE customers.CustomerID = @cid;";
    try
    {
        myconn.Open();
        using (var cmd = new SQLiteCommand(sql, myconn))
        {
            // 显式指定参数类型,避免类型不匹配
            cmd.Parameters.Add("@cid", DbType.Int32).Value = int.Parse(textBox1.Text);
            cmd.Parameters.Add("@pay", DbType.Decimal).Value = decimal.Parse(textBox2.Text);
            
            int rowsUpdated = cmd.ExecuteNonQuery();
            MessageBox.Show($"成功更新 {rowsUpdated} 条记录");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"更新失败:{ex.Message}");
    }
}

3. 添加完整的异常处理

你修改后的代码没有捕获异常,一旦崩溃就看不到具体错误信息。上面的代码加上了try-catch,能帮你更精准地定位问题(比如如果是参数转换失败,也能及时发现)。

其他可能的排查点

  • 文件权限:检查C:\Users\chick\Newspaper.db的读写权限,确保你的C#程序有读写这个文件的权限(尤其是如果程序以管理员身份运行时,权限可能和普通用户不同)。
  • 多线程访问:如果你的程序是多线程的,要确保所有数据库操作都加锁同步,避免多个线程同时读写导致锁定冲突。

按照上面的步骤调整后,应该能解决数据库锁定的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:44:06