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:
- 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
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