2011-12-16 132 views
1

我在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)。无法在.NET4中加密/解密SQLite数据库

我需要我的应用程序在x86和x64这两个平台上运行(任何CPU项目构建设置)。我试过安装ADO.NET 4.0 Provider(SQLite-1.0.67.1-vs2010-net4-setup.exe)。我添加了引用(右键单击项目,添加引用,.NET选项卡 - > System.Data.SQLite)并运行该程序。如果我解密文件,并尝试通过调用ChangePassword(“为mypass”)来加密,我得到以下异常:

System.EntryPointNotFoundException被抓获

消息=无法找到一个切入点命名DLL'System.Data.SQLite.DLL'中的'sqlite3_rekey'。 源= System.Data.SQLite类型名= “” 堆栈跟踪:

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被抓获 消息=打开的文件 不是一个数据库文件的文件被加密或不是数据库
源= System.Data.SQLite错误码= -2147467259 堆栈跟踪: 在System.Data.SQLite.SQLite3.Prepare(SQLiteConnection CNN,字符串STRSQL,SQLiteStatement以前,

UInt32 timeoutMS,字符串& 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) 在System.Data.SQLite.SQLiteCommand.ExecuteReader(的CommandBehavior 行为) 在System.Data.SQLite.SQLiteCommand.ExecuteNonQuery() 在System.Data.SQLite.SQLiteConnection.Open () 在SQLiteTest.Database.GetAllLanguages()在C:\ SQLiteTest \ Database.cs:线216

其次,如果我的广告d密码参数到连接字符串,我得到像上面那样的System.EntryPointNotFoundException。

那么,有没有人知道在AnyCPU平台上的C#应用​​程序中使用加密SQLite数据库的确定方法?

在此先感谢!

+0

只是好奇你有2个独立的设置/位置的终端安装在.config文件..?或者你是通过代码操纵这个? – MethodMan 2011-12-16 14:36:52

回答

2

下面的解决方案有点脏,但它可能工作,我们没有使用加密的数据库,所以我不是100%,如果这将适用于你。 我们为x64和x86下载了两个版本的sqlite dll,并将它们放在不同的文件夹中。我们加载它们依赖于手动什么平台上的应用程序正在运行(我们检查IntPtr.Size,从.NET 4中有叫Is64BitOperatingSystem环境类的属性),当我们与

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

加载的程序集手动,我们得到连接实例我们不会在我们的项目中使用任何版本的sqlite。