在我的数据库表格布局中,有一列其类型为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服务器。
答案 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做到了。