如果我在本地安装了SQL Server 2008和SQL Server 2012,我只想亲自尝试一下;但是我只安装了新版本,并且希望保持这种方式。
Microsoft.SqlServer.Types.dll
,主要版本为10。Microsoft.SqlServer.Types.dll
,主要版本为11。除其他外,两个程序集都会显示SqlGeometryBuilder
type。两个程序集版本之间的一个显着区别是2012类型有一个额外的重载方法AddCircularArc
,而2008类型没有。{/ p>
自it's not exactly trivial (and perhaps a bad idea) to reference both assemblies in parallel以来,我想知道我是否可以使用2012版本 - 甚至是针对SQL Server 2008实例,只要我不使用AddCircularArc
。
如果他们尝试过,可以分享他们的经验吗?
答案 0 :(得分:21)
默认情况下,SqlClient使用Microsoft.SqlServer.Types程序集的10.0版(即使您在项目中引用了较新的版本)。当同时加载该程序集的两个不同版本时,您可能会看到奇怪的运行时异常,例如“System.InvalidCastException:无法将类型为'Microsoft.SqlServer.Types.SqlGeometry'的对象强制转换为'Microsoft.SqlServer.Types.SqlGeometry' ”“。...
以下文章介绍了使用带有SqlClient的较新Microsoft.SqlServer.Types程序集的一些可能性: Breaking Changes to Database Engine Features in SQL Server 2012
选项包括:
我个人赞成“Type System Version”连接字符串关键字。请参阅此处的MSDN文章: SqlConnection.ConnectionString Property并搜索“类型系统版本”。
答案 1 :(得分:6)
我尝试过对SQL Server 2008 Express使用SQL Server 2012的Microsoft.SqlServer.Types.dll
。
几何图形可以是 INSERT
ed,只要它们不包含圆形字符串;如果它们包含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时不会抛出该异常。)