哪个版本的Microsoft.SqlServer.Types.dll可修复SQL Server 2017的DataReader.GetFieldType返回空值问题?
我之前也碰到过一模一样的问题!在处理SQL Server的hierarchyId类型时,这个DataReader.GetFieldType returned null异常确实挺头疼的,尤其是用VS2017这种稍早的开发环境时。针对你这个场景,我整理了几个针对性的解决方案,比通用的DataReader异常处理更有效:
针对性解决方案(针对hierarchyId字段)
1. 用专用方法读取hierarchyId类型
别用常规的GetFieldValue<T>或直接索引读取,SQL Server提供了专门的GetSqlHierarchyId方法来处理这个类型,能直接绕过类型识别的问题:
using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { conn.Open(); string query = "SELECT OrganizationNode, BusinessEntityID FROM HumanResources.Employee"; using (SqlCommand cmd = new SqlCommand(query, conn)) { using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // 用专用方法读取hierarchyId字段 int ordinal = reader.GetOrdinal("OrganizationNode"); SqlHierarchyId orgNode = reader.GetSqlHierarchyId(ordinal); // 读取其他常规字段 int empId = reader.GetInt32(reader.GetOrdinal("BusinessEntityID")); // 后续业务逻辑处理 } } } }
注意:要先在项目里安装Microsoft.SqlServer.Types NuGet包,这个包包含了SqlHierarchyId的类型定义。
2. 更新数据访问组件版本
VS2017默认自带的System.Data.SqlClient版本偏旧,对hierarchyId的支持不完善。你可以:
- 卸载项目中旧的
System.Data.SqlClient引用,安装微软现在主推的Microsoft.Data.SqlClientNuGet包,它对特殊类型的支持更全面 - 如果坚持用
System.Data.SqlClient,也要更新到兼容.NET Framework 4.x的最新版本
3. 确认项目目标框架版本
如果你的项目基于.NET Framework,一定要把目标框架改成4.6.1或更高版本——从这个版本开始,.NET对SQL ServerhierarchyId的集成支持才足够稳定。你可以在项目属性的「应用程序」选项卡中修改。
4. 匹配SQL Server客户端工具版本
确保你开发机器上的SQL Server客户端工具(比如SQL Server Native Client)和你使用的SQL Server 2017版本一致,版本不匹配也会导致类型识别异常。可以在「控制面板-程序和功能」里查看并更新。
另外提一句:你之前尝试的通用DataReader异常解决方案(比如检查字段是否存在、处理NULL值)对hierarchyId这种特殊类型不太适用,问题根源是类型映射未被正确识别,不是字段本身的问题。
内容的提问来源于stack exchange,提问作者user2414250

