如果我在本地安装了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
不会引发该异常。- A型起源于