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
相关产品推荐
相关产品推荐

