UDTs grandes

Os UDTs (tipos definidos pelo usuário) permitem que os desenvolvedores estendam o sistema de tipo escalar do servidor armazenando objetos de CLR (Common Language Runtime) em um banco de dados SQL Server. Os UDTs podem conter vários elementos e ter comportamentos, diferentemente dos tipos de dados de alias tradicionais, que consistem em um único tipo de dados do sistema no SQL Server.

Observação

Você deve instalar o .NET Framework 3.5 SP1 (ou posterior) para se beneficiar do suporte avançado do SqlClient para UDTs grandes.

Os UDTs eram anteriormente restritas a um tamanho máximo de 8 kilobytes. No SQL Server 2008, essa restrição foi removida para UDTs que têm um formato de UserDefined.

Para obter a documentação completa dos tipos definidos pelo usuário, confira Tipos CLR definidos pelo usuário.

Recuperando esquemas de UDT usando GetSchema

O método GetSchema de SqlConnection retorna informações de esquema de banco de dados em um DataTable. Para obter mais informações, confira Coleções de esquema do SQL Server.

Valores de coluna de GetSchemaTable para UDTs

O método GetSchemaTable de um SqlDataReader retorna um DataTable que descreve os metadados da coluna. A tabela a seguir descreve as diferenças nos metadados da coluna para UDTs grandes entre o SQL Server 2005 e o SQL Server 2008.

Coluna SqlDataReader SQL Server 2005 SQL Server 2008 e posterior
ColumnSize Varia Varia
NumericPrecision 255 255
NumericScale 255 255
DataType Byte[] Instância UDT
ProviderSpecificDataType SqlTypes.SqlBinary Instância UDT
ProviderType 21 (SqlDbType.VarBinary) 29 (SqlDbType.Udt)
NonVersionedProviderType 29 (SqlDbType.Udt) 29 (SqlDbType.Udt)
DataTypeName SqlDbType.VarBinary O nome de três partes especificado como Database.SchemaName.TypeName.
IsLong Varia Varia

Considerações do SqlDataReader

O SqlDataReader foi estendido a partir do SQL Server 2008 para dar suporte à recuperação de UDTs de valores grandes. A forma como as UDT de valores grandes são processadas por um SqlDataReader dependem da versão do SQL Server que você está usando, bem como do Type System Version especificado na cadeia de conexão. Para obter mais informações, consulte ConnectionString.

Os seguintes métodos de SqlDataReader retornarão um SqlBinary em vez de uma UDT quando o Type System Version for definido como SQL Server 2005:

Os seguintes métodos retornarão uma matriz de Byte[] em vez de uma UDT quando o Type System Version for definido como SQL Server 2005:

Observe que nenhuma das conversões são feitas para a versão atual do ADO.NET.

Especificar SqlParameters

As propriedades SqlParameter a seguir foram estendidas para funcionar com UDTs grandes.

Propriedade SqlParameter Descrição
Value Obtém ou define um objeto que representa o valor do parâmetro. O padrão é nulo. A propriedade pode ser SqlBinary, Byte[] ou um objeto gerenciado.
SqlValue Obtém ou define um objeto que representa o valor do parâmetro. O padrão é nulo. A propriedade pode ser SqlBinary, Byte[] ou um objeto gerenciado.
Size Obtém ou define o tamanho do valor do parâmetro a ser resolvido. O valor padrão é 0. A propriedade pode ser um inteiro que representa o tamanho do valor do parâmetro. Para UDTs grandes, pode ser o tamanho real da UDT ou -1 para desconhecido.

Recuperando exemplo de dados

O fragmento de código a seguir demonstra como recuperar dados de uma UDT grande. A variável connectionString assume uma conexão válida com um banco de dados SQL Server, e a variável commandString pressupõe uma instrução SELECT válida com a coluna de chave primária listada primeiro.

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  

Confira também