问题描述
问题
我在使用以下模式对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:
- Microsoft.Data.Sqlite.dll的v3.1.8
- SQLitePCLRaw.batteries_v2.dll的v2.0.4
- SQLitePCLRaw.core.dll v2.0.4
- SQLitePCLRaw.nativelibrary.dll v2.0.4
- 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 (将#修改为@)