我在我的应用程序中使用SQLite作为数据库引擎,但同时应用程序必须是跨平台的,所以我决定使用Mono.Data.Sqlite。这就是我所做的:
安装了最新版本的Mono(4.0.2 SR 2),将Mono.Data.Sqlite.dll从Mono的目录(net4_5)复制到我在Visual Studio 2015中的项目
< / LI>下载并复制预编译的sqlite3.dll库。
然后我写了一个简单的应用程序:
const string databaseFileName = "somedata.db";
var path = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + databaseFileName;
if (!File.Exists(path)) SqliteConnection.CreateFile(databaseFileName);
var connString = string.Format("Data Source=file:{0}", databaseFileName);
using (var conn = new SqliteConnection(connString))
{
conn.Open();
/* Some code */
conn.ChangePassword("testpassword");
conn.Close();
}
但我面临一些问题:
首先,当我在连接字符串中使用数据源=文件:{0} 时,它会抛出异常:&#34;不支持URI格式&#34 ;。将其替换为 URI =文件:{0} 有帮助,但为什么第一个选项不起作用?
其次,当我调用 conn.ChangePassword(&#34; testpassword&#34;)时会抛出异常:System.EntryPointNotFoundException:无法找到名为&#34的入口点; sqlite3_rekey&#34;在DLL&#34; sqlite3&#34;
第三,对已加密的数据库使用 URI = file:{0}; Password = testpassword 会引发异常:System.EntryPointNotFoundException:无法找到名为&#34的入口点; sqlite3_key&#34;在DLL&#34; sqlite3&#34;
实际上并没有使用SQLite的官方包装器,但是Mono会发生。
P.S。当我不使用加密和数据源=文件:{0} 而不是 URI =文件:{0} <时,Mono的包装工作正常/ p>
P.S.S。 Windows 10,Visual Studio 2015 +最新版Mono和SQLite
答案 0 :(得分:0)
对于第一个问题,将URI转换为本地文件路径; file://
。 Sqlite不使用file:
或bindump /EXPORTS
并使用C#帮助程序代码剥离,请参阅&#34; Mono.Data.Sqlite_2.0 / SQLiteConnection.cs&#34;中的代码。
对于第二/第三个问题:
您拥有的sqlite3本机库似乎与Mono的dll import语句不匹配,您可以使用#if !PLATFORM_COMPACTFRAMEWORK
[DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
#else
[DllImport(SQLITE_DLL)]
#endif
internal static extern int sqlite3_key(IntPtr db, byte[] key, int keylen);
进行确认。 Mono DllImports和匹配的SQLite .h导出如下:
注意:这当然假设您拥有本机dll的正确ARCH,并且您没有在Windows中编译Uni-app。
Grep&#39; Mono.Data.Sqlite_2.0 / UnsafeNativeMethods.cs&#34;
的来源其次,当我调用conn.ChangePassword(&#34; testpassword&#34;)时,它会抛出一个 exception:System.EntryPointNotFoundException:无法找到条目 点名为&#34; sqlite3_rekey&#34;在DLL&#34; sqlite3&#34;
#if !PLATFORM_COMPACTFRAMEWORK
[DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
#else
[DllImport(SQLITE_DLL)]
#endif
internal static extern int sqlite3_rekey(IntPtr db, byte[] key, int keylen);
第三,使用URI = file:{0}; Password = testpassword已经使用了 加密数据库抛出异常: System.EntryPointNotFoundException:无法找到入口点 命名为&#34; sqlite3_key&#34;在DLL&#34; sqlite3&#34;
...
SQLITE_API int SQLITE_STDCALL sqlite3_rekey
...
SQLITE_API int SQLITE_STDCALL sqlite3_key
...
匹配的sqlite.h定义:
{{1}}