Можно ли избежать исключения NullReferenceException в SqliteConnection.Open () в sqlite3_open_v2 (...) без явного вызова SQLitePCL.Batteries.Init()?

Проблема

Я получаю исключение NullReferenceException при вызове SQLitePCL.raw.sqlite3_open_v2(String filename, sqlite3& db, Int32 flags, String vfs) с использованием следующего шаблона:

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. v3.1.8 из Microsoft.Data.Sqlite.dll
  2. Версия 2.0.4 SQLitePCLRaw.batteries_v2.dll
  3. Версия 2.0.4 из SQLitePCLRaw.core.dll
  4. Версия 2.0.4 из SQLitePCLRaw.nativelibrary.dll
  5. Версия 2.0.4 из SQLitePCLRaw.provider.dynamic_cdecl.dll

Судя по моим исследованиям по этой проблеме, похоже, что намерение подключаемого модуля SQLitePCL состоит в том, чтобы иметь возможность "выполнять загрузку" без прямого вызова SQLitePCL.Batteries.Init().

С другой стороны, решением может быть просто прямой вызов Init().

Расследования

  • Страница Github здесь для SQLitePCL.raw делает состояние в разделе "Связки", что вызов Init() необходимо.
  • Но есть проблема GitHub здесь, который обращается с подобной проблемой. Он предполагает, что решение заключается в добавлении ссылки на пакет на Microsoft.EntityFrameworkCore.Sqlite.
  • Моя проблема в том, что я использую не EFCore, а ADO.NET из.NET Framework 4.8.
  • Существует дискуссия здесь с автором SQLitePCL.raw улучшить сообщение об ошибке, чтобы показать "Вам нужно позвонить SQLitePCL.raw.SetProvider(). Если вы используете комплектацию, это делается путем вызова SQLitePCL.Batteries. В этом()."

0 ответов

Другие вопросы по тегам