是否可以在不显式调用SQLitePCL.Batteries.Init的情况下避免sqlite3_open_v2...中SqliteConnection.Open中的NullReferenceException?

问题描述

问题

我在使用以下模式对SQLitePCL.raw.sqlite3_open_v2(String filename,sqlite3&db,Int32标志,String vfs)的调用中得到了NullReferenceException:

public class DBOpenFails
{
    public static void DemoFail()
    {
        using (var connection = new SqliteConnection("something.db"))
        {
            connection.Open(); // Throws NullReferenceException in SQLitePCL.raw.sqlite3_open_v2(...)
        }
    }
}

但使用此模式时不行:

public class DBOpenSucceeds
{
    public static void DemoWorks()
    {
        SQLitePCL.Batteries.Init(); // This solves the exception
        using (var connection = new SqliteConnection("something.db"))
        {
            connection.Open(); //Works
        }
    }
}

有什么办法可以避免打这个电话?

SQLitePCL.Batteries.Init();

我正在使用.NET Framework 4.8,并且bin目录中存在以下dll:

  1. Microsoft.Data.Sqlite.dll的v3.1.8
  2. SQLitePCLRaw.batteries_v2.dll的v2.0.4
  3. SQLitePCLRaw.core.dll v2.0.4
  4. SQLitePCLRaw.nativelibrary.dll v2.0.4
  5. SQLitePCLRaw.provider.dynamic_cdecl.dll v2.0.4

从我对此问题的调查来看,看起来SQLitePCL插件的意图是能够“引导”而不直接调用SQLitePCL.Batteries.Init()。

另一方面,解决方案可能就是直接调用Init()。

调查

  • SQLitePCL.raw的Github页面here确实在“捆绑包”部分声明必须调用Init()。
  • 但是有一个github问题here可以解决类似的问题。它建议解决方法是添加对Microsoft.EntityFrameworkCore.Sqlite的程序包引用
  • 我的问题是我没有使用EFCore,而是使用.NET Framework 4.8中的ADO.NET
  • 与SQLitePCL.raw的作者进行了一次讨论here,以改善错误消息,并显示“您需要调用SQLitePCL.raw.SetProvider()。如果使用捆绑包,则这是通过调用SQLitePCL.Batteries.Init()完成。”

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)