Lingua

Tipi UDT grandi

I tipi definiti dall'utente (UDT) consentono agli sviluppatori di estendere il sistema di tipi scalare del server archiviando oggetti Common Language Runtime (CLR) in un database di SQL Server. I tipi definiti dall'utente (UDT) possono contenere più elementi e avere comportamenti, a differenza dei tradizionali tipi di dati alias che sono costituiti da un solo tipo di dati del sistema SQL Server.

Nota

Per l'accesso client a tipi definiti dall'utente di grandi dimensioni, installare il pacchetto NuGet Microsoft.Data.SqlClient e importare Microsoft.Data.SqlClient. I tipi CLR SQL che definiscono l'UDT lato server rimangono in Microsoft.SqlServer.Server; non sostituire tali tipi con tipi di provider client.

In precedenza, i tipi definiti dall'utente erano limitati a una dimensione massima di 8 kilobyte. In SQL Server 2008, questa limitazione è stata rimossa per i TDU che hanno un formato di UserDefined.

Per la documentazione completa relativa ai tipi definiti dall'utente, vedere Tipi CLR definiti dall'utente.

Recupero di schemi UDT tramite GetSchema

Il GetSchema metodo restituisce informazioni sullo schema del database nell'oggetto DataTable . Per altre informazioni, vedere Raccolte di schemi di SQL Server.

Valori della colonna GetSchemaTable per tipi UDT

Il GetSchemaTable metodo restituisce i metadati della colonna nell'oggetto DataTable . La seguente tabella descrive le differenze nei metadati delle colonne per grandi tipi di dati definiti dall'utente tra SQL Server 2005 e SQL Server 2008.

Colonna SqlDataReader SQL Server 2005 SQL Server 2008 e versioni successive
ColumnSize Variabile Variabile
NumericPrecision 255 255
NumericScale 255 255
DataType Byte[] Istanza UDT
ProviderSpecificDataType SqlTypes.SqlBinary Istanza UDT
ProviderType 21 (SqlDbType.VarBinary) 29 (SqlDbType.Udt)
NonVersionedProviderType 29 (SqlDbType.Udt) 29 (SqlDbType.Udt)
DataTypeName SqlDbType.VarBinary Nome in tre parti specificato come Database.SchemaName.TypeName.
IsLong Variabile Variabile

Considerazioni su SqlDataReader

La SqlDataReader classe supporta valori UDT di grandi dimensioni in SQL Server 2008 e versioni successive. Il modo in cui il reader elabora questi valori dipende dalla versione di SQL Server e da Type System Version nella stringa di connessione. Per ulteriori informazioni, vedere ConnectionString.

Quando Type System Version è SQL Server 2005, i metodi seguenti SqlDataReader usano la rappresentazione binaria di UDT di grandi dimensioni:

Per la stessa impostazione del sistema di tipi, GetValue restituisce il valore definito dall'utente di grandi dimensioni come Byte[]. GetValues riempie l'array fornito con valori di colonna e restituisce il numero di elementi popolati. Valori UDT di grandi dimensioni in tale matrice usano Byte[].

Si noti che non viene eseguita alcuna conversione per la versione corrente di ADO.NET.

Specificare SqlParameters

Le proprietà seguenti SqlParameter supportano tipi definiti dall'utente di grandi dimensioni.

Proprietà SqlParameter Descrizione
Value Ottiene o imposta un oggetto che rappresenta il valore del parametro. Il valore predefinito è Null. La proprietà può essere SqlBinary, Byte[] o un oggetto gestito.
SqlValue Ottiene o imposta un oggetto che rappresenta il valore del parametro. Il valore predefinito è Null. La proprietà può essere SqlBinary, Byte[] o un oggetto gestito.
Size Ottiene o imposta la dimensione del valore del parametro da risolvere. Il valore predefinito è 0. La proprietà può essere un numero intero che rappresenta la dimensione del valore del parametro. Per gli UDT di grandi dimensioni, può trattarsi delle dimensioni effettive dell'UDT oppure di -1 quando è sconosciuto.

Esempio di recupero di dati

Il frammento di codice seguente illustra come recuperare dati UDT di grandi dimensioni. La connectionString variabile presuppone una connessione valida a un database SQL Server e la commandString variabile presuppone un'istruzione valida SELECT con la colonna chiave primaria elencata per prima.

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

Vedi anche