Share via


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

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Télécharger le pilote OLE DB

Cette rubrique traite des modifications apportées au pilote OLE DB pour SQL Server pour prendre en charge les types volumineux définis par l’utilisateur du CLR (Common Language Runtime).

Pour plus d’informations sur la prise en charge d’un grand nombre d’UDT CLR dans OLE DB Driver pour SQL Server, consultez Types CLR volumineux définis par l’utilisateur. Pour un exemple, consultez Utiliser des types CLR volumineux (OLE DB).

Format de données

Le pilote OLE DB pour SQL Server utilise ~0 pour représenter la longueur des valeurs qui sont de taille illimitée pour les types volumineux. ~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 CLR DBTYPE_UDT BYTE[](tableau d'octets) 132 (oledb.h)

Les valeurs UDT sont représentées sous la forme de tableaux d'octets. Les conversions en chaînes hexadécimales de même que les conversions depuis des chaînes hexadécimales sont prises en charge. Les valeurs littérales sont représentées sous forme de 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 seul octet.

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 Types CLR 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 Types CLR 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 quand des colonnes UDT sont nécessaires :

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 Désactiver DB_ALL_EXCEPT_LIKE n
DBTYPE_UDT

(longueur supérieure à 8 000 octets)
DBTYPE_UDT ~0 NULL NULL Définissez 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 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.

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 Désactiver
DBTYPE_UDT

(longueur supérieure à 8 000 octets)
DBTYPE_UDT ~0 ~0 ~0 Définissez

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 Désactiver n
DBTYPE_UDT

(longueur supérieure à 8 000 octets)
DBTYPE_UDT Définissez 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 serveur autre que DBTYPE_UDT est spécifié avec ICommandWithParameters::SetParameterInfo et que le type d’accesseur est DBTYPE_UDT, une erreur se produit quand 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 veut traiter les données en tant que flux avec 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, OLE DB Driver pour SQL Server retournera ISequentialStream. Pour un paramètre d’entrée, OLE DB Driver pour SQL Server interroge 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 vaut ~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 ensemble de lignes ou d’un objet de commande. 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 vaut ~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 d’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 des UDT par BCP

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 UDT sont mappés aux clients de niveau inférieur de la manière suivante :

Version du client DBTYPE_UDT

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

(longueur supérieure à 8 000 octets)
SQL Server 2005 UDT varbinary(max)
SQL Server 2008 et ultérieur UDT UDT

Quand DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) est défini sur 80, les types UDT volumineux apparaissent aux clients de la même façon que pour les clients de bas niveau.

Voir aussi

Types CLR volumineux définis par l’utilisateur