Große UDTs

Benutzerdefinierte Typen (UDTs) gestatten Entwicklern, das Skalartypsystem durch das Speichern von CLR-Objekten (Common Language Runtime) in einer SQL Server-Datenbank zu erweitern. UDTs können mehrere Elemente enthalten und Verhalten aufweisen, die sich von den herkömmlichen Aliasdatentypen unterscheiden, die aus einem einzigen SQL Server-Systemdatentyp bestehen.

Hinweis

Sie müssen .NET Framework 3.5 SP1 (oder höher) installieren, um die Vorteile der erweiterten SqlClient-Unterstützung für große UDTs nutzen zu können.

Vorher waren UDTs auf eine Dateigröße von maximal 8 Kilobyte beschränkt. In SQL Server 2008 besteht diese Beschränkung für UDTs mit dem UserDefined-Format nicht mehr.

Die vollständige Dokumentation für benutzerdefinierte Typen finden Sie unter CLR-User-Defined Typen.

Abrufen von UDT-Schemas mit 'GetSchema'

Die GetSchema-Methode von SqlConnection gibt in einer DataTableInformationen zum Datenbankschema zurück. Weitere Informationen finden Sie unter SQL Server Schemasammlungen.

'GetSchemaTable'-Spaltenwerte für UDTs

Die GetSchemaTable-Methode von SqlDataReader gibt eine DataTable zurück, die Spaltenmetadaten beschreibt. In der folgenden Tabelle werden die Unterschiede bei SQL Server 2005 und SQL Server 2008 bei den Spaltenmetadaten für große UDTs beschrieben.

Spalte SqlDataReader SQL Server 2005 SQL Server 2008 und höher
ColumnSize Varies Varies
NumericPrecision 255 255
NumericScale 255 255
DataType Byte[] UDT-Instanz
ProviderSpecificDataType SqlTypes.SqlBinary UDT-Instanz
ProviderType 21 (SqlDbType.VarBinary) 29 (SqlDbType.Udt)
NonVersionedProviderType 29 (SqlDbType.Udt) 29 (SqlDbType.Udt)
DataTypeName SqlDbType.VarBinary Der dreiteilige, als Database.SchemaName.TypeName angegebene Name.
IsLong Varies Varies

Überlegungen zu "SqlDataReader"

Der SqlDataReader wurde beginnend in SQL Server 2008 erweitert und unterstützt nun das Abrufen großer UDT-Werte. Wie große UDT-Werte von SqlDataReader verarbeitet werden, hängt von der verwendeten SQL Server-Version sowie von der in der Verbindungszeichenfolge angegebenen Type System Version ab. Weitere Informationen finden Sie unter ConnectionString.

Die folgenden Methoden von SqlDataReader geben SqlBinary anstelle eines UDT zurück, wenn Type System Version auf SQL Server 2005 festgelegt ist:

Die folgenden Methoden geben eine Array von Byte[] anstelle eines UDT zurück, wenn Type System Version auf SQL Server 2005 festgelegt ist:

Beachten Sie, dass für die aktuelle Version von ADO.NET keine Konvertierungen erfolgen.

Angeben von SqlParameters

Die folgenden SqlParameter-Eigenschaften wurden für das Arbeiten mit großen UDTs erweitert.

SqlParameter-Eigenschaft BESCHREIBUNG
Value Ruft ein Objekt ab oder legt es fest, das den Wert des Parameters darstellt. Der Standardwert ist NULL. Die Eigenschaft kann SqlBinary, Byte[] oder ein verwaltetes Objekt sein.
SqlValue Ruft ein Objekt ab oder legt es fest, das den Wert des Parameters darstellt. Der Standardwert ist NULL. Die Eigenschaft kann SqlBinary, Byte[] oder ein verwaltetes Objekt sein.
Size Ruft die Größe des aufzulösenden Parameterwerts ab oder legt sie fest. Der Standardwert ist 0. Die Eigenschaft kann eine ganze Zahl sein, die die Größe des Parameterwerts darstellt. Bei großen UDTs kann es sich um die tatsächliche Größe des UDT handeln, bei unbekannter Größe lautet der Wert -1.

Abrufen eines Datenbeispiels

Das folgende Codefragment zeigt, wie große UDT-Daten abgerufen werden können. Die Variable connectionString setzt eine gültige Verbindung mit einer SQL Server-Datenbank voraus. Die Variable commandString setzt eine gültige SELECT-Anweisung mit an erster Stelle aufgeführter Primärschlüsselspalte voraus.

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  

Weitere Informationen