Mono.Data.Sqlite抛出异常

时间:2015-07-30 20:48:39

标签: c# sqlite mono

我在我的应用程序中使用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

1 个答案:

答案 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}}