检查 SQL 连接字符串是否指定参数

Mo *_* B. 5 c# connection-string system.data.sqlclient

我正在寻找一种可靠的方法来检查 C# 中给定的 SQL 连接字符串是否显式指定了某个参数,例如“ Encrypt=...”。我尝试使用 解析字符串SqlConnectionStringBuilder,期望它能ContainsKey()告诉我是否指定了某个键,但它不起作用:

System.Data.SqlClient.SqlConnectionStringBuilder x = 
    new("Data Source=.;Initial Catalog=myDb;Integrated Security=True");

bool encryptSpecified = x.ContainsKey("Encrypt"); // returns true :(
Run Code Online (Sandbox Code Playgroud)

澄清

我应该澄清为什么我需要知道Encrypt参数是否被显式指定。在 的当前版本中,的Microsoft.Data.SqlClient默认值为,但之前(中)为。因此,为了确保升级到后应用程序的向后兼容性,我想将参数设置为,除非用户明确指定了它的值EncrypttrueSql.Data.SqlClientfalseMicrosoft.Data.SqlClientEncryptfalse

解决方案

[基于与@Charlieface的讨论]

// important: *not* Microsoft.Data.SqlClient.SqlConnectionStringBuilder!
System.Data.SqlClient.SqlConnectionStringBuilder scsb = 
    new(connectionString); 
if (!scsb.Encrypted) scsb.Encrypted = false; // this will explicitly set Encrypt
connectionString = scsb.ConnectionString;
Run Code Online (Sandbox Code Playgroud)

Bil*_*ees 1

我出于同样的原因遇到了同样的问题。我们在小型内部网络上安装了大量 SQL Server,因此我们更倾向于保留Encrypt=false. 仅仅因为 Microsoft 更改了默认值,就不值得在所有这些计算机上产生证书麻烦。在极少数情况下,我们拥有云托管数据库,我们将在服务器上显式配置证书并设置 Encrypt=true。

我不想继续使用旧System.Data.SqlClient.SqlConnectionStringBuilder类型(正如问题的解决方案所建议的那样),因为我的 Directory.Packages.props 文件不再允许引用 System.Data.SqlClient 包。

我的解决方法使用一个简单的正则表达式:

using Microsoft.Data.SqlClient;
...

SqlConnectionStringBuilder builder = new(connectionString);
Regex containsEncrypt = CreateContainsEncryptRegex();
if (!containsEncrypt.IsMatch(connectionString))
{
    builder.Encrypt = false;
}
connectionString = builder.ConnectionString;

...
[GeneratedRegex(@"(?i)(^|;)\s*Encrypt\s*=", RegexOptions.Compiled)]
private static partial Regex CreateContainsEncryptRegex();
Run Code Online (Sandbox Code Playgroud)