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 zu benutzerdefinierten Typen finden Sie in der SQL Server-Onlinedokumentation unter Benutzerdefinierte CLR-Typen.
Abrufen von UDT-Schemas mit 'GetSchema'
Die GetSchema-Methode von SqlConnection gibt in einer DataTableInformationen zum Datenbankschema zurück. Weitere Informationen zu Schemas finden Sie unter SQL Server-Schemaauflistungen.
'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:
- GetProviderSpecificFieldType
- GetProviderSpecificValue
- GetProviderSpecificValues
- GetSqlValue
- GetSqlValues
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