【问题标题】:DataReader.GetFieldType returned nullDataReader.GetFieldType 返回 null
【发布时间】:2011-09-28 00:24:50
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server datareader


    【解决方案1】:

    从项目中引用 Microsoft.SQLServer.Types dll,并在引用的属性中将其设置为“复制本地”。这将在您部署它时将该 DLL 与网站打包在一起。然后你不需要在你的网络盒子上安装所有的 SQL Server 来使用 SQL Server 数据类型。我为我的网站这样做是因为它使用了 geography 数据类型列,并且我遇到了同样的错误。

    【讨论】:

    • 谢谢。这与我所做的相同:我已经将 SQL Server 中的库 Microsoft.SQLServer.Types.dll 添加到我的解决方案的参考部分。
    • 未来的搜索者 - Nuget 中的 Microsoft.SQLServer.Types 是 v11,将无法使用。有关 DLL 路径,请参阅 OP 的帖子;如下所示手动将其添加到您的项目中;然后你可以GetFieldType,它会返回Microsoft.SqlServer.Types.SqlHierarchyId
    • 这是解决问题的“正确”方式吗? sql server 有新的数据类型,然后我必须使用“复制本地”?
    【解决方案2】:

    与其更改您的项目并添加对Microsoft.SQLServer.Types dll 的引用,不如将其放入 GAC。

    就我而言,我的开发机器上有三个版本,并将它们添加到服务器 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 程序集放在那里是可以的,因为它们会影响多个应用程序。

    【讨论】:

      【解决方案3】:

      对我有用的解决方案是将“Type System Version=SQL Server 2012”添加到连接字符串。

      示例: string connectionString = "Data Source=myserver;Initial Catalog=mydatabase;User ID=sa;Password=*******;Type System Version=SQL Server 2012;";

      【讨论】:

      • 拯救了我的一天!谢谢!将旧应用程序迁移到使用较新 sql 服务器的较新服务器后出现此问题。将此添加到连接字符串将使其回退到这些较旧的 sql 服务器类型。 (您可以通过 Microsoft 的 Web 平台安装程序下载)。
      • 这是一个非常好的答案!我正在使用 SqlConnectionStringBuilder 并将 Property TypeSystemVersion 设置为“SQL Server 2012”——我能够检索 AdventureWorks2017 的表架构信息,以及我包含的另一个数据库——试图在一个架构中包含两个数据库,这删除了我的最后一个拦截器。我赞成您的答案,因为它似乎是对这个问题的干扰最小且最正确的答案。谢谢!
      • 不知道为什么,但这也拯救了我的一天!
      【解决方案4】:

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

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

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

      或/并添加“键入系统版本=SQL Server 2012;”在 sql 连接字符串中

      【讨论】:

        【解决方案5】:

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

        <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>
        

        【讨论】:

        • Yahtzee!!!干得好@bgh,我在那个问题上摸不着头脑。
        【解决方案6】:

        对于那些在使用 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 位置 (24) 该字段在安装了 SQL Server 2016 的 AppVeyor 中运行良好,但无法在我的本地环境中运行。

        我发现几篇文章解释了为什么会发生这种情况,有些文章指定使用 NuGetfetch the latest Microsoft.SqlServer.Types.dll,但在我的情况下,这没有帮助,也没有任何尝试用来自 @ 的文章替换 assembly\GAC_... 版本987654332@和朋友们。

        注意:安装.msi 并不像人们想象的那么简单,因为通过反复试验,我安装了几个较旧的“Microsoft SQL Server System CLR Types”。这导致 MSI 仅提供“修复”和“删除”。如果发生这种情况,请选择“删除”并再次运行安装程序。

        Installing the correct version and restarting PowerShell 成功了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多