12

如果我在本地安装了 SQL Server 2008 和 SQL Server 2012,我会自己尝试一下;但是我只安装了较新的版本,并希望保持这种状态。

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

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

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

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

4

2 回答 2

22

默认情况下,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)))
  • 在应用程序配置中使用程序集重定向
  • 为“类型系统版本”属性指定值“SQL Server 2012”以强制 SqlClient 加载程序集的 11.0 版本

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

于 2013-09-18T20:16:17.160 回答
7
于 2013-03-05T09:43:45.707 回答