Idioma

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

Para acesso de clientes a grandes UDTs, instale o pacote NuGet Microsoft.Data.SqlClient e importe Microsoft.Data.SqlClient. Os tipos SQL CLR que definem o UDT do lado do servidor permanecem em Microsoft.SqlServer.Server; não substituam esses tipos por tipos cliente-fornecedor.

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 devolve informação do esquema da base de dados no DataTable objeto. Para obter mais informações, consulte Coleções de esquema do SQL Server.

Valores de coluna GetSchemaTable para UDTs

O GetSchemaTable método devolve metadados da coluna no DataTable objeto. 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

A classe SqlDataReader suporta valores UDT de grandes dimensões no SQL Server 2008 e versões posteriores. A forma como o leitor processa estes valores depende da versão do SQL Server e da Type System Version cadeia de ligação. Para obter mais informações, veja ConnectionString.

Quando Type System Version é o SQL Server 2005, os seguintes SqlDataReader métodos utilizam a representação binária de grandes UDTs:

Para a mesma definição de sistema de tipos, GetValue devolve o valor grande do UDT como Byte[]. GetValues preenche o array fornecido com valores de coluna e devolve o número de elementos preenchidos. Valores grandes de UDT nesse array usam Byte[].

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

Especificando SqlParameters

As seguintes SqlParameter propriedades suportam grandes UDTs.

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 assume uma ligação válida a uma base de dados SQL Server e a commandString variável assume uma instrução válida SELECT com a coluna da chave primária listada primeiro.

using (SqlConnection connection = new SqlConnection(
    connectionString))
{
  connection.Open();
  SqlCommand command = new SqlCommand(commandString, connection);
  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)
    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