Является ли версия SQL Server 2012 версии Microsoft.SqlServer.Types "UDT" обратной совместимостью с SQL Server 2008?

Если бы у меня были установлены 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.

Может ли кто-нибудь поделиться своим опытом, если они попробовали это?

Ответ 1

По умолчанию SqlClient использует версию 10.0 сборки Microsoft.SqlServer.Types(даже если вы ссылаетесь на более новую версию в своем проекте). Когда одновременно загружаются две разные версии этой сборки, вы можете увидеть странные исключения во время выполнения, такие как "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 и выполните поиск 'Type System Version'.

Ответ 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.)