【问题标题】:System.Data.SQLite.Core Cannot use "Password" connection string propertySystem.Data.SQLite.Core 不能使用“密码”连接字符串属性
【发布时间】:2021-01-30 14:08:18
【问题描述】:

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

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;
}

StackOverflow 上有许多关于使用 SQLite 加密的类似帖子,非常令人信服地指出,System.Data.SQLite 确实支持数据库的加密/密码保护。但是,这与我的经验不符。

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

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

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

发生异常:CLR/System.Data.SQLite.SQLiteException An 'System.Data.SQLite.SQLiteException' 类型的未处理异常 在 LoggingWebApi.dll 中发生:'SQL 逻辑错误无法使用“密码” 连接字符串属性:库不是使用加密构建的 支持,请参阅“https://www.sqlite.org/see”了解更多信息'

这里最让我困惑的是我发现的其他帖子的数量声称 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 不支持 Password 连接字符串属性,就像其他人似乎认为它支持的那样?

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

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

【问题讨论】:

标签: asp.net-core serilog system.data.sqlite


【解决方案1】:

似乎 System.Data.SQLite 从 1.0.113.1 版本开始不再支持加密,这解释了为什么我无法让它工作: 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,所以如果您需要这种支持,我想不要升级...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2010-09-12
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    相关资源
    最近更新 更多