SQL Server 2012 版本的 Microsoft.SqlServer.Types' geometry UDT 是否向后兼容 SQL Server 2008?



如果我在本地安装了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

如果他们尝试过这个,任何人都可以分享他们的经验吗?

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

以下文章介绍了必须将较新的 Microsoft.SqlServer.Type 程序集与 SqlClient 配合使用的一些可能性:SQL Server 2012 中数据库引擎功能的重大更改

选项包括:

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

我个人更喜欢"类型系统版本"连接字符串关键字。请参阅此处的 MSDN 文章:SqlConnection.ConnectionString 属性并搜索"类型系统版本"。

我尝试使用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(…), …);
    

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

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

    (使用版本 10 时Microsoft.SqlServer.Types.dll不会引发该异常。

最新更新