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,所以如果您需要此支持,我想只是不要升级...
我正在编写一个 .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,所以如果您需要此支持,我想只是不要升级...