【问题标题】:Is the SQL Server 2012 version of Microsoft.SqlServer.Types' geometry UDT backward compatible with SQL Server 2008?Microsoft.SqlServer.Types 的几何 UDT 的 SQL Server 2012 版本是否向后兼容 SQL Server 2008?
【发布时间】:2013-01-18 12:07:35
【问题描述】:

如果我在本地同时安装了 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 类型没有。

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

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

【问题讨论】:

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


【解决方案1】:

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

以下文章描述了您必须将较新的 Microsoft.SqlServer.Types 程序集与 SqlClient 一起使用的一些可能性: Breaking Changes to Database Engine Features in SQL Server 2012

选项有:

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

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

【讨论】:

  • “Type System Version”属性+1,解决两个SQL Server版本之间的转换问题
  • 您的回答中缺少的两个事实 (that I have learnt in the meantime) 是版本 11 向后兼容版本 10,但版本 10 仅部分向前兼容版本 11。不过我接受您的回答因为意识到必须完成一些明确的工作才能加载版本 11,这一点非常重要。
  • 您的计算机上也有可能没有安装版本 11。在这种情况下,您还必须下载 2012 SQL 功能包:microsoft.com/en-us/download/details.aspx?id=29065
  • 如果您没有安装 v11(或更高版本),另请参阅 comments 了解替代选项
【解决方案2】:

我已经尝试使用 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....

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多