.NET 连 SQL Server 的同学注意了,Microsoft.Data.SqlClient 6.1.5 发布了,虽然只是 6.1 系列的服务更新,但其中一个 Bug 修复值得你认真看看——它可能正在悄悄吞噬你代码中的错误。
最重要的修复:ExecuteScalar 不再隐藏服务器错误
这个 Bug 描述起来有点绕,但影响很实在。
当 SQL Server 返回行数据后紧接着返回一个错误 token 时(比如 WHERE 子句求值期间的类型转换失败),ExecuteScalar 之前会把这个错误静默吞掉——SqlDataReader.Close() 直接消费掉了错误,调用方完全无感知。
后果是什么?你的事务可能变成僵尸事务(zombied transaction)——你以为一切正常,实际上连接已经处于异常状态,后续操作可能产生不可预知的结果。
6.1.5 修复后,这些错误会被正确抛出到你的应用代码中。如果你之前的代码「一直没报错但结果不对」,升级后可能会开始收到异常——这不是 Bug,而是帮你暴露了以前被隐藏的问题。
国内很多金融、电商系统大量使用 ExecuteScalar 做单值查询(比如查余额、查库存),如果遇到了莫名其妙的脏数据问题,这次升级后排查一下说不定能找到根因。
连接速度优化:不再做无用的 DNS 查找
Windows 平台上的 .NET 应用在用原生 SNI 路径连接 SQL Server 时,即使你用的是 SQL 认证(不是 Windows 集成认证),驱动也会去执行 SPN(Service Principal Name)生成逻辑——这会触发不必要的 DNS 查找,拖慢连接打开速度。
6.1.5 修复了这个回归缺陷,恢复了预期行为:非集成认证场景不再做 SPN 查找。
如果你的应用在高频创建短连接(比如 Serverless 场景、Lambda 函数),这个修复对连接延迟会有可感知的改善。
vector float32 元数据修正
SQL Server 2022 引入了 vector 类型支持后,越来越多的 AI 向量搜索场景开始用 SqlClient 读取 vector 列。但之前 GetFieldType() 和 GetProviderSpecificFieldType() 返回的类型不正确,和 GetValue() 的行为不一致。
6.1.5 统一了这些 API 的返回类型为 SqlVector<float>,如果你在做 RAG、语义搜索等 AI 应用开发,升级后类型判断逻辑会更可靠。
升级方式
dotnet add package Microsoft.Data.SqlClient --version 6.1.5
⚠️ 注意:ExecuteScalar 错误传播修复属于行为变更。如果你的代码里 catch 块一直为空,升级后可能需要补上异常处理逻辑。
还在用老版 System.Data.SqlClient 的同学,建议尽快迁移到 Microsoft.Data.SqlClient。迁移指南:https://github.com/dotnet/SqlClient/blob/main/porting-cheat-sheet.md
📎 原文链接:https://techcommunity.microsoft.com/t5/sql-server-blog/announcing-microsoft-data-sqlclient-6-1-5/ba-p/4516480 📅 发布日期:2026-05-01


