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.

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 Byte)

"DBTYPE_UDT"

n

nicht definiert

nicht definiert

leer

DBTYPE_UDT

(Länge größer als 8.000 Byte)

"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 Byte)

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 Byte)

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 Byte)

DBTYPE_UDT

n

NULL

NULL

Leer

DB_ALL_EXCEPT_LIKE

n

DBTYPE_UDT

(Länge größer als 8.000 Byte)

DBTYPE_UDT

~0

NULL

NULL

Festgelegt

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 Byte)

DBTYPE_UDT

n

~0

~0

Leer

DBTYPE_UDT

(Länge größer als 8.000 Byte)

DBTYPE_UDT

~0

~0

~0

Festgelegt

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)

N/V

Unterstützt (5)

N/V

DBTYPE_WSTR

Unterstützt (2), (5)

N/V

Unterstützt (3), (5), (6)

N/V

DBTYPE_BSTR

Unterstützt (2), (5)

N/V

Unterstützt (3), (5)

N/V

DBTYPE_STR

Unterstützt (2), (5)

N/V

Unterstützt (3), (5)

N/V

DBTYPE_IUNKNOWN

Unterstützt (6)

N/V

Unterstützt (6)

N/V

DBTYPE_VARIANT (VT_UI1 | VT_ARRAY)

Unterstützt (5)

N/V

Unterstützt (3), (5)

N/V

DBTYPE_VARIANT (VT_BSTR)

Unterstützt (2), (5)

N/V

N/V

N/V

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 Stream 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:

  • ulParamParamSize ist ~0.

  • DBPARAMFLAGS_ISLONG ist in der DBPARAMBINDINFO-Struktur festgelegt.

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:

  • Das DBCOLUMNFLAGS_ISLONG-Flag ist auf das dwFlags-Element der DBCOLUMNINFO-Struktur festgelegt.

  • Das ulColumnSize-Element von DBCOLUMNINFO ist ~ 0.

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 Byte)

SQL Server 2000 und früher

varbinary

image

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.