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).- El tipo A se origina de
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''.