System.Data.SQLite.Core 无法使用 "Password" 连接字符串 属性

System.Data.SQLite.Core Cannot use "Password" connection string property

我正在编写一个 .NET Core 3.1 应用程序,它依赖于另一个试图将日志数据存储到 SQLite 数据库的库 (Serilog.Sinks.SQLite)。不幸的是,Serilog.Sinks.SQLite 不支持通过 SQLiteConnectionStringBuilder.Password [=77] 向 System.Data.SQLite 传递密码=](你提供给 SQLiteConnection 构造函数),我真的很喜欢这个功能。

Serilog.Sinks.SQLite连接数据库的代码如下:

private SQLiteConnection GetSqLiteConnection()
{
    var sqlConString = new SQLiteConnectionStringBuilder
    {
        DataSource = _databasePath,
        JournalMode = SQLiteJournalModeEnum.Memory,
        SyncMode = SynchronizationModes.Normal,
        CacheSize = 500,
        PageSize = (int)MaxSupportedPageSize,
        MaxPageCount = (int)(_maxDatabaseSize * BytesPerMb / MaxSupportedPageSize)
    }.ConnectionString;

    var sqLiteConnection = new SQLiteConnection(sqlConString);
    sqLiteConnection.Open();

    return sqLiteConnection;
}

Whosebug 上有许多类似的 posts 关于使用 SQLite 进行加密非常有说服力地说明 System.Data.SQLite[= 确实支持数据库的加密/密码保护57=]。但是,这与我的经验不符。

我抓取了 Serilog.Sinks.SQLite source 的副本,试图对其进行修改以支持指定密码。这似乎很容易通过对上述代码添加以下内容(在连接字符串中指定密码 属性)来完成:

        MaxPageCount = (int)(_maxDatabaseSize * BytesPerMb / MaxSupportedPageSize),
        Password = "mypasswordhere"
    }.ConnectionString;

不幸的是,这不起作用并导致在启动时抛出异常并显示以下消息:

Exception has occurred: CLR/System.Data.SQLite.SQLiteException An unhandled exception of type 'System.Data.SQLite.SQLiteException' occurred in LoggingWebApi.dll: 'SQL logic error Cannot use "Password" connection string property: library was not built with encryption support, please see "https://www.sqlite.org/see" for more information'

这里最让我困惑的是我发现的其他 post 的数量声称 System.Data.SQLite 支持此密码 事实上,我公司另一个团队的 .NET Framework 4.6 应用程序正在使用 System.Data.SQLite.dll(虽然是旧版本 1.0.111.0)并且这种密码行为对他们来说很好。

我的代码以 netcoreap3.1 为目标,而我对 Serilog.Sinks.SQLite 的依赖以 netstandard2.0 为目标,所以这是我看到的一个明显区别。在我修改后的 Serilog.Sinks.SQLite 代码版本中,我引用 System.Data.SQLite.Core 如下(通过 otnet add package System.Data.SQLite.Core --version 1.0.113.1 添加):

<PackageReference Include="System.Data.SQLite.Core" Version="1.0.113.1" />

.NET Core 3.1 或 .NET Standard 2.0 是否有什么导致 System.Data.SQLite.Core 不支持密码连接字符串 属性 就像其他人似乎认为它支持的那样?

我想我的问题可能是 Linux 上的 运行 所以我尝试 Windows 上的 运行 但它产生了同样的错误。

我确实找到了另一个 post 引用了一个可能有用的方法,但是这个示例没有使用 System.Data.SQLite.Core 而是使用 SQLitePCLRaw.bundle_e_sqlcipher 我宁愿避免重写所有 Serilog.Sinks.SQLite 使用不同 SQLite 客户端的代码:https://github.com/paragpkulkarni/SQLiteEncryptionUsingEFCore

从版本 1.0.113.1 开始,System.Data.SQLite 似乎已经放弃了对加密的支持,这解释了为什么我无法让它工作: https://system.data.sqlite.org/index.html/tktview?name=9c330a3e03

他们的新闻页面上也提到了这一点,尽管我不清楚密码支持是“旧版 CryptoAPI 编解码器”的一部分: https://system.data.sqlite.org/index.html/doc/trunk/www/news.wiki

我提到的另一个团队使用的是旧版本 1.0.111.0,所以如果您需要此支持,我想只是不要升级...