Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
- GetProviderSpecificFieldType
- GetProviderSpecificValue
- GetProviderSpecificValues
- GetSqlValue
- GetSqlValues
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