Sprache
Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Installieren Sie für den Clientzugriff auf große UDTs das Microsoft.Data.SqlClient-NuGet-Paket und importieren Sie Microsoft.Data.SqlClient. SQL CLR-Typen, die das serverseitige UDT definieren, verbleiben in Microsoft.SqlServer.Server; ersetzen Sie diese Typen nicht durch Clientanbietertypen.
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 gibt Datenbankschemainformationen im DataTable Objekt zurück. Weitere Informationen zu Schemas finden Sie unter SQL Server-Schemaauflistungen.
'GetSchemaTable'-Spaltenwerte für UDTs
Die GetSchemaTable Methode gibt Spaltenmetadaten im DataTable Objekt zurück. In der folgenden Tabelle werden die Unterschiede bei SQL Server 2005 und SQL Server 2008 bei den Spaltenmetadaten für große UDTs beschrieben.
| SqlDataReader-Spalte | SQL Server 2005 | SQL Server 2008 und höher |
|---|---|---|
ColumnSize |
Variiert | Variiert |
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 |
Variiert | Variiert |
Überlegungen zu "SqlDataReader"
Die SqlDataReader Klasse unterstützt große UDT-Werte in SQL Server 2008 und späteren Versionen. Wie der Reader diese Werte verarbeitet, hängt von der SQL Server-Version und dem Type System Version in der Verbindungszeichenfolge ab. Weitere Informationen finden Sie unter ConnectionString.
Wenn Type System Version SQL Server 2005 ist, verwenden die folgenden SqlDataReader Methoden die binäre Darstellung großer UDTs:
- GetProviderSpecificFieldType gibt das Type Objekt für SqlBinary.
- GetProviderSpecificValue und GetSqlValue geben SqlBinary-Werte zurück.
- GetProviderSpecificValues und GetSqlValues füllen das angegebene Array mit anbieterspezifischen Spaltenwerten und geben die Anzahl der aufgefüllten Elemente zurück. Große UDT-Werte in diesem Array verwenden SqlBinary.
Bei derselben Typsystemeinstellung gibt GetValue den großen UDT-Wert als Byte[] zurück.
GetValues füllt das angegebene Array mit Spaltenwerten und gibt die Anzahl der gefüllten Elemente zurück. Große UDT-Werte in diesem Array verwenden Byte[].
Beachten Sie, dass für die aktuelle Version von ADO.NET keine Konvertierungen erfolgen.
Angeben von SQLParameters
Die folgenden SqlParameter Eigenschaften unterstützen große UDTs.
| 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. |
Datenabruf-Beispiel
Das folgende Codefragment zeigt, wie große UDT-Daten abgerufen werden können. Die connectionString Variable setzt eine gültige Verbindung mit einer SQL Server-Datenbank voraus, und die commandString Variable setzt eine gültige SELECT Anweisung mit der zuerst aufgeführten Primärschlüsselspalte voraus.
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