提问人:Mo B. 提问时间:8/30/2022 最后编辑:Mo B. 更新时间:6/27/2023 访问量:519
检查 SQL 连接字符串是否指定参数
Checking if SQL Connection String specifies a parameter
问:
我正在寻找一种强大的方法来检查给定的 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 :(
澄清
我应该澄清为什么我需要知道参数是否被显式指定。在当前版本的 中,默认值是 ,但在 (in ) 之前是 。因此,为了确保升级到 后应用程序中的向后兼容性,我想将参数设置为 除非用户明确为其指定了值。Encrypt
Microsoft.Data.SqlClient
Encrypt
true
Sql.Data.SqlClient
false
Microsoft.Data.SqlClient
Encrypt
false
溶液
[基于与@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;
答:
ContainsKey
基本上是无用的,因为它只告诉你一个键是否受支持,而不是字符串是否实际包含它。如果字符串没有该键,则使用默认值。
您可以使用该属性来告诉您值是什么。如果默认值为 (在新版本的 中已更改为 )。Encrypt
false
false
true
Microsoft.Data.SqlClient
此外,这比仅仅检查字符串是否包含键更有用,因为它告诉您在运行时实际使用什么值。
var x = new SqlConnectionStringBuilder("Data Source=.;Initial Catalog=myDb;Integrated Security=True");
Console.WriteLine(x.ContainsKey("Encrypt"));
评论
Encrypt
false
Encrypt
SqlConnectionStringBuilder
false
Encrypt
Microsoft.Data.SqlClient
true
True
Microsoft.Data.SqlConnectionStringBuilder
System.Data.SqlConnectionStringBuilder
出于同样的原因,我遇到了同样的问题。我们在小型内部网络上安装了大量 SQL Server,因此我们更希望保留旧的默认行为 .仅仅因为 Microsoft 更改了默认值,就不值得在所有这些机器上麻烦证书。在极少数情况下,我们有云托管的数据库,我们将在服务器上显式配置证书并设置 Encrypt=true。Encrypt=false
我不想继续使用旧类型(如问题的解决方案所建议的那样),因为我的 Directory.Packages.props 文件不再允许引用 System.Data.SqlClient 包。System.Data.SqlClient.SqlConnectionStringBuilder
我的解决方法使用一个简单的正则表达式:
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();
评论
=
Encrypt
评论
false