Große benutzerdefinierte CLR-Typen (OLE DB)
In diesem Abschnitt werden Änderungen an OLE DB in SQL Server Native Client erläutert, durch die große benutzerdefinierte Common Language Runtime-Typen (CLR-UDTs) unterstützt werden.
Weitere Informationen zur Unterstützung großer CLR-UDTs in SQL Server Native Client finden Sie unter Große benutzerdefinierte CLR-Typen. Ein Beispiel hierzu finden Sie unter Verwenden von großen CLR-UDTs (OLE DB).
Datenformat
SQL Server Native Client verwendet ~0 zur Darstellung der Länge von Werten, die für große Objekttypen (Large Object Types, LOB) keine Größenbeschränkung aufweisen. ~0 stellt auch die Größe von CLR-UDTs dar, die größer als 8.000 Byte sind.
In der folgenden Tabelle wird die Datentypzuordnung in Parametern und Rowsets dargestellt:
SQL Server-Datentyp |
OLE DB-Datentyp |
Speicherlayout |
Wert |
---|---|---|---|
CLR-UDT |
DBTYPE_UDT |
BYTE[](Bytearray) |
132 (oledb.h) |
UDT-Werte werden als Bytearrays dargestellt. Konvertierungen in und aus hexadezimalen Zeichenfolgen werden unterstützt. Literalwerte werden mit dem Präfix 0x als hexadezimale Zeichenfolgen dargestellt. Eine Hexadezimalzeichenfolge ist die Textdarstellung der Binärdaten zur Basis 16. Ein Beispiel dafür ist eine Konvertierung vom Servertyp varbinary(10) in DBTYPE_STR, die zu einer hexadezimalen Darstellung von 20 Zeichen führt, wobei jedes Zeichenpaar ein einzelnes Byte repräsentiert.
Parametereigenschaften
Der DBPROPSET_SQLSERVERPARAMETER-Eigenschaftensatz unterstützt UDTs durch OLE DB. Weitere Informationen finden Sie unter Verwenden von benutzerdefinierten Typen.
Spalteneigenschaften
Der DBPROPSET_SQLSERVERCOLUMN-Eigenschaftensatz unterstützt die Erstellung von Tabellen durch OLE DB. Weitere Informationen finden Sie unter Verwenden von benutzerdefinierten Typen.
Datentypzuordnung zu ITableDefinition::CreateTable
Die folgenden Informationen werden von ITableDefinition::CreateTable in DBCOLUMNDESC-Strukturen verwendet, wenn UDT-Spalten erforderlich sind:
OLE DB-Datentyp (wType) |
pwszTypeName |
SQL Server-Datentyp |
rgPropertySets |
---|---|---|---|
DBTYPE_UDT |
Wird ignoriert. |
UDT |
Muss einen DBPROPSET_SQLSERVERCOLUMN-Eigenschaftensatz einschließen. |
ICommandWithParameters::GetParameterInfo
Die folgenden Informationen werden in der DBPARAMINFO-Struktur durch prgParamInfo zurückgegeben:
Parametertyp |
wType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (Länge kleiner oder gleich 8.000 Bytes) |
"DBTYPE_UDT" |
n |
nicht definiert |
nicht definiert |
leer |
DBTYPE_UDT (Länge größer als 8.000 Bytes) |
"DBTYPE_UDT" |
~0 |
nicht definiert |
nicht definiert |
festgelegt |
ICommandWithParameters::SetParameterInfo
Die in der DBPARAMBINDINFO-Struktur bereitgestellten Informationen müssen Folgendem entsprechen:
Parametertyp |
pwszDataSourceType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (Länge kleiner oder gleich 8.000 Bytes) |
DBTYPE_UDT |
n |
wird ignoriert. |
wird ignoriert. |
Muss festgelegt werden, wenn der Parameter mit DBTYPE_IUNKNOWN übergeben werden soll. |
DBTYPE_UDT (Länge größer als 8.000 Bytes) |
DBTYPE_UDT |
~0 |
wird ignoriert. |
wird ignoriert. |
wird ignoriert. |
ISSCommandWithParameters
Anwendungen verwenden ISSCommandWithParameters, um die im Abschnitt Parametereigenschaften definierten Parametereigenschaften abzurufen und festzulegen.
IColumnsRowset::GetColumnsRowset
Folgende Spalten werden zurückgegeben:
Spaltentyp |
DBCOLUMN_TYPE |
DBCOLUMN_COLUMNSIZE |
DBCOLUMN_PRECISION |
DBCOLUMN_SCALE |
DBCOLUMN_FLAGS_ISLONG |
DBCOLUMNS_ISSEARCHABLE |
DBCOLUMN_OCTETLENGTH |
---|---|---|---|---|---|---|---|
DBTYPE_UDT (Länge kleiner oder gleich 8.000 Bytes) |
DBTYPE_UDT |
n |
NULL |
NULL |
Leer |
DB_ALL_EXCEPT_LIKE |
n |
DBTYPE_UDT (Länge größer als 8.000 Bytes) |
DBTYPE_UDT |
~0 |
NULL |
NULL |
Satz |
DB_ALL_EXCEPT_LIKE |
0 |
Die folgenden Spalten werden ebenfalls für UDTs definiert:
Spalten-ID |
Typ |
Beschreibung |
---|---|---|
DBCOLUMN_UDT_CATALOGNAME |
DBTYPE_WSTR |
Für UDT-Spalten der Name des Katalogs, in dem der UDT definiert ist. |
DBCOLUMN_UDT_SCHEMANAME |
DBTYPE_WSTR |
Für UDT-Spalten der Name des Schemas, in dem der UDT definiert ist. |
DBCOLUMN_UDT_NAME |
DBTYPE_WSTR |
Für UDT-Spalten der einteilige Name des UDT. |
DBCOLUMN_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Für UDT-Spalten der vollständige Typname des UDT. Mit dem vollqualifizierten Namen des Assemblytyps können Sie ein Objekt dieses Typs mit der Type.GetType-Methode instanziieren. |
IColumnsInfo::GetColumnInfo
Die in der DBCOLUMNINFO-Struktur zurückgegebenen Informationen lauten wie folgt:
Parametertyp |
wType |
ulColumnSize |
bPrecision |
bScale |
dwFlags DBCOLUMNFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (Länge kleiner oder gleich 8.000 Bytes) |
DBTYPE_UDT |
n |
~0 |
~0 |
Löschen |
DBTYPE_UDT (Länge größer als 8.000 Bytes) |
DBTYPE_UDT |
~0 |
~0 |
~0 |
Satz |
COLUMNS-Rowset (Schemarowsets)
Die folgenden Spaltenwerte werden für UDT-Typen zurückgegeben:
Spaltentyp |
DATA_TYPE |
COLUMN_FLAGS, DBCOLUMFLAGS_ISLONG |
CHARACTER_OCTET_LENGTH |
---|---|---|---|
DBTYPE_UDT (Länge kleiner oder gleich 8.000 Byte) |
DBTYPE_UDT |
Leer |
n |
DBTYPE_UDT (Länge größer als 8.000 Byte) |
DBTYPE_UDT |
Festgelegt |
0 |
Die folgenden zusätzlichen Spalten werden für UDTs definiert:
Spalten-ID |
Typ |
Beschreibung |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Für UDT-Spalten der Name des Katalogs, in dem der UDT definiert ist. |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Für UDT-Spalten der Name des Schemas, in dem der UDT definiert ist. |
SS_UDT_NAME |
DBTYPE_WSTR |
Für UDT-Spalten der einteilige Name des UDT. |
SS_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Für UDT-Spalten ist dies der vollständige Typname des UDT. Mit dem vollqualifizierten Namen des Assemblytyps können Sie ein Objekt dieses Typs mit der Type.GetType-Methode instanziieren. |
Im Hinblick auf das PROCEDURE_PARAMETERS-Rowset enthält DATA_TYPE die gleichen Werte wie das COLUMNS-Schemarowset, und TYPE_NAME enthält den UDT. Es werden die gleichen zusätzlichen Spalten definiert.
UDTs werden nicht im PROVIDER_TYPES-Schemarowset angezeigt.
Bindungen und Konvertierungen
Binding-Datentyp |
UDT zu Server |
Nicht-UDT zu Server |
UDT von Server |
Nicht-UDT von Server |
---|---|---|---|---|
DBTYPE_UDT |
Unterstützt (5) |
Fehler (1) |
Unterstützt (5) |
Fehler (4) |
DBTYPE_BYTES |
Unterstützt (5) |
Nicht zutreffend |
Unterstützt (5) |
Nicht zutreffend |
DBTYPE_WSTR |
Unterstützt (2), (5) |
Nicht zutreffend |
Unterstützt (3), (5), (6) |
Nicht zutreffend |
DBTYPE_BSTR |
Unterstützt (2), (5) |
Nicht zutreffend |
Unterstützt (3), (5) |
Nicht zutreffend |
DBTYPE_STR |
Unterstützt (2), (5) |
Nicht zutreffend |
Unterstützt (3), (5) |
Nicht zutreffend |
DBTYPE_IUNKNOWN |
Unterstützt (6) |
Nicht zutreffend |
Unterstützt (6) |
Nicht zutreffend |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) |
Unterstützt (5) |
N/V |
Unterstützt (3), (5) |
Nicht zutreffend |
DBTYPE_VARIANT (VT_BSTR) |
Unterstützt (2), (5) |
Nicht zutreffend |
Nicht zutreffend |
Nicht zutreffend |
Aufschlüsselung der Symbole
Symbol |
Bedeutung |
---|---|
1 |
Wird ein anderer Servertyp als DBTYPE_UDT mit ICommandWithParameters::SetParameterInfo angegeben, und ist der Accessortyp DBTYPE_UDT, tritt bei Ausführung der Anweisung ein Fehler auf. Der Fehler lautet DB_E_ERRORSOCCURRED, und der Parameterstatus lautet DBSTATUS_E_BADACCESSOR. Es tritt ein Fehler auf, wenn ein Parameter des Typs UDT für einen Serverparameter angegeben wird, bei dem es sich nicht um einen UDT handelt. |
2 |
Daten werden von einer hexadezimalen Zeichenfolge in binäre Daten konvertiert. |
3 |
Daten werden von binären Daten in eine hexadezimale Zeichenfolge konvertiert. |
4 |
Beim Verwenden von CreateAccessor oder GetNextRows kann eine Überprüfung stattfinden. Der Fehler lautet DB_E_ERRORSOCCURRED. Der Bindungsstatus wird auf DBBINDSTATUS_UNSUPPORTEDCONVERSION festgelegt. |
5 |
BY_REF kann verwendet werden. |
6 |
UDT-Parameter können als DBTYPE_IUNKNOWN im DBBINDING gebunden werden. Durch das Binden an DBTYPE_IUNKNOWN wird angezeigt, dass die Daten von der Anwendung mit der ISequentialStream-Schnittstelle als Datenstrom verarbeitet werden sollen. Wenn ein Consumer wType in einer Bindung als Typ DBTYPE_IUNKNOWN angibt und die entsprechende Spalte oder der Ausgabeparameter der gespeicherten Prozedur ein UDT ist, gibt SQL Server Native Client ISequentialStream zurück. Bei einem Eingabeparameter fragt SQL Server Native Client die ISequentialStream-Schnittstelle ab. Sie können auswählen, ob die Länge der UDT-Daten bei Verwendung der DBTYPE_IUNKNOWN-Bindung im Falle großer UDTs gebunden werden soll. Die Länge muss für kleine UDTs jedoch gebunden sein. Ein DBTYPE_UDT-Parameter kann als großer UDT angegeben werden, wenn mindestens eine der folgenden Bedingungen zutrifft:
Für Zeilendaten ist die DBTYPE_IUNKNOWN-Bindung nur für große UDTs zulässig. Sie können feststellen, ob es sich bei einer Spalte um einen großen UDT-Typ handelt, indem Sie die IColumnsInfo::GetColumnInfo-Methode für die IColumnsInfo-Schnittstelle eines Rowset-Objekts oder eines Command-Objekts verwenden. Eine DBTYPE_UDT-Spalte ist eine große UDT-Spalte, wenn mindestens eine der folgenden Bedingungen zutrifft:
|
DBTYPE_NULL und DBTYPE_EMPTY können für Eingabeparameter gebunden werden, jedoch nicht für Ausgabeparameter oder Ergebnisse. Ist der Status für Eingabeparameter gebunden, muss er auf DBSTATUS_S_ISNULL für DBTYPE_NUL oder DBSTATUS_S_DEFAULT für DBTYPE_EMPTY festgelegt werden. DBTYPE_BYREF kann nicht mit DBTYPE_NULL oder DBTYPE_EMPTY verwendet werden.
DBTYPE_UDT kann auch in DBTYPE_EMPTY und DBTYPE_NULL konvertiert werden. DBTYPE_NULL und DBTYPE_EMPTY können jedoch nicht in DBTYPE_UDT konvertiert werden. Dies ist mit DBTYPE_BYTES konsistent. ISSCommandWithParameters wird verwendet, um UDTs als Parameter zu verarbeiten.
Datenkonvertierungen durch OLE DB-Basisdienste (IDataConvert) sind nicht auf DBTYPE_UDT anwendbar.
Es werden keine weiteren Bindungen unterstützt.
Vergleichbarkeit für 'IrowsetFind'
Für UDT-Typen werden lediglich die folgenden Vergleiche unterstützt:
EQ
NE
IGNORE
Beim Versuch eines anderen Vergleichs wird DB_E_BADCOMPAREOP zurückgegeben.
BCP-Unterstützung für UDTs
UDT-Werte können nur als Zeichen oder Binärwerte importiert und exportiert werden.
Verhalten von Downlevelclients für UDTs
Für UDTs gilt die folgende Typzuordnung zu Downlevelclients:
Clientversion |
DBTYPE_UDT (Länge kleiner oder gleich 8.000 Byte) |
DBTYPE_UDT (Länge größer als 8.000 Bytes) |
---|---|---|
SQL Server 2005 |
UDT |
varbinary(max) |
SQL Server 2008 und höher |
UDT |
UDT |
Wenn DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) auf "80" festgelegt ist, werden UDT-Typen für Clients ebenso angezeigt wie für Downlevelclients.