Partager via


Types CLR volumineux définis par l'utilisateur (OLE DB)

Cette rubrique traite des modifications apportées à OLE DB dans SQL Server Native Client pour prendre en charge les types définis par l'utilisateur (UDT) du CLR (Common Language Runtime) volumineux.

Pour plus d'informations sur la prise en charge des types UDT du CLR volumineux dans SQL Server Native Client, consultez Types CLR volumineux définis par l'utilisateur.

Format de données

SQL Server Native Client utilise ~0 pour représenter la longueur des valeurs qui sont de taille illimitée pour les types d'objets volumineux (LOB). À compter de SQL Server 2008, ~0 représente également la taille des types UDT du CLR supérieurs à 8 000 octets.

Le tableau suivant montre le mappage des types de données dans les paramètres et les ensembles de lignes :

Type de données SQL Server

Type de données OLE DB

Disposition en mémoire

Valeur

UDT du CLR

DBTYPE_UDT

BYTE[](tableau d'octets)

132 (oledb.h)

Les valeurs UDT sont représentées en tant que tableaux d'octets. Les conversions vers et à partir de chaînes hexadécimales sont prises en charge. Les valeurs littérales sont représentées en tant que chaînes hexadécimales avec le préfixe « 0x ». Une chaîne hexadécimale est la représentation textuelle de données binaires en base 16. Un exemple est une conversion du type serveur varbinary(10) en DBTYPE_STR, ce qui se traduit par une représentation hexadécimale de 20 caractères où chaque paire de caractères représente un octet unique.

Propriétés de paramètre

Le jeu de propriétés DBPROPSET_SQLSERVERPARAMETER prend en charge les types UDT via OLE DB. Pour plus d'informations, consultez Utilisation des types définis par l'utilisateur.

Propriétés de colonne

Le jeu de propriétés DBPROPSET_SQLSERVERCOLUMN prend en charge la création de tables via OLE DB. Pour plus d'informations, consultez Utilisation des types définis par l'utilisateur.

Mappage des types de données dans ITableDefinition::CreateTable

Les informations suivantes sont utilisées dans les structures DBCOLUMNDESC utilisées par ITableDefinition::CreateTable lorsque des colonnes UDT sont requises :

Type de données OLE DB (wType)

pwszTypeName

Type de données SQL Server

rgPropertySets

DBTYPE_UDT

Ignoré

UDT

Doit inclure un jeu de propriétés DBPROPSET_SQLSERVERCOLUMN.

ICommandWithParameters::GetParameterInfo

Les informations retournées dans la structure DBPARAMINFO via prgParamInfo sont les suivantes :

Type de paramètre

wType

ulParamSize

bPrecision

bScale

dwFlags DBPARAMFLAGS_ISLONG

DBTYPE_UDT

(longueur inférieure ou égale à 8 000 octets)

"DBTYPE_UDT"

n

non défini

non défini

clear

DBTYPE_UDT

(longueur supérieure à 8 000 octets)

"DBTYPE_UDT"

~0

non défini

non défini

set

ICommandWithParameters::SetParameterInfo

Les informations fournies dans la structure DBPARAMBINDINFO doivent respecter les conditions suivantes :

Type de paramètre

pwszDataSourceType

ulParamSize

bPrecision

bScale

dwFlags DBPARAMFLAGS_ISLONG

DBTYPE_UDT

(longueur inférieure ou égale à 8 000 octets)

DBTYPE_UDT

n

ignoré

ignoré

Doit être défini si le paramètre doit être passé à l'aide de DBTYPE_IUNKNOWN.

DBTYPE_UDT

(longueur supérieure à 8 000 octets)

DBTYPE_UDT

~0

ignoré

ignoré

ignoré

ISSCommandWithParameters

Les applications utilisent ISSCommandWithParameters pour obtenir et définir les propriétés de paramètre définies dans la section Propriétés du paramètre.

IColumnsRowset::GetColumnsRowset

Les colonnes retournées sont les suivantes :

Type de colonne

DBCOLUMN_TYPE

DBCOLUMN_COLUMNSIZE

DBCOLUMN_PRECISION

DBCOLUMN_SCALE

DBCOLUMN_FLAGS_ISLONG

DBCOLUMNS_ISSEARCHABLE

DBCOLUMN_OCTETLENGTH

DBTYPE_UDT

(longueur inférieure ou égale à 8 000 octets)

DBTYPE_UDT

n

NULL

NULL

Clear

DB_ALL_EXCEPT_LIKE

n

DBTYPE_UDT

(longueur supérieure à 8 000 octets)

DBTYPE_UDT

~0

NULL

NULL

Set

DB_ALL_EXCEPT_LIKE

0

Les colonnes suivantes sont également définies pour les types UDT :

Identificateur de colonne

Type

Description

DBCOLUMN_UDT_CATALOGNAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom du catalogue où le type UDT est défini.

DBCOLUMN_UDT_SCHEMANAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom du schéma où le type UDT est défini.

DBCOLUMN_UDT_NAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom en une partie du type UDT.

DBCOLUMN_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom en une partie du type UDT. Le nom complet du type d'assembly vous permet d'instancier un objet de ce type à l'aide de la méthode Type.GetType.

IColumnsInfo::GetColumnInfo

Les informations retournées dans la structure DBCOLUMNINFO sont les suivantes :

Type de paramètre

wType

ulColumnSize

bPrecision

bScale

dwFlags

DBCOLUMNFLAGS_ISLONG

DBTYPE_UDT

(longueur inférieure ou égale à 8 000 octets)

DBTYPE_UDT

n

~0

~0

Clear

DBTYPE_UDT

(longueur supérieure à 8 000 octets)

DBTYPE_UDT

~0

~0

~0

Set

Ensemble de lignes COLUMNS (ensembles de lignes de schéma)

Les valeurs de colonnes suivantes sont retournées pour les types UDT :

Type de colonne

DATA_TYPE

COLUMN_FLAGS, DBCOLUMFLAGS_ISLONG

CHARACTER_OCTET_LENGTH

DBTYPE_UDT

(longueur inférieure ou égale à 8 000 octets)

DBTYPE_UDT

Clear

n

DBTYPE_UDT

(longueur supérieure à 8 000 octets)

DBTYPE_UDT

Set

0

Les colonnes supplémentaires suivantes sont définies pour les types UDT :

Identificateur de colonne

Type

Description

SS_UDT_CATALOGNAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom du catalogue où le type UDT est défini.

SS_UDT_SCHEMANAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom du schéma où le type UDT est défini.

SS_UDT_NAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom en une partie du type UDT.

SS_ASSEMBLY_TYPENAME

DBTYPE_WSTR

Pour les colonnes UDT, il s'agit du nom de type complet du type UDT. Le nom complet du type d'assembly vous permet d'instancier un objet de ce type à l'aide de la méthode Type.GetType.

En ce qui concerne l'ensemble de lignes PROCEDURE_PARAMETERS, DATA_TYPE contient les mêmes valeurs que l'ensemble de lignes de schéma COLUMNS et TYPE_NAME contient UDT. Les mêmes colonnes supplémentaires sont également définies.

Les types définis par l'utilisateur n'apparaîtront pas dans l'ensemble de lignes de schéma PROVIDER_TYPES.

Liaisons et conversions

Type de données de liaison

UDT vers serveur

Non-UDT vers serveur

UDT à partir du serveur

Non-UDT à partir du serveur

DBTYPE_UDT

Pris en charge (5)

Erreur (1)

Pris en charge (5)

Erreur (4)

DBTYPE_BYTES

Pris en charge (5)

N/A

Pris en charge (5)

N/A

DBTYPE_WSTR

Pris en charge (2), (5)

N/A

Pris en charge (3), (5), (6)

N/A

DBTYPE_BSTR

Pris en charge (2), (5)

N/A

Pris en charge (3), (5)

N/A

DBTYPE_STR

Pris en charge (2), (5)

N/A

Pris en charge (3), (5)

N/A

DBTYPE_IUNKNOWN

Pris en charge (6)

N/A

Pris en charge (6)

N/A

DBTYPE_VARIANT (VT_UI1 | VT_ARRAY)

Pris en charge (5)

N/A

Pris en charge (3), (5)

N/A

DBTYPE_VARIANT (VT_BSTR)

Pris en charge (2), (5)

N/A

N/A

N/A

Liste des symboles

Symbole

Signification

1

Si un type de serveur autre que DBTYPE_UDT est spécifié avec ICommandWithParameters::SetParameterInfo et que le type d'accesseur est DBTYPE_UDT, une erreur se produit lorsque l'instruction est exécutée. L'erreur sera DB_E_ERRORSOCCURRED et l'état du paramètre sera DBSTATUS_E_BADACCESSOR.

Le fait de spécifier un paramètre de type UDT pour un paramètre serveur qui n'est pas un type UDT constitue une erreur.

2

Les données sont converties d'une chaîne hexadécimale en données binaires.

3

Les données sont converties données binaires en chaîne hexadécimale.

4

La validation peut se produire lors de l'utilisation de CreateAccessor ou de GetNextRows. L'erreur est DB_E_ERRORSOCCURRED. L'état de liaison a la valeur DBBINDSTATUS_UNSUPPORTEDCONVERSION.

5

BY_REF peut être utilisé.

6

Les paramètres UDT peuvent être liés en tant que DBTYPE_IUNKNOWN dans le DBBINDING. La liaison à DBTYPE_IUNKNOWN indique que l'application souhaite traiter les données en tant que flux à l'aide de l'interface ISequentialStream. Lorsqu'un consommateur spécifie wType dans une liaison en tant que type DBTYPE_IUNKNOWN, et que la colonne ou le paramètre de sortie correspondant de la procédure stockée est un type UDT, SQL Server Native Client retournera ISequentialStream. Pour un paramètre d'entrée, SQL Server Native Client recherchera l'interface ISequentialStream.

Vous pouvez choisir de ne pas lier la longueur de données UDT à l'aide de la liaison DBTYPE_IUNKNOWN en cas types UDT volumineux. Toutefois, la longueur doit être liée pour de petits types UDT. Un paramètre DBTYPE_UDT peut être spécifié en tant que type UDT volumineux si une ou plusieurs des conditions suivantes sont réunies :

  • ulParamParamSize est ~0.

  • DBPARAMFLAGS_ISLONG est défini dans le struct DBPARAMBINDINFO.

Pour les données de ligne, la liaison DBTYPE_IUNKNOWN est uniquement autorisée pour les types UDT volumineux. Vous pouvez déterminer si une colonne est un type UDT volumineux à l'aide de la méthode IColumnsInfo::GetColumnInfo sur l'interface IColumnsInfo d'un objet Rowset ou Command . Une colonne DBTYPE_UDT est une colonne UDT volumineuse si une ou plusieurs des conditions suivantes sont réunies :

  • L'indicateur DBCOLUMNFLAGS_ISLONG est défini sur le membre dwFlags de la structure DBCOLUMNINFO.

  • Le membre ulColumnSize de DBCOLUMNINFO est ~0.

DBTYPE_NULL et DBTYPE_EMPTY peuvent être liés pour des paramètres d'entrée, mais pas pour des résultats ou des paramètres de sortie. S'ils sont liés pour des paramètres d'entrée, l'état doit avoir la valeur DBSTATUS_S_ISNULL pour DBTYPE_NULL ou DBSTATUS_S_DEFAULT pour DBTYPE_EMPTY. DBTYPE_BYREF ne peut pas être utilisé avec DBTYPE_NULL ou DBTYPE_EMPTY.

DBTYPE_UDT peut également être converti en DBTYPE_EMPTY et en DBTYPE_NULL. Toutefois, DBTYPE_NULL et DBTYPE_EMPTY ne peuvent pas être convertis en DBTYPE_UDT, ce qui est cohérent avec DBTYPE_BYTES. ISSCommandWithParameters est utilisé pour traiter les types UDT en tant que paramètres.

Les conversions de données fournies par les services principaux OLE DB (IDataConvert) ne s'appliquent pas à DBTYPE_UDT.

Aucune autre liaison n'est prise en charge.

Comparabilité pour IRowsetFind

Pour les types UDT, seules les comparaisons suivantes sont prises en charge :

  • EQ

  • NE

  • IGNORE

Si une autre comparaison est tentée, DB_E_BADCOMPAREOP est retourné.

Prise en charge BCP des types UDT

Les valeurs UDT peuvent être uniquement importées et exportées en tant que valeurs de caractère ou valeurs binaires.

Comportement client de bas niveau pour les types UDT

Les types UDT sont sujets au mappage de type avec les clients de bas niveau, comme suit :

Version du client

DBTYPE_UDT

(longueur inférieure ou égale à 8 000 octets)

DBTYPE_UDT

(longueur supérieure à 8 000 octets)

SQL Server 2000 et versions antérieures

varbinary

image

SQL Server 2005

UDT

varbinary(max)

SQL Server 2008

UDT

UDT

Lorsque DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) a la valeur 80, les types UDT volumineux apparaissent aux clients de la même façon que pour les clients de bas niveau.