gpt4 book ai didi

c# - 无法在.NET4 中加密/解密 SQLite 数据库

转载 作者:行者123 更新时间:2023-12-01 23:14:03 24 4
gpt4 key购买 nike

我在 Windows 7 x64 上运行 Visual Studio 2010。我正在编写的应用程序应该在所有平台(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 项目build设置)上运行。我尝试安装 ADO.NET 4.0 Provider (SQLite-1.0.67.1-vs2010-net4-setup.exe)。我添加了引用(右键单击项目,添加引用,.NET 选项卡 -> System.Data.SQLite)并运行该程序。如果我解密文件并尝试通过调用 ChangePassword("myPass") 进行加密,则会出现以下异常:

System.EntryPointNotFoundException was caught

Message=Unable to find an entry point named 'sqlite3_rekey' in 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 was caught Message=File opened that is not a database file file is encrypted or is not a database
Source=System.Data.SQLite ErrorCode=-2147467259 StackTrace: at System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn, String strSql, SQLiteStatement previous,

UInt32 timeoutMS, String& strRemain) at System.Data.SQLite.SQLiteCommand.BuildNextCommand() at System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index) at System.Data.SQLite.SQLiteDataReader.NextResult() at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave) at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior) at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery() at System.Data.SQLite.SQLiteConnection.Open() at SQLiteTest.Database.GetAllLanguages() in C:\SQLiteTest\Database.cs:line 216

其次,如果我将密码参数添加到连接字符串中,我会得到像上面那样的 System.EntryPointNotFoundException 异常。

那么,有谁知道在 AnyCPU 平台上的 C# 应用程序中使用加密 SQLite 数据库的可靠方法吗?

提前致谢!

最佳答案

以下解决方案有点脏,但它可能有效,我们没有使用加密数据库,所以我不是 100% 如果这对你有用。我们下载了 x64 和 x86 的两个版本的 sqlite dll,并将它们放在不同的文件夹中。我们根据当前运行的平台应用程序手动加载它们(我们检查 IntPtr.Size ,从 .net 4 开始,Environment 类中有一个名为 Is64BitOperatingSystem 的属性),当我们手动加载程序集时,我们会得到连接实例

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

我们在项目中不使用对任何版本的 sqlite 的引用。

关于c# - 无法在.NET4 中加密/解密 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8535511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com