2015-03-21 2 views
4

Я пишу приложение (используя .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]; 
    } 
} 

ответ

2

Эта проблема все еще существует с Framework 4.6.1 и, как представляется, нет обходного пути, кроме 3 вы уже обнаружили. Поэтому короткий ответ на ваш вопрос: нет.

Однако я бы поставил под вопрос, действительно ли действительно нужна версия 12 пространственных типов, потому что (насколько я могу судить) они ничего не добавляют по типам v11. Если вы предпочитаете использовать типы v11, поэтому вы можете использовать обходной путь Type System Version=SQL Server 2012, вы можете установить Nuget package, который включает в себя все три версии (10, 11, 12) - он специально разработан для развертывания на серверах, на которых MSSQL может не работать быть установленным.

В качестве бонуса, ссылаясь на этот пакет напрямую и используя Type System Version=SQL Server 2012, вы убедитесь, что ваше приложение будет всегда использовать пространственные типы 2012 года, поэтому обновление до SQL 2016 ничего не сломает, если оно решит вернуть другую версию (например, 13 или 14, или независимо от того, что будет использоваться в 2016 году) по умолчанию.

+0

Спасибо, хотя я так давно не мог вспомнить оригинальный проект, помню, что была определенная причина, по которой мне нужно было поддерживать полные функции географии (возможно, чтобы избежать ограничения полушария в более ранних версиях) , В любом случае, это, безусловно, хороший ответ, поэтому спасибо за помощь. –

Смежные вопросы