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  

Voir aussi