Является ли версия 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.)