我有一个使用 System.Data.Sqlite 包和 ChangePassword 方法使用密码创建的数据库。
是否可以使用 Microsoft.Data.Sqlite 包打开此数据库?我尝试使用此处描述的 sqlcipher 包: https ://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/encryption?tabs=netcore-cli 但我收到错误:
Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 26: 'file is not a database'.
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
at Microsoft.Data.Sqlite.SqliteCommand.<PrepareAndEnumerateStatements>d__64.MoveNext()
at Microsoft.Data.Sqlite.SqliteCommand.<GetStatements>d__54.MoveNext()
at Microsoft.Data.Sqlite.SqliteDataReader.NextResult()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
at Microsoft.Data.Sqlite.SqliteConnectionExtensions.ExecuteNonQuery(SqliteConnection connection, String commandText, SqliteParameter[] parameters)
at Microsoft.Data.Sqlite.SqliteConnection.Open()
我的连接字符串如下所示:
Data Source=<full path to db>;Password=<password>
更多信息:Microsoft.Data.Sqlite.Core 包 5.0.2 SQLitePCLRaw.bundle_e_sqlcipher 包 2.0.4
我也尝试过不在连接字符串中指定密码,而是在打开连接字符串后的 pragma 语句中指定密码,如下所述: https ://www.bricelam.net/2016/06/13/sqlite-encryption.html
但我得到同样的错误。
SqliteConnection liteConnection = new SqliteConnection(this.ConnectionString);
liteConnection.Open();
using (var command = liteConnection.CreateCommand())
{
command.CommandText = "SELECT quote($password);";
command.Parameters.AddWithValue("$password", _password);
var quotedPassword = (string)command.ExecuteScalar();
Console.WriteLine(quotedPassword);
command.CommandText = "PRAGMA key = " + quotedPassword;
command.Parameters.Clear();
command.ExecuteNonQuery();
}