Я пишу приложение (используя .NET Framework 4.5.2 + SQL Server 2014, установленный локально). Приложение должно поддерживать как SQL Server 2014, так и предыдущие версии.Собственный клиент SQL Server 2014 (12.0.0.0) - Любой способ принудительной версии сборки (например, SqlConnectionString «Тип системной версии»)?
При чтении данных с помощью встроенного SQLCLR-типов (SqlGeometry
, SqlGeography
, SqlHierarchyID
), стандартные методы ADO.NET (например, DataReader.GetValues()
) используют 10.0.0.0 сборки, и выбросить исключение из-за несоответствия с (v11 или v12).
Обоснование документировано (хотя требуется некоторое время для определения) в Breaking Changes in SQL Server 2012 (для 11.0.0.0 сборка). Для SQL Server 2012 есть три обходных перечисленные:
Использование
Type System Version=SQL Server 2012
в SQLConnection.ConnectionStringИЛИ: Используйте
app.config/runtime/assemblyBinding/dependentAssembly
повторно карты v10.0.0.0 в v11.0.0.0ИЛИ (не очень «аккуратный» способ справиться с этим): переписать свой код вручную десериализации из
SqlBytes
экземпляра ...
При разработке с компьютера с SQL Server 2014 установлен, версия сборки v12.0.0.0, и возникают подобные вопросы:
System.InvalidCastException: Невозможно привести объект типа
Microsoft.SqlServer.Types.SqlGeometry
типаMicrosoft.SqlServer.Types.SqlGeometry
.
Для SQL Server 2014 (кроме ужасного руководства десериализации подход), кажется, только один обходной путь (официально не задокументированы в обкатки изменений) - казалось бы, что v4.5 SqlConnection
hasn «т еще догнали версии SQL Server:
- Используйте
app.config/runtime/assemblyBinding/dependentAssembly
повторно карту v10.0.0.0 в v12.0.0.0
Вопрос: кроме повторного отображения v10.0.0.0 к v12.0.0.0 в app.config
(который, кажется, работает), есть ли другой (проще) подход, который будет использовать ссылочный узел версия?
Быстрая кода Приведенный ниже пример показывает сбой (без сборки-переназначения в месте):
private static void DoStuff()
{
SqlGeography geog_val = SqlGeography.STGeomFromText(new SqlChars("POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))"), 4326);
SqlGeometry geom_val = SqlGeometry.Parse("LINESTRING(1 1,2 3,4 8, -6 3)");
prm_geog.Value = DBNull.Value; prm_geom.Value = geom_val; ReadReturnedSpatialColumns(cmd);
prm_geog.Value = geog_val; prm_geom.Value = DBNull.Value; ReadReturnedSpatialColumns(cmd);
}
private static void ReadReturnedSpatialColumns(SqlCommand cmd)
{
using (var dr = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
dr.Read(); var items = new object[2]; dr.GetValues(items);
var geog_test = dr.IsDBNull(0) ? SqlGeography.Null : (SqlGeography)items[0];
var geom_test = dr.IsDBNull(1) ? SqlGeometry.Null : (SqlGeometry)items[1];
}
}
Спасибо, хотя я так давно не мог вспомнить оригинальный проект, помню, что была определенная причина, по которой мне нужно было поддерживать полные функции географии (возможно, чтобы избежать ограничения полушария в более ранних версиях) , В любом случае, это, безусловно, хороший ответ, поэтому спасибо за помощь. –