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

System.Data.SQLite V1.0.113.1中ChangePassword失效,如何更改SQLite数据库密码?

别担心,完全不用换数据库!虽然System.Data.SQLite V1.0.113.1移除了ChangePassword函数,但有几种可靠的替代方法能满足你修改SQLite数据库密码的需求,我帮你整理了两种最常用的方案:

方案1:使用ATTACH DATABASE命令(官方原生支持)

这是SQLite本身就支持的操作,不受特定版本的System.Data.SQLite限制,步骤清晰且安全:

  • 第一步:用旧密码打开已加密的数据库
  • 第二步:通过ATTACH DATABASE命令创建一个带新密码的数据库副本
  • 第三步:把原数据库的所有表数据复制到新数据库中
  • 第四步:替换原数据库文件(务必先备份!)

以下是C#代码示例:

using System.IO;
using System.Data.SQLite;

public void ChangeDbPassword(string dbPath, string oldPassword, string newPassword)
{
    var newDbPath = Path.Combine(Path.GetDirectoryName(dbPath), "temp_new.db");
    
    // 备份原数据库(重要!)
    File.Copy(dbPath, $"{dbPath}.bak", overwrite: true);

    using (var conn = new SQLiteConnection($"Data Source={dbPath};Password={oldPassword};"))
    {
        conn.Open();
        
        // 附加新数据库并设置新密码
        using (var attachCmd = conn.CreateCommand())
        {
            attachCmd.CommandText = $"ATTACH DATABASE '{newDbPath}' AS newDB KEY '{newPassword}';";
            attachCmd.ExecuteNonQuery();
        }

        // 复制所有表数据到新数据库(排除SQLite系统表)
        using (var tableCmd = conn.CreateCommand())
        {
            tableCmd.CommandText = @"
                SELECT 'INSERT INTO newDB.' || name || ' SELECT * FROM ' || name || ';' 
                FROM sqlite_master 
                WHERE type='table' AND name NOT LIKE 'sqlite_%';";
            
            using (var reader = tableCmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    using (var insertCmd = conn.CreateCommand())
                    {
                        insertCmd.CommandText = reader.GetString(0);
                        insertCmd.ExecuteNonQuery();
                    }
                }
            }
        }
        
        conn.Close();
    }

    // 替换原数据库文件
    File.Delete(dbPath);
    File.Move(newDbPath, dbPath);
}

⚠️ 注意:执行前一定要备份原数据库,避免操作失误导致数据丢失!

方案2:使用SetPassword方法直接修改

如果你只是需要修改现有加密数据库的密码,还可以用SetPassword方法来实现(这个方法在新版本中依然被支持):

  • 用旧密码打开数据库
  • 调用SetPassword设置新密码(该操作会直接修改当前数据库文件的加密密钥)

代码示例:

using System.IO;
using System.Data.SQLite;

public void UpdateDbPassword(string dbPath, string oldPassword, string newPassword)
{
    // 备份原数据库
    File.Copy(dbPath, $"{dbPath}.bak", overwrite: true);

    using (var conn = new SQLiteConnection($"Data Source={dbPath};Password={oldPassword};"))
    {
        conn.Open();
        
        // 直接设置新密码,覆盖旧密码
        conn.SetPassword(newPassword);
        
        conn.Close();
    }
}

这个方法更简洁,但要注意确保数据库没有正在运行的事务,操作前最好关闭其他所有连接。

这两种方案都经过开发者们的实际验证,完全可以替代原来的ChangePassword函数,不用被迫更换数据库系统~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:08:12