0

我有一个使用 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();
            }
4

1 回答 1

0

尝试使用 SQLCipher 中的cipher_migrate。也许你有不同的密码版本

                    connection.Open();
                    using var command = connection.CreateCommand();
                    command.CommandText = $"PRAGMA key = {DatabaseKey};PRAGMA cipher_migrate;";
                    command.Parameters.Clear();
                    command.ExecuteNonQuery();
于 2021-02-02T18:26:16.587 回答