Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理System.InvalidOperationException:DataReader.GetFieldType(13)?(再次)_C#_Asp.net_.net_Sqldbtype - Fatal编程技术网

C# 如何处理System.InvalidOperationException:DataReader.GetFieldType(13)?(再次)

C# 如何处理System.InvalidOperationException:DataReader.GetFieldType(13)?(再次),c#,asp.net,.net,sqldbtype,C#,Asp.net,.net,Sqldbtype,将我的ASP.NET webforms应用程序升级到.NET 4.7.2(和4.8)并将基础数据库服务器更改为SQL server 2017后,我开始出现以下异常: 异常详细信息:System.InvalidOperationException:DataReader.GetFieldType(13)返回null 数据集中第13列的基本数据类型是地理。我已经研究了一些可能的原因,这些都是我尝试过但没有成功的事情 计算机应安装SQL Server实例。我有。在我的开发计算机上,我有SQL Serve

将我的ASP.NET webforms应用程序升级到.NET 4.7.2(和4.8)并将基础数据库服务器更改为SQL server 2017后,我开始出现以下异常:

异常详细信息:System.InvalidOperationException:DataReader.GetFieldType(13)返回null

数据集中第13列的基本数据类型是
地理
。我已经研究了一些可能的原因,这些都是我尝试过但没有成功的事情

  • 计算机应安装SQL Server实例。我有。在我的开发计算机上,我有SQL Server 2017 Express,而“生产”中有SQL Server 2017,用于大男孩。因此,这不是罪魁祸首

  • 建议安装包
    Microsoft.SqlServer.Types
    。我已经安装了版本14.0.1016.290。创建引用时,
    Microsoft.SqlServer.Types.dll
    已复制到bin文件夹中。这并没有解决错误

  • 另一个建议是将此调用放入
    全局.asax

    public class Global_asax : System.Web.HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            ...
            /* For ASP.NET Web Applications, add the following line of code to the Application_Start method in Global.asax.cs: */
            SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
        }
    }
    
  • 作为最后手段,我在
    web.config
    中添加了程序集重定向。我不确定我是否正确使用了publicKeyToken

    <assemblyBinding>
        ...
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.SqlServer.Types" 
                              publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="10.0.0.0" newVersion="14.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
    
    但它没有提供任何线索

    我曾经考虑过,以前的.Net版本中可能有一些旧的残余调用了此方法的不正确版本,但我不知道如何检查这一点。我只是觉得微软不能把他们的东西放在一起很遗憾。我的应用程序的旧版本只是简单地工作

    重要提示:对于所有认为这个问题已经得到回答的人:不是!这是一个长期存在的问题

    更新-其他信息 我以前在开发计算机和生产服务器上的配置是.NET4.0和SQLServer2008。在将数据库升级到SQL Server 2017之后,我只更改了现有应用程序上的连接字符串,并且成功了。实际上,它仍然在生产中使用,因为较新版本的od.NET根本不起作用

    之后,我将我的开发机器升级到.NET4.8,实体框架升级到6.4,并编译了应用程序。结果,地理数据类型被破坏。我采取的所有补救措施都在上面。
    这里怎么了

    您尝试的解决方案将修复不同的异常,通常是以下情况的变体:

    System.InvalidOperationException:“空间类型和函数不可用于此提供程序,因为找不到程序集“Microsoft.SqlServer.types”版本10或更高版本。”

    如果您没有看到这个错误,那么我们可以安全地假设找到了类型的兼容版本,这通常足以说明将执行空间查询

    数据类型建议 我不能说它与此相关,但在EF中使用空间类型的更大的成功,您应该考虑在数据类(模型)中使用<代码> Stask.Dealth.Trase.Suffic .dBase>/Cuff>,而不是<代码> > Stase.Sule.地理> < /C> > /P> 这仍将解析为SQL
    Geography
    数据类型

    为了进一步调查,需要更多关于数据模型的信息以及为引发OP遇到的特定异常而执行的代码。在没有这些信息的情况下,我采用了一个较旧的商业ASP.Net OData v4 API项目,该项目正在运行:

    • .Net 4.6.1
    • 实体框架6.2.0
    • Microsoft.Spatial 7.3.1
    • Microsoft.SqlServer.Types 14.0.314.76
    • 系统空间5.8.3
    然后,我升级了解决方案中每个项目的框架版本和引用,有几个NuGet包需要处理,因此我在将每个项目的框架版本更改为4.7.2后使用了此命令:

    Update-Package -Reinstall -IgnoreDependencies
    
    现项目情况如下:

    public DbGeography Perimeter { get; set; }
    public DbGeography GateLocation { get; set; }
    
    • .Net 4.7.2
    • 实体框架6.4.0
    • Microsoft.Spatial 7.6.2
    • Microsoft.SqlServer.Types 14.0.1016.290
    • 系统空间5.8.4
    项目仍然像以前一样工作,我可以从我的数据库中查询
    围场
    ,并可以在结果中看到地理空间字段:

    • 注意:在本例中,地理空间字段定义如下:

      public DbGeography Perimeter { get; set; }
      public DbGeography GateLocation { get; set; }
      
    下一步检查什么? 直接在SQL Management Studio中运行相同的SQL查询,记录结果并发布到问题中

    然后还发布执行相同查询但引发捕获异常的代码



    在完全回归测试之后,我在API或前端中找不到新的异常,因此我个人有信心重新升级到
    .Net 4.7.2
    实体框架6.4

    您可以发布用于使用数据读取器测试/复制此错误的代码吗,以及SQL中相应的结果。到目前为止,我无法复制此错误。问题在于使用地理数据类型的列的DataReader.GetFieldType()方法。问题不在于代码,而在于.Net Framework或编译过程。在标题中,您说(再次)…这是指您以前遇到的问题吗?自从EF与spatial类型一起发布以来,我一直在使用它,没有遇到过这个特殊问题,所以我认为它是实现中更深层次的东西,不仅仅是代码引用,还有数据类的底层设计。如果我的解决方案中的任何建议都没有帮助,我很乐意在脱机情况下咨询更多的信息。@Chrischaller没有。围绕此异常的问题经常出现,但直到现在还没有找到解决方案。据我所知,这是一个多年来一直存在的问题。这就是为什么我很好奇看到一些代码示例,我多年来一直虔诚地使用EF,只有当查询结果只包含地理列的空值并且该字段在模型中标记为必需时,才会远程遇到类似这样的错误。升级配置后