哪个版本的Microsoft.SqlServer.Types.dll治愈" DataReader.GetFieldType返回null" SQL Server 2017的错误?

时间:2018-02-18 16:42:46

标签: c# sql-server exception

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

我已经尝试了SO问题[{3}}中描述的前2个答案中的修复,但它们对我没有用处:

  1. 我尝试了我机器上可用的dll副本(即添加了一个参考号并将其设为hierarchyId):

    • 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下没有Microsoft.SqlServer.Types.dll的副本(因此,我假设我的机器上没有64位版本的dll。)

  2. 使用C:\Program Files\Microsoft SQL Server修改连接字符串

  3. 我知道我的sql连接和"Type System Version=SQL Server 2012"命令有效,因为当我从"Fill"表中读取没有AdventureWorks2016hierarchyId的表时,它可以正常工作,或geography字段。

    geometry

    您知道哪个版本的sqlConnection.Open(); sqlCommand.CommandType = CommandType.Text; sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = primaryKeyQueryString; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand); sqlDataAdapter.Fill(dt); sqlDataAdapter.Dispose(); sqlConnection.Close(); 可以解决SQL Server 2017的问题吗?

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

    我是否需要安装较旧的SQL Server dll并使用我的应用程序进行分发?

2 个答案:

答案 0 :(得分:0)

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

  1. 2009.100.2500.0,(6-17-2011)正常工作
  2. 2014.120.2000.8(2/21/2014)失败
  3. 2014.120.5000.0,(6-18-2016)失败
  4. 2011.110.2832.25,(8-15-2017)失败
  5. 2017.140.1000.169,(8-22-2017)失败
  6. 2017.140.500.272,(2-1-2018)失败

答案 1 :(得分:0)

这是我所做的:

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

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

在Windows Server 2019上带有SQL Server 2017的服务器上,只能通过安装Microsoft.SqlServer.Types版本11.0.2来使此工作正常进行。最新版本无法解决问题。

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

经过一段时间的研究,如果问题仍然存在,我建议尝试其他版本,因为这可以解决此问题。

还要确认您的SQL Server安装是否已安装SQL Server 2017的Microsoft系统CLR类型。如果没有,则必须从Microsoft SQL Server 2017 Feature Pack或SQL Server安装程序安装它们 https://www.microsoft.com/en-us/download/details.aspx?id=55992

这些步骤适用于所有版本的SQL Server。如果任何人遇到任何问题,都不要浪费时间以为这是缺少dll问题的服务器,请尝试使用Nugget提供的其他版本的Microsoft.SqlServer.Types,因为较早或更新的版本都可以使用。