哪个版本的 Microsoft.SqlServer.Types.dll 解决了 SQL Server 2017 的“DataReader.GetFieldType 返回 null”错误?

Posted

技术标签:

【中文标题】哪个版本的 Microsoft.SqlServer.Types.dll 解决了 SQL Server 2017 的“DataReader.GetFieldType 返回 null”错误?【英文标题】:Which version of Microsoft.SqlServer.Types.dll cures "DataReader.GetFieldType returned null" bug for SQL Server 2017? 【发布时间】:2018-02-18 16:42:46 【问题描述】:

我正在运行 Windows 10、VS 2017 和 SQL Server 2017(版本 14.0.1000.169,开发人员版(64 位))的 x64 开发盒上开发 C# 应用程序。我正在使用 AdventureWorks2016 数据库测试我的应用程序。读取[HumanResources].[Employee] 记录会为数据类型为hierarchyIdOrganizationNode 字段抛出有据可查的"DataReader.GetFieldType returned null" 异常。

我已经尝试了 SO 问题 DataReader.GetFieldType returned null 中描述的前 2 个答案中的修复,但它们对我不起作用:

    我尝试了我机器上可用的 dll 副本(即,向 dll 添加了一个引用并使其成为local copy = true):

    C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin

    C:\Program Files (x86)\Microsoft SQL Server\140\SDK\Assemblies

    C:\Program Files\Microsoft SQL Server 下没有 Microsoft.SqlServer.Types.dll 的副本(因此,我假设我的机器上没有 64 位版本的 dll)。

    "Type System Version=SQL Server 2012"修改连接字符串也不起作用

我知道我的 sql 连接和 "Fill" 命令可以正常工作,因为当我从没有 hierarchyIdgeographygeometry 字段的 AdventureWorks2016 表中读取记录时,它可以正常工作。

sqlConnection.Open();
sqlCommand.CommandType = CommandType.Text;
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = primaryKeyQueryString;

SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
sqlDataAdapter.Fill(dt);

sqlDataAdapter.Dispose();
sqlConnection.Close();

您知道哪个版本的Microsoft.SqlServer.Types.dll 可以解决我的 SQL Server 2017 问题吗?

如果是这样,我在哪里可以得到它的副本?

我是否需要安装较旧的 SQL Server dll 并将其与我的应用程序一起分发?

【问题讨论】:

【参考方案1】:

这是我所做的:

我从 nugget 安装了 Microsoft.SqlServer.Types,您应该在 bin 文件夹中有一个名为 SqlServerTypes\x64 和 x86 的文件夹,该文件夹也应该与您的应用程序一起部署,在 bin 文件夹中的 Microsoft.SqlServer.Types.dll 旁边

从 nugget 安装时,您的代码中还有一个名为 SQLServerTypes\Loader.cs 的新文件夹(如果使用 VB,则将其转换为 VB),该文件夹加载一些低级依赖项(msvcr1x0.dll 和 SqlServerSpatial1x0.dll)。

在我的 Windows Server 2019 上装有 SQL Server 2017 的服务器上,我只能通过安装 Microsoft.SqlServer.Types 版本 11.0.2 来完成这项工作。最近的版本没有解决这个问题。

当我引用这些版本时,GetFieldType 识别出空间类型并且一切运行顺利。

在研究了这个问题一段时间后,如果问题仍然存在,我建议尝试其他版本,因为这就是解决这个问题的方法。

同时确认您的 SQL Server 安装已安装 Microsoft System CLR Types for SQL Server 2017。如果没有,您必须从 Microsoft SQL Server 2017 功能包或 SQL Server 安装程序安装它们 https://www.microsoft.com/en-us/download/details.aspx?id=55992

这些步骤适用于所有版本的 SQL Server。如果有人遇到任何问题,请不要浪费时间认为这是服务器缺少 dll 的问题,只需尝试来自 Nugget 的不同版本的 Microsoft.SqlServer.Types,因为旧版本或新版本都可以工作。

【讨论】:

【参考方案2】:

我发现我的 Win 10 机器上没有带有 Microsoft.SqlServer.Types.dll 版本的 Win 7 机器。我使用显式引用依次从我的 Win 10 机器和 Win 7 机器测试了每个 DLL。结果如下:

    2009.100.2500.0, (6-17-2011) 作品 2014.120.2000.8 (2/21/2014) 失败 2014.120.5000.0, (6-18-2016) 失败 2011.110.2832.25, (8-15-2017) 失败 2017.140.1000.169, (8-22-2017) 失败 2017.140.500.272, (2-1-2018) 失败

【讨论】:

以上是关于哪个版本的 Microsoft.SqlServer.Types.dll 解决了 SQL Server 2017 的“DataReader.GetFieldType 返回 null”错误?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 无效版本:15 (Microsoft.SqlServer.Smo)

为啥安装 .NET Framework 4.51 会导致针对框架版本 4 的应用程序中出现“Microsoft.SqlServer.Types 错误”

索引超出了数组界限(Microsoft.SqlServer.Smo)

未能加载文件或程序集“Microsoft.SqlServer.Types, Version=12.0.0.0,

GAC 中的 Microsoft.SqlServer.Types.SqlGeography DLL

sqlserver2005 删除 对于 用户“**” (Microsoft.SqlServer.Smo)