DataReader.GetFieldType返回null

时间:2011-07-04 09:33:55

标签: sql sql-server datareader

在我的数据库表格布局中,有一列其类型为hierarchyid(列索引= 4)。 在尝试设置新环境(从XEN服务器创建的虚拟Web服务器),然后运行该站点时,我遇到了这个问题:

  

异常消息:DataReader.GetFieldType(4)返回null。   异常数据:System.Collections.ListDictionaryInternal

我做了一些搜索,发现已经有一些主题(例如在MSDN上)。

但即使我添加了C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll库,似乎结构SqlHierarchyId中的db类型也无法识别。

  

“DataReader.GetFieldType(4)返回null的异常”仍然被抛出。

注意:如果我将VS2010中的C#软件包安装到环境(Windows Server 2008 RC2)上,问题将得到解决,但我的老板不接受这一点,因为这纯粹是一个简单的Web服务器。

6 个答案:

答案 0 :(得分:20)

从项目中引用Microsoft.SQLServer.Types dll,并在引用的属性中将其设置为“Copy Local”。这将在部署时将该DLL与网站打包在一起。然后,您不需要在Web框上安装所有SQL Server,以便使用SQL Server数据类型。我为我的网站做了这个,因为它使用了geography数据类型列,我得到了同样的错误。

答案 1 :(得分:7)

对我有用的解决方案是在连接字符串中添加“类型系统版本= SQL Server 2012 ”。

实施例: string connectionString =“Data Source = myserver; Initial Catalog = mydatabase; User ID = sa; Password = *******; Type System Version = SQL Server 2012; ”;

答案 2 :(得分:6)

我尝试通过将 Microsoft.SqlServer.Types NuGet包添加到我的项目来解决此问题,但仅此一点没有帮助。我还必须将以下内容添加到项目的App.config的<assemblyBinding>元素中:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  .
  .
  .
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
    </dependentAssembly>
  .
  .
  .
  </assemblyBinding>
</runtime>

答案 3 :(得分:1)

您可以将其添加到GAC中,而不是更改项目并添加对Microsoft.SQLServer.Types dll的引用。

在我的情况下,我在我的开发机器上有三个版本并将它们添加到服务器GAC:

 gacutil.exe -i .\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll
 gacutil.exe -i .\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll
 gacutil.exe -i .\12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll

我在服务器上有其他与SQL相关的第三方.NET工具,它们具有相同的错误。将程序集添加到GAC后,它们都运行良好。

虽然我没有将自己的程序集放入GAC,但我认为将一些Microsoft SQL-Server程序集放在那里是可以的,因为它们会影响多个应用程序。

答案 4 :(得分:0)

其他解决方案如果仍有错误,请尝试在web.config中删除

<add assembly="Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>

将文件Microsoft.SqlServer.Types.dll复制到bin文件夹(或/和添加引用)

或/并添加&#34;类型系统版本= SQL Server 2012;&#34;在sqlconnectionstring

答案 5 :(得分:0)

对于那些使用PowerShell遇到此问题的人,我能够通过安装SQLSysClrTypes.msi package from Microsoft for SQL Server 2016并重新启动Powershell来解决问题。下载页面难以导航,单击“下载”并在页面上搜索SQLSysClrTypes。选择正确的架构。

Exception calling "Fill" with "1" argument(s): "DataReader.GetFieldType(24) 
returned null."
At MyScript.ps1:15 char:5
+     $adapter.Fill($ds) | Out-Null
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], 
ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidOperationException

在我的情况下,有问题的数据类型位于Microsoft.SqlServer.Types.SqlGeography的{​​{1}}位置,此字段在安装了SQL Server 2016的AppVeyor内正常工作,但无法在我的本地环境上运行。

我找到了几篇文章来解释为什么会发生这种情况,并且有一些文章指定使用(24)fetch the latest Microsoft.SqlServer.Types.dll,但是对于我来说,这没有帮助,也没有尝试替换{{1} }版本,其中有NuGet和一位朋友。

注意:安装assembly\GAC_...并不像预期的那样简单,因为经过反复试验,我安装了几种较旧的“ Microsoft SQL Server系统CLR类型”。这导致MSI仅提供“修复”和“删除”。如果发生这种情况,请选择“删除”,然后再次运行安装程序。

Installing the correct version and restarting PowerShell做到了。