UDT volumineux
Les types définis par l’utilisateur (UDT) permettent au développeur d’étendre le système de type scalaire du serveur en stockant des objets CLR (Common Language Runtime) dans une base de données SQL Server. Les UDT peuvent contenir plusieurs éléments et avoir des comportements, contrairement aux types de données alias traditionnels, qui ne comprennent qu’un seul type de données système SQL Server.
Notes
Vous devez installer le .NET Framework 3.5 SP1 (ou version ultérieure) pour tirer parti de la prise en charge améliorée de SqlClient pour les UDT volumineux.
Auparavant, les UDT étaient limités à une taille maximale de 8 kilo-octets. Dans SQL Server 2008, cette restriction a été supprimée pour les UDT ayant un format UserDefined.
Pour obtenir la documentation complète sur les types définis par l’utilisateur, consultez Types CLR définis par l’utilisateur.
Récupération de schémas UDT à l'aide de GetSchema
La méthode GetSchema de SqlConnection retourne les informations de schéma de base de données dans une DataTable. Pour plus d’informations, consultez Collections de schémas SQL Server.
Valeurs de colonne GetSchemaTable Column pour les UDT
La méthode GetSchemaTable d’un SqlDataReader retourne une DataTable qui décrit les métadonnées de la colonne. La table suivante décrit les différences dans les métadonnées de colonne pour les UDT volumineux entre SQL Server 2005 et SQL Server 2008.
Colonne SqlDataReader | SQL Server 2005 | SQL Server 2008 et versions ultérieures |
---|---|---|
ColumnSize |
Variable | Variable |
NumericPrecision |
255 | 255 |
NumericScale |
255 | 255 |
DataType |
Byte[] |
Instance UDT |
ProviderSpecificDataType |
SqlTypes.SqlBinary |
Instance UDT |
ProviderType |
21 (SqlDbType.VarBinary ) |
29 (SqlDbType.Udt ) |
NonVersionedProviderType |
29 (SqlDbType.Udt ) |
29 (SqlDbType.Udt ) |
DataTypeName |
SqlDbType.VarBinary |
Nom en trois parties spécifié sous la forme Database.SchemaName.TypeName. |
IsLong |
Variable | Variable |
Considérations relatives à SqlDataReader
L’objet SqlDataReader a été étendu à compter de SQL Server 2008 pour prendre en charge la récupération des valeurs UDT volumineuses. La façon dont les valeurs UDT volumineuses sont traitées par un SqlDataReader dépend de la version de SQL Server que vous utilisez, ainsi que de la Type System Version
spécifiée dans la chaîne de connexion. Pour plus d’informations, consultez ConnectionString.
Les méthodes suivantes de SqlDataReader retournent un SqlBinary au lieu d’un type défini par l’utilisateur (UDT) lorsque la Type System Version
est définie sur SQL Server 2005 :
Les méthodes suivantes retournent un tableau de Byte[]
au lieu d’un type défini par l’utilisateur (UDT) lorsque la Type System Version
est définie sur SQL Server 2005 :
Notez qu’aucune conversion n’est effectuée pour la version actuelle de ADO.NET.
Spécification de SqlParameters
Les propriétés suivantes de SqlParameter ont été étendues pour fonctionner avec des UDT volumineux.
Propriété SqlParameter | Description |
---|---|
Value | Obtient ou définit un objet représentant la valeur du paramètre. La valeur par défaut est null. La propriété peut être SqlBinary , Byte[] ou un objet managé. |
SqlValue | Obtient ou définit un objet représentant la valeur du paramètre. La valeur par défaut est null. La propriété peut être SqlBinary , Byte[] ou un objet managé. |
Size | Obtient ou définit la taille de la valeur du paramètre à résoudre. La valeur par défaut est 0. La propriété peut être un entier qui représente la taille de la valeur du paramètre. Pour les UDT volumineux, elle peut être la taille réelle de l’UDT, ou -1 pour inconnu. |
Exemple d'extraction de données
Le fragment de code suivant montre comment récupérer des donnée UDT volumineuses. La variable connectionString
suppose une connexion valide à une base de données SQL Server et la variable commandString
suppose une instruction SELECT valide avec la colonne de clé primaire qui est indiquée en premier.
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