Correspondencia de tipos SQL-CLR (LINQ to SQL)
Una asignación de tipos es la correspondencia entre un tipo de Common Language Runtime (CLR) de un campo o una propiedad de un objeto y el tipo de SQL Server de un campo de tabla.
En este tema se proporciona una matriz de asignaciones completa y alguna información específica sobre lo siguiente:
Tipos de moneda de SQL Server y conversiones en CLR.
Tipos de punto flotante.
Serialización binaria y de cadena.
Matriz de comportamiento de la asignación de tipos en tiempo de ejecución
Los diagramas siguientes muestran una matriz detallada de las asignaciones entre los tipos CLR (en la parte superior) y los tipos de SQL Server (a la izquierda). Cada celda representa el comportamiento previsto, en tiempo de ejecución, cuando los datos de un tipo SQL se recuperan o se guardan en campos o propiedades que tienen tipos CLR correspondientes. LINQ to SQL no admite la asignación a tipos CLR o tipos de datos SQL que no se encuentren especificados en esta matriz (a menos que se habiliten mediante serialización binaria o de cadena).
Nota: |
---|
Las celdas con borde rojo muestran las asignaciones de tipos SQL predeterminadas para el tipo CLR de cada columna. Estos valores predeterminados se utilizan al generar una base de datos de SQL Server mediante CreateDatabase. |
Asignación de enumeración
LINQ to SQL admite la asignación de tipos Enum de CLR de dos maneras:
Asignación a tipos SQL numéricos (TINYINT, SMALLINT, INT, BIGINT)
Al asignar un tipo Enum de CLR a un tipo numérico de SQL, el valor entero subyacente del tipo Enum de CLR se asigna al valor del campo de la base de datos de SQL. El valor del campo en SQL se recupera directamente como el valor integral subyacente del tipo Enum. Al cambiar el valor de Enum y guardar los datos en la base de datos, el valor integral subyacente de Enum se almacena en el campo de la base de datos.
Asignación a tipos SQL de texto (CHAR, NCHAR, VARCHAR, NVARCHAR)
Al asignar un tipo Enum de CLR a un tipo de texto SQL, el valor de SQL de la base de datos se asigna a los nombres de los miembros Enum de CLR. Por ejemplo, si un tipo Enum denominado DaysOfWeek contiene un miembro denominado Tue, ese miembro se asigna a un valor de base de datos de Tue. Puede lograr esta asignación utilizando la reflexión en el tipo Enum.
La asignación predeterminada de SQL para un tipo Enum de CLR es el equivalente de SQL de su tipo integral subyacente.
Asignación de fecha y hora
Los valores DateTime se guardan tal cual en la base de datos, sin conversión TimeZone, independientemente de la información original de DateTimeKind. Cuando los valores DateTime se recuperan de la base de datos, su valor se carga tal cual en DateTime, con un valor DateTimeKind de Unspecified. Para obtener más información, consulte System.DateTime (métodos - LINQ to SQL).
Asignaciones de tipos XML
Puede asignar el tipo de datos XML de SQL Server 2005 a XElement (valor predeterminado) o String. Si la columna almacena fragmentos XML que no se pueden leer en XElement, dicha columna debe asignarse a String para evitar errores en tiempo de ejecución. Éstos son algunos ejemplos de fragmentos XML que se deben asignar a String:
Una secuencia de elementos XML.
Atributos, PI, comentarios.
Nota: |
---|
XDocument no puede utilizarse para asignar tipos de datos XML porque esta clase no es serializable (no implementa la interfaz IXmlSerializable). |
Tipos Decimal y Money
Existen las siguientes diferencias entre los tipos DECIMAL/MONEY/SMALLMONEY de SQL Server y los tipos Decimal / Double de CLR:
SQL Server
DECIMAL(precision,scale)
Precisión de hasta 38 dígitos.
Intervalo (con todos los dígitos a la izquierda del separador decimal): -1038 + 1 a 1038 – 1.
Puede representar todos los posibles números de 0-38 dígitos.
MONEY
Precisión de hasta 18-19 dígitos, pero siempre con exactamente 4 dígitos a la derecha del separador decimal.
Intervalo: -263/1000 a (263 – 1)/1000.
Puede representar todos los posibles números de 0-18 dígitos y algunos, pero no todos, los números de 19 dígitos.
SMALLMONEY
Precisión de hasta 5-6 dígitos, pero siempre con exactamente 4 dígitos a la derecha del separador decimal.
Intervalo: -231/1000 a (231 – 1)/1000.
Puede representar todos los posibles números de 0-5 dígitos y algunos, pero no todos, los números de 6 dígitos.
CLR
-
Precisión de hasta 28-29 dígitos.
Intervalo (con todos los dígitos a la izquierda del separador decimal): -296 + 1 a 296 – 1.
Puede representar todos los posibles números de 0-28 dígitos y algunos, pero no todos, los números de 29 dígitos.
Tipos de punto flotante
SQL Server admite el tipo de punto flotante de tamaño variable, especificado como FLOAT(mantissaBits). El tipo Single de CLR es equivalente a REAL, sinónimo de FLOAT(24). El tipo Double de CLR es equivalente a FLOAT, que es de forma predeterminada FLOAT(53). LINQ to SQL asigna los tipos FLOAT que son FLOAT(24) o menores a Single, y los tipos flotantes mayores a Double.
Nota: |
---|
Técnicamente, SQL Server puede almacenar valores NaN, infinitos positivos/negativos y cero positivo/negativo en las consultas. Estos valores no siempre se comportan como se espera, incluso en las consultas SQL directas. |
Serialización binaria y de cadena
LINQ to SQL admite dos tipos de serialización de las clases de .NET Framework y clases de usuario.
Serialización de cadena (.Parse())
Si una clase implementa .Parse() (con una firma similar a DateTime, por ejemplo), puede serializarlo en cualquier campo de texto SQL (CHAR, NCHAR, VARCHAR, NVARCHAR, TEXT, NTEXT, XML). Si serializa el objeto en una cadena, el valor devuelto de ToString() se guarda en la base de datos. Si deserializa una cadena almacenada, .Parse() se invoca en la cadena para devolver el objeto construido.
Serialización binaria (ISerializable)
Si una clase implementa ISerializable, se puede serializar en cualquier campo binario de SQL (BINARY, VARBINARY, IMAGE). Para serializar y deserializar el objeto, se sigue el comportamiento estándar de ISerializable.
-
LINQ to SQL no admite la serialización mediante IXmlSerializable.