Freigeben über


Große UDTs

Herunterladen von ADO.NET

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.

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 zu benutzerdefinierten Typen finden Sie in der SQL Server-Onlinedokumentation unter Benutzerdefinierte CLR-Typen.

Abrufen von UDT-Schemas mithilfe von GetSchema

Die GetSchema-Methode von SqlConnection gibt in einer DataTableInformationen zum Datenbankschema zurück.

Werte in der Spalte GetSchemaTable 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

Aspekte bei der Spalte 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.

Beispiel des Abrufens von Daten

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  
}  

Nächste Schritte