Partilhar via


UDTs grandes

Os tipos definidos pelo usuário (UDTs) permitem que um desenvolvedor estenda o sistema de tipos escalares do servidor armazenando objetos CLR (Common Language Runtime) em um banco de dados do SQL Server. As UDTs podem conter vários elementos e podem ter comportamentos, ao contrário dos tipos de dados de alias tradicionais, que consistem em um único tipo de dados do sistema SQL Server.

Nota

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

Anteriormente, as UDTs eram 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 para tipos definidos pelo usuário, consulte CLR User-Defined Types.

Recuperando esquemas UDT usando GetSchema

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

Valores de coluna GetSchemaTable para UDTs

O GetSchemaTable método de um SqlDataReader retorna a DataTable que descreve metadados de coluna. A tabela a seguir descreve as diferenças nos metadados de 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 das três partes especificado como Database.SchemaName.TypeName.
IsLong Varia Varia

Considerações sobre SqlDataReader

O SqlDataReader foi estendido a partir do SQL Server 2008 para oferecer suporte à recuperação de grandes valores UDT. O tamanho dos valores UDT processados por um SqlDataReader depende 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, veja ConnectionString.

Os seguintes métodos de SqlDataReader retornarão um SqlBinary em vez de um UDT quando o Type System Version estiver 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 estiver definido como SQL Server 2005:

Observe que nenhuma conversão é feita para a versão atual do ADO.NET.

Especificando SqlParameters

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

Propriedade SqlParameter Descrição
Value Obtém ou define um objeto que representa o valor do parâmetro. O padrão é null. 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 é null. 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 predefinido é 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.

Exemplo de recuperação de dados

O fragmento de código a seguir demonstra como recuperar grandes dados UDT. A connectionString variável pressupõe uma conexão válida com um banco de dados do SQL Server e a commandString variável assume 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

Consulte também