Не удается зашифровать / расшифровать базу данных SQLite в .NET4 - PullRequest
1 голос
/ 16 декабря 2011

Я использую Visual Studio 2010 на Windows 7 x64. Приложение, которое я пишу, должно работать на всех платформах (AnyCPU). Я могу зашифровать / расшифровать файл базы данных, если я использую System.Data.SQLite.dll либо версию x86 (sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.77.0.zip), либо x64 один (sqlite-netFx40-static-binary-bundle-x64-2010-1.0.77.0.zip).

Мне нужно, чтобы мое приложение работало на обеих платформах x86 и x64 (любой параметр сборки проекта CPU). Я попытался установить поставщик ADO.NET 4.0 (SQLite-1.0.67.1-vs2010-net4-setup.exe). Я добавил ссылку (щелкните правой кнопкой мыши проект, Добавить ссылку, вкладка .NET -> System.Data.SQLite) и запустил программу. Если я расшифрую файл и попытаюсь зашифровать, вызвав ChangePassword («myPass»), я получу следующее исключение:

System.EntryPointNotFoundException было перехвачено

Сообщение = Невозможно найти точку входа с именем «sqlite3_rekey» в DLL «System.Data.SQLite.DLL». Source = System.Data.SQLite TypeName = "" StackTrace:

   at System.Data.SQLite.UnsafeNativeMethods.sqlite3_rekey(IntPtr db, Byte[ key, Int32 keylen)
   at System.Data.SQLite.SQLite3.ChangePassword(Byte[ newPasswordBytes)
   at System.Data.SQLite.SQLiteConnection.ChangePassword(Byte[ newPassword)
   at System.Data.SQLite.SQLiteConnection.ChangePassword(String newPassword)
   at SQLiteTest.Database.Encrypt() in C:\SQLiteTest\Database.cs:line 166

Кроме того, я попытался открыть соединение с помощью объекта SQLiteConnection, и я получил два разных исключения в двух разных случаях. Во-первых, если файл зашифрован и я не указываю пароль в строке подключения, я получаю следующее:

System.Data.SQLite.SQLiteException было обнаружено Сообщение = файл открыт который не является файлом базы данных, зашифрован или не является базой данных
Source = System.Data.SQLite ErrorCode = -2147467259 Трассировки стека: в System.Data.SQLite.SQLite3.Prepare (SQLiteConnection cnn, String strSql, SQLiteStatement предыдущий,

UInt32 timeoutMS, String & strRemain) в System.Data.SQLite.SQLiteCommand.BuildNextCommand () в System.Data.SQLite.SQLiteCommand.GetStatement (индекс Int32) в System.Data.SQLite.SQLiteDataReader.NextResult () в System.Data.SQLite.SQLiteDataReader..ctor (SQLiteCommand cmd, CommandBehavior ведут себя) в System.Data.SQLite.SQLiteCommand.ExecuteReader (CommandBehavior поведение) в System.Data.SQLite.SQLiteCommand.ExecuteNonQuery () в System.Data.SQLite.SQLiteConnection.Open () в SQLiteTest.Database.GetAllLanguages ​​() в C: \ SQLiteTest \ Database.cs: строка 216

Во-вторых, если я добавлю параметр пароля в строку подключения, я получу исключение System.EntryPointNotFoundException, подобное приведенному выше.

Итак, кто-нибудь знает надежный способ работы с зашифрованной базой данных SQLite в приложении C # на платформе AnyCPU?

Заранее спасибо!

1 Ответ

2 голосов
/ 16 декабря 2011

Следующее решение немного грязное, но оно может работать, мы не использовали зашифрованную базу данных, поэтому я не на 100%, если это сработает для вас.Мы загрузили обе версии dll sqlite для x64 и x86 и поместили их в разные папки.Мы загружаем их вручную в зависимости от того, какое приложение платформы выполняется в данный момент (мы проверяем IntPtr.Size, в .net 4 есть свойство в классе Environment, называемое Is64BitOperatingSystem), когда мы загружаем сборку вручную, мы получаем экземпляр соединения с

 var sqliteConnectionType = assembly.GetType("System.Data.SQLite.SQLiteConnection");
 (DbConnection)Activator.CreateInstance(sqliteConnectionType);

мы не используем ссылку на любую версию sqlite в нашем проекте.

...