UDT grandes
Los tipos definidos por el usuario (UDT) permiten a los desarrolladores extender el sistema de tipo escalar del servidor mediante el almacenamiento de objetos de Common Language Runtime (CLR) en una base de datos de SQL Server. Los UDT pueden contener varios elementos y tener comportamientos, a diferencia de los tipos de datos de alias tradicionales, que se componen de un solo tipo de datos de sistema de SQL Server.
Nota
Debe instalar .NET Framework 3.5 SP1 (o posterior) para aprovechar la compatibilidad de SqlClient mejorada para UDT grandes.
Anteriormente, los UDT estaban restringidos a un tamaño máximo de 8 kilobytes. En SQL Server 2008, esta restricción se ha eliminado en los UDT con un formato de UserDefined.
Para obtener la documentación completa de los tipos definidos por el usuario, consulta Tipos definidos por el usuario de CLR.
Recuperar los esquemas UDT mediante GetSchema
El método GetSchema de SqlConnection devuelve información del esquema de la base de datos en un parámetro DataTable. Para obtener más información sobre el esquema, consulta Colecciones de esquemas de SQL Server.
Valores de columna de GetSchemaTable para los UDT
El método GetSchemaTable de SqlDataReader devuelve un valor DataTable que describe los metadatos de la columna. En la tabla siguiente se describen las diferencias en los metadatos de columna para los UDT de gran tamaño entre SQL Server 2005 y SQL Server 2008.
Columna SqlDataReader | SQL Server 2005 | SQL Server 2008 y versiones posteriores |
---|---|---|
ColumnSize |
Varía | Varía |
NumericPrecision |
255 | 255 |
NumericScale |
255 | 255 |
DataType |
Byte[] |
Instancia de UDT |
ProviderSpecificDataType |
SqlTypes.SqlBinary |
Instancia de UDT |
ProviderType |
21 (SqlDbType.VarBinary ) |
29 (SqlDbType.Udt ) |
NonVersionedProviderType |
29 (SqlDbType.Udt ) |
29 (SqlDbType.Udt ) |
DataTypeName |
SqlDbType.VarBinary |
Nombre de tres partes especificado como Database.SchemaName.TypeName. |
IsLong |
Varía | Varía |
Consideraciones de SqlDataReader
SqlDataReader se ha ampliado a partir de SQL Server 2008 para admitir la recuperación de valores UDT grandes. La forma en que se procesan los valores UDT de gran tamaño mediante SqlDataReader depende de la versión de SQL Server que esté utilizando, así como del valor Type System Version
especificado en la cadena de conexión. Para obtener más información, vea ConnectionString.
Los siguientes métodos de SqlDataReader devolverán SqlBinary en lugar de un UDT cuando Type System Version
se establezca en SQL Server 2005:
- GetProviderSpecificFieldType
- GetProviderSpecificValue
- GetProviderSpecificValues
- GetSqlValue
- GetSqlValues
Los siguientes métodos devolverán una matriz de Byte[]
en lugar de un UDT cuando Type System Version
se establezca en SQL Server 2005:
Tenga en cuenta que no se realiza ninguna conversión para la versión actual de ADO.NET.
Especificación de SqlParameters
Las siguientes propiedades de SqlParameter se han ampliado para trabajar con UDT de gran tamaño.
Propiedades de SqlParameter | Descripción |
---|---|
Value | Obtiene o establece un objeto que representa el valor del parámetro. El valor predeterminado es null. La propiedad puede ser SqlBinary , Byte[] o un objeto administrado. |
SqlValue | Obtiene o establece un objeto que representa el valor del parámetro. El valor predeterminado es null. La propiedad puede ser SqlBinary , Byte[] o un objeto administrado. |
Size | Obtiene o establece el tamaño del valor del parámetro que se va a resolver. El valor predeterminado es 0. La propiedad puede ser un entero que represente el tamaño del valor del parámetro. En UDT grandes, puede ser el tamaño real del UDT o -1 si no se conoce. |
Ejemplo de recuperación de datos
El fragmento de código siguiente muestra cómo se recuperan datos de UDT de gran tamaño. La variable connectionString
asume la existencia de una conexión válida a una base de datos de SQL Server, y la variable commandString
asume la existencia de una instrucción SELECT válida con la columna de clave principal que aparece en primer lugar.
using (SqlConnection connection = new SqlConnection(
connectionString, commandString))
{
connection.Open();
SqlCommand command = new SqlCommand(commandString);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
// Retrieve the value of the Primary Key column.
int id = reader.GetInt32(0);
// Retrieve the value of the UDT.
LargeUDT udt = (LargeUDT)reader[1];
// You can also use GetSqlValue and GetValue.
// LargeUDT udt = (LargeUDT)reader.GetSqlValue(1);
// LargeUDT udt = (LargeUDT)reader.GetValue(1);
Console.WriteLine(
"ID={0} LargeUDT={1}", id, udt);
}
reader.close
}
Using connection As New SqlConnection( _
connectionString, commandString)
connection.Open()
Dim command As New SqlCommand(commandString, connection)
Dim reader As SqlDataReader
reader = command.ExecuteReader
While reader.Read()
' Retrieve the value of the Primary Key column.
Dim id As Int32 = reader.GetInt32(0)
' Retrieve the value of the UDT.
Dim udt As LargeUDT = CType(reader(1), LargeUDT)
' You can also use GetSqlValue and GetValue.
' Dim udt As LargeUDT = CType(reader.GetSqlValue(1), LargeUDT)
' Dim udt As LargeUDT = CType(reader.GetValue(1), LargeUDT)
' Print values.
Console.WriteLine("ID={0} LargeUDT={1}", id, udt)
End While
reader.Close()
End Using