whats what sqlenginedbstartconfigaction_install_configrc_cpu64 sql_inst_mrconfigaction_install_confignonrc_cpu64 setup new features failed sql-server-2008 sql-server-2012 spatial backwards-compatibility sqlgeometry

sql-server-2008 - sqlenginedbstartconfigaction_install_configrc_cpu64 - what is new sql server 2017



¿La versión SQL Server 2012 de la geometría UDT de Microsoft.SqlServer.Types es compatible con SQL Server 2008? (2)

Si tuviera tanto SQL Server 2008 como SQL Server 2012 instalados localmente, simplemente probaría esto por mí mismo; sin embargo, solo tengo instalada la versión más nueva y me gustaría mantenerla así.

  • SQL Server 2008 viene con un ensamblado Microsoft.SqlServer.Types.dll , versión principal 10.
  • SQL Server 2012 viene con un ensamblado Microsoft.SqlServer.Types.dll , versión principal 11.

Entre otras cosas, ambos ensamblajes exponen un tipo SqlGeometryBuilder . La única diferencia notable entre las dos versiones de ensamblaje es que el tipo de 2012 tiene un método adicional sobrecargado AddCircularArc , y el tipo de 2008 no.

Dado que no es exactamente trivial (y tal vez una mala idea) hacer referencia a ambos conjuntos en paralelo , me pregunto si puedo usar la versión 2012, incluso en una instancia de SQL Server 2008, siempre que no utilice AddCircularArc .

¿Alguien puede compartir su experiencia si han intentado esto?


He intentado usar Microsoft.SqlServer.Types.dll de SQL Server 2012 contra SQL Server 2008 Express.

  • Las geometrías se pueden INSERT siempre que no contengan cadenas circulares; si contienen cadenas circulares, que SQL Server 2008 no admite, se lanza esta excepción:

    System.Data.SqlClient.SqlException : la secuencia de protocolo de flujo de datos tabulares (TDS) entrante es incorrecta. Parámetro 1 ( @geometry ): el valor proporcionado no es una instancia válida de la geometría del tipo de datos. Verifique los datos de origen para valores inválidos.

  • Las geometrías se pueden seleccionar SELECT , pero aparentemente solo a través de Texto bien conocido (WKT):

    // SELECT [Geometry].STAsText() FROM … var geometry = SqlGeometry.STGeomFromText(sqlDataReader.GetSqlChars(…), …);

    Si uno intenta leer la geometría directamente:

    // SELECT [Geometry] FROM … var geometry = (SqlGeometry)sqlDataReader[…];

    luego se lanza la siguiente excepción (incluso si no hay cadenas circulares presentes en las geometrías):

    System.InvalidCastException : [A] Microsoft.SqlServer.Types.SqlGeometry no se puede convertir a [B] Microsoft.SqlServer.Types.SqlGeometry .

    • El tipo A se origina de Microsoft.SqlServer.Types, Version=10. ...
    • Tipo B origina de Microsoft.SqlServer.Types, Version=11. ...

    (Esa excepción no se produce cuando se usa Microsoft.SqlServer.Types.dll versión 10).


De manera predeterminada, SqlClient usa la versión 10.0 del ensamblado Microsoft.SqlServer.Types (incluso si hace referencia a una versión más nueva en su proyecto). Cuando se cargan dos versiones diferentes de ese ensamblaje al mismo tiempo, puede ver extrañas excepciones de tiempo de ejecución como "System.InvalidCastException: no se puede convertir el objeto del tipo ''Microsoft.SqlServer.Types.SqlGeometry'' para escribir ''Microsoft.SqlServer.Types.SqlGeometry ''. "...

El siguiente artículo describe algunas posibilidades de que debe usar los ensamblados más recientes de Microsoft.SqlServer.Types con SqlClient: cambios de última hora en las características del motor de base de datos en SQL Server 2012

Las opciones son:

  • Llamar al método GetSqlBytes, en lugar de los métodos Get (por ejemplo, SqlGeometry.Deserialize (reader.GetSqlBytes (0)))
  • Usar la redirección de ensamblaje en la configuración de la aplicación
  • Especificar un valor de "SQL Server 2012" para el atributo "Tipo de versión del sistema" para forzar a SqlClient a cargar la versión 11.0 del ensamblaje

Personalmente, estoy a favor de la palabra clave de la cadena de conexión "Type System Version". Vea el artículo de MSDN aquí: Propiedad SqlConnection.ConnectionString y busque ''Type System Version''.