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

sta*_*ica 11 spatial backwards-compatibility sql-server-2008 sql-server-2012 sqlgeometry

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

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

除其他外,两个程序集都暴露了一种SqlGeometryBuilder类型.两个程序集版本之间的一个显着区别是2012类型有一个额外的重载方法AddCircularArc,而2008类型没有.

因为并行引用这两个程序集并不是一件容易的事(也许是一个坏主意),我想知道我是否可以使用2012版本 - 即使是针对SQL Server 2008实例,只要我不使用它AddCircularArc.

任何人都可以分享他们的经验吗?

blu*_*ing 21

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

下面的文章描述了必须使用较新的Microsoft.SqlServer.Types程序集与SqlClient的一些可能性:SQL Server 2012中对数据库引擎功能的重大 更改

选项是:

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

我个人赞成"Type System Version"连接字符串关键字.请参阅此处的MSDN文章: SqlConnection.ConnectionString属性并搜索"Type System Version".

  • +1"类型系统版本"属性,用于解决两个版本的SQL Server之间的转换问题 (2认同)

sta*_*ica 6

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

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

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

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

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

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

    // SELECT [Geometry] FROM …
    var geometry = (SqlGeometry)sqlDataReader[…];
    
    Run Code Online (Sandbox Code Playgroud)

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

    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 时不会抛出该异常.)