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:

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  

Consulte también