SQL Server 2012版本的Microsoft.SqlServer.Types几何UDT是否与SQL Server 2008向后兼容?

时间:2013-02-03 18:30:50

标签: sql-server-2008 sql-server-2012 spatial backwards-compatibility sqlgeometry

如果我在本地安装了SQL Server 2008和SQL Server 2012,我只想亲自尝试一下;但是我只安装了新版本,并且希望保持这种方式。

  • SQL Server 2008附带一个程序集Microsoft.SqlServer.Types.dll,主要版本为10。
  • SQL Server 2012附带了一个程序集Microsoft.SqlServer.Types.dll,主要版本为11。

除其他外,两个程序集都会显示SqlGeometryBuilder type。两个程序集版本之间的一个显着区别是2012类型有一个额外的重载方法AddCircularArc,而2008类型没有。{/ p>

it's not exactly trivial (and perhaps a bad idea) to reference both assemblies in parallel以来,我想知道我是否可以使用2012版本 - 甚至是针对SQL Server 2008实例,只要我不使用AddCircularArc

如果他们尝试过,可以分享他们的经验吗?

2 个答案:

答案 0 :(得分:21)

默认情况下,SqlClient使用Microsoft.SqlServer.Types程序集的10.0版(即使您在项目中引用了较新的版本)。当同时加载该程序集的两个不同版本时,您可能会看到奇怪的运行时异常,例如“System.InvalidCastException:无法将类型为'Microsoft.SqlServer.Types.SqlGeometry'的对象强制转换为'Microsoft.SqlServer.Types.SqlGeometry' ”“。...

以下文章介绍了使用带有SqlClient的较新Microsoft.SqlServer.Types程序集的一些可能性: Breaking Changes to Database Engine Features in SQL Server 2012

选项包括:

  • 调用GetSqlBytes方法,而不是Get方法(例如SqlGeometry.Deserialize(reader.GetSqlBytes(0)))
  • 在应用程序配置中使用程序集重定向
  • 为“类型系统版本”属性指定“SQL Server 2012”的值以强制SqlClient加载程序集的版本11.0

我个人赞成“Type System Version”连接字符串关键字。请参阅此处的MSDN文章: SqlConnection.ConnectionString Property并搜索“类型系统版本”。

答案 1 :(得分:6)

我尝试过对SQL Server 2008 Express使用SQL Server 2012的Microsoft.SqlServer.Types.dll

  • 几何图形可以是 INSERT ed,只要它们不包含圆形字符串;如果它们包含SQL Server 2008不支持的循环字符串,则抛出此异常:

      

    System.Data.SqlClient.SqlException :传入的表格数据流(TDS)协议流不正确。参数1(@geometry):提供的值不是数据类型几何的有效实例。检查源数据是否有无效值。

  • 几何图形可以是 SELECT ,但显然只能通过知名文本(WKT):

    // SELECT [Geometry].STAsText() FROM …
    var geometry = SqlGeometry.STGeomFromText(sqlDataReader.GetSqlChars(…), …);
    

    如果有人试图直接读取几何图形:

    // SELECT [Geometry] FROM …
    var geometry = (SqlGeometry)sqlDataReader[…];
    

    然后抛出以下异常(即使几何中没有圆形字符串):

      

    System.InvalidCastException :[A] Microsoft.SqlServer.Types.SqlGeometry无法转换为[B] Microsoft.SqlServer.Types.SqlGeometry

         
        
    • A类来自Microsoft.SqlServer.Types, Version=10. ...
    •   
    • B类来自Microsoft.SqlServer.Types, Version=11. ...
    •   

    (使用Microsoft.SqlServer.Types.dll版本10时不会抛出该异常。)