10

如果我在本地安裝了SQL Server 2008和SQL Server 2012,我只需要自己嘗試一下;但是我只安裝了更新的版本,並希望保持這種方式。Microsoft.SqlServer.Types的幾何UDT的SQL Server 2012版本是否與SQL Server 2008向後兼容?

  • 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即可。

任何人都可以分享他們的經驗,如果他們嘗試過嗎?

+1

本節_ 「SQL CLR數據類型(幾何,地利,人和HIERARCHYID)」 _的MSDN頁[_ 「在SQL Server 2012中的重大更改數據庫引擎功能」 _]的(http://technet.microsoft。 com/en-us/library/ms143179.aspx)不會涉及此問題。 – stakx

回答

18

默認的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.Deseria lize(reader.GetSqlBytes(0)))
  • 在應用程序配置中使用程序集重定向
  • 爲「類型系統版本」屬性指定「SQL Server 2012」的值以強制SqlClient加載程序集的版本11.0

我個人傾向於「類型系統版本」連接字符串關鍵字。請參閱此處的MSDN文章: SqlConnection.ConnectionString Property並搜索「類型系統版本」。

+2

+1「類型系統版本」屬性來解析SQL服務器 –

+0

兩個事實([我在此期間學到]的兩個版本之間鑄造的問題(http://stackoverflow.com/questions/14675774/是最SQLSERVER-2012-版本的微軟-sqlserver的類型 - 幾何UDT-backwa#comment38074389_14855882)),它們從你的答案失蹤是11版與10版向後兼容的,但10版是隻是部分向前兼容版本11.我仍然接受你的答案,因爲認識到必須完成一些明確的工作才能加載版本11是非常重要的。 – stakx

6

我已經嘗試過使用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被用於不拋出該異常。)

相關問題