.NET中SqlConnection设置空连接字符串触发NullReferenceException异常
嘿,这个问题我之前也碰到过,本质是.NET Framework 4.7.2(对应版本号461808)里对SqlConnection.ConnectionString属性的验证逻辑做了变更,才导致旧代码突然崩溃的。
问题根源
在更早的.NET版本里,把SqlConnection.ConnectionString设为空字符串或者null,只会在你后续尝试打开连接的时候才抛出异常;但到了4.7.2配合Win10 1803这个环境,刚设置属性的瞬间就会触发严格的验证,直接抛出未处理异常,完全没等到你执行打开连接的操作。
复现代码确认
你贴的这段代码确实能稳定复现问题:
static void Main() { var c = new System.Data.SqlClient.SqlConnection(); c.ConnectionString = "Data Source=SOME_NAME;Initial Catalog=SOME_DB;Integrated Security=True"; c.ConnectionString = ""; // 设为null也会触发异常 Console.WriteLine("Success"); }
可行的解决方案
给你几个实用的处理方向:
- 优先避免设置空/Null值:如果业务上需要重置连接字符串,要么保留原来的有效配置,要么在赋值前先做判断:
string newConnStr = ""; // 你的目标连接字符串 if (!string.IsNullOrEmpty(newConnStr)) { c.ConnectionString = newConnStr; } - 主动捕获异常:如果必须要设置空值,那就把赋值操作包在try-catch里,提前处理验证失败的情况:
try { c.ConnectionString = ""; } catch (ArgumentException ex) { // 这里可以加日志,或者把连接字符串重置回有效配置 c.ConnectionString = "Data Source=SOME_NAME;Initial Catalog=SOME_DB;Integrated Security=True"; } - 调整.NET版本:如果环境允许的话,要么降级到4.7.1及以下版本,要么升级到4.8及以上——后续版本里这个验证逻辑做了优化,不会再出现这种无预兆的崩溃。
额外说明
这个属于.NET版本迭代中的兼容性小坑,微软在4.7.2里加强了连接字符串的即时校验,本意是提前发现配置错误,但没想到影响了一批旧代码。如果你的代码要兼容多个.NET版本,最好加个版本判断或者统一的异常处理逻辑。
内容的提问来源于stack exchange,提问作者Pavel K
相关产品推荐
相关产品推荐

