我正在寻找一种可靠的方法来检查 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) 我为.NET8创建了一个空白的webapi项目,安装了两个包Microsoft.Extensions.DependencyModel、Microsoft.Data.SqlClient\n以下是源代码\xef\xbc\x9a\nusing Microsoft.Extensions.DependencyModel; using System.Reflection; using System.Runtime.Loader; var builder = WebApplication.CreateBuilder(args); var list = DependencyContext.Default.RuntimeLibraries.ToList(); var assemblies = list.Select(m =>{ try { return AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(m.Name)); }catch { return null; } }).Where(m => m != null).ToList(); foreach (var assembly in assemblies) {foreach (var type in assembly.GetTypes()) { } } app.Run();
编译后会提示如标题的错误信息。\n.NET6中不存在这种情况。\n将Microsoft.Data.SqlClient改为System.Data.SqlClient时也会出现类似错误\n如何解决?太感谢了。
\n