处理SQL Server 2012表中的空间数据类型

时间:2012-10-31 04:28:41

标签: c# sql-server sql-server-2012 sqldatatypes sqlclient

一些背景知识:

我在两个不同的VM上运行两个不同的SQL Server安装。我正在尝试从我的代码(为SQL Server 2008 R2编写)连接到它们。我目前的.NET框架版本是4.0。我的Microsoft SQL Server 2008 R2安装正在运行为其设计的AdventureWorks,我的SQL Server 2012 Express安装正在运行较新的AdventureWorks2012数据库。我正在查询Person.Address。

目前我遇到一个异常,说“DataType不能为null”。我从查看返回的模式推断出问题来自SQL Server 2012返回

Microsoft.SqlServer.Types.SqlGeography

数据类型。似乎Type.GetType无法将其转换为可用的东西并抛出异常。我感到宽慰的是,我没有做过什么,但我也感到困惑,因为这段代码应该普遍适用。请记住,此代码在SQL Server 2008 R2上运行完美(因为它缺少空间数据类型)。

我可以想到100种糟糕的方法来处理这个问题。但是我想来找你们这些建议。将.NET升级到4.5可以解决这个问题吗?我是否必须更改我的代码以适应新的数据类型?如果我的应用程序没有处理它们,我应该担心空间数据类型吗?我该如何处理,因为很明显SqlClient和Type.GetType在这方面做得不好。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您正在使用2012和2008 R2,我建议您强制使用SQL 2012 SqlGeography类型。

您可以考虑添加程序集重定向,因此任何尝试加载2008 R2 SqlGeograph的.NET代码都被视为SQL 2012 SqlGeography。 SQL序列在序列化时通常是向后兼容的(只要可能,即不使用SQL 2012特定功能时,如CurvePolygon)。

<runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="11.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>