Utilisation des types définis par l'utilisateur
Les types définis par l'utilisateur (UDT) ont été introduits dans SQL Server 2005. Ils étendent le système de types SQL en vous permettant de stocker des objets et des structures de données personnalisées dans une base de données SQL Server. Les UDT peuvent contenir plusieurs types de données et avoir des comportements, ce qui les différencie des types de données d'alias traditionnels qui ne comportent qu'un seul type de données système SQL Server. Les UDT sont définis à l'aide de n'importe quel langage pris en charge par le CLR (Common Language Runtime) .NET capable de produire du code vérifiable, Cela inclut Microsoft Visual C#® et Visual Basic® .NET. Les données sont exposées en tant que champs et propriétés d'une classe ou d'une structure .NET, et les comportements sont définis par des méthodes de la classe ou de la structure.
Un UDT peut être utilisé en tant que définition de colonne d'une table, en tant que variable dans un lot Transact-SQL ou en tant qu'argument d'une fonction ou d'une procédure stockée Transact-SQL. Pour plus d'informations sur les UDT, consultez Utilisation de types CLR définis par l'utilisateur.
Fournisseur OLE DB de SQL Server Native Client
Le fournisseur OLE DB de SQL Server Native Client prend en charge les UDT en tant que types binaires avec des informations de métadonnées, ce qui vous permet de gérer les UDT en tant qu'objets. Les colonnes UDT sont exposées comme DBTYPE_UDT, et leurs métadonnées sont exposées via l'interface OLE DB IColumnRowset principale et la nouvelle interface ISSCommandWithParameters.
[!REMARQUE]
La méthode IRowsetFind::FindNextRow ne fonctionne pas avec le type de données UDT. DB_E_BADCOMPAREOP est retourné si l'UDT est utilisé comme type de colonne de recherche.
Liaisons de données et forçages de type
Le tableau suivant décrit la liaison et le forçage de type survenant lorsque vous utilisez les types de données répertoriés avec un UDT SQL Server. Les colonnes UDT sont exposées via le fournisseur OLE DB de SQL Server Native Client sous la forme DBTYPE_UDT. Vous pouvez obtenir les métadonnées par le biais des ensembles de lignes de schéma appropriés et ainsi gérer en tant qu'objets vos propres types définis.
Type de données |
Vers le serveur UDT |
Vers le serveur Non-UDT |
Depuis le serveur UDT |
Depuis le serveur Non-UDT |
---|---|---|---|---|
DBTYPE_UDT |
Pris en charge6 |
Erreur1 |
Pris en charge6 |
Erreur5 |
DBTYPE_BYTES |
Pris en charge6 |
Non applicable2 |
Pris en charge6 |
Non applicable2 |
DBTYPE_WSTR |
Pris en charge3,6 |
Non applicable2 |
Pris en charge4,6 |
Non applicable2 |
DBTYPE_BSTR |
Pris en charge3,6 |
Non applicable2 |
Pris en charge4 |
Non applicable2 |
DBTYPE_STR |
Pris en charge3,6 |
Non applicable2 |
Pris en charge4,6 |
Non applicable2 |
DBTYPE_IUNKNOWN |
Non pris en charge |
Non applicable2 |
Non pris en charge |
Non applicable2 |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) |
Pris en charge6 |
Non applicable2 |
Pris en charge4 |
Non applicable2 |
DBTYPE_VARIANT (VT_BSTR) |
Pris en charge3,6 |
Non applicable2 |
N/A |
Non applicable2 |
1Si un type serveur autre que DBTYPE_UDT est spécifié avec ICommandWithParameters::SetParameterInfo et si le type d'accesseur est DBTYPE_UDT, une erreur se produit lorsque l'instruction est exécutée (DB_E_ERRORSOCCURRED ; l'état du paramètre est DBSTATUS_E_BADACCESSOR). Sinon, les données sont envoyées au serveur, mais le serveur retourne une erreur indiquant qu'il n'existe pas de conversion implicite entre l'UDT et le type de données du paramètre.
2Non traité dans cette rubrique.
3La conversion d'une chaîne hexadécimale en données binaire est réalisée.
4La conversion de données binaires en chaîne hexadécimale est réalisée.
5La validation peut se produire au moment de la création de l'accesseur, ou au moment de l'extraction ; l'erreur est DB_E_ERRORSOCCURRED ; l'état de liaison est défini sur DBBINDSTATUS_UNSUPPORTEDCONVERSION.
6BY_REF peut être utilisé.
Les types DBTYPE_NULL et DBTYPE_EMPTY peuvent être liés pour des paramètres d'entrée mais pas pour des paramètres de résultats ou pour des sorties. S'ils sont liés pour des paramètres d'entrée, l'état doit être défini sur DBSTATUS_S_ISNULL ou DBSTATUS_S_DEFAULT.
DBTYPE_XML peut également être converti en DBTYPE_EMPTY et DBTYPE_NULL, mais DBTYPE_NULL et DBTYPE_EMPTY ne peuvent pas être converti en DBTYPE_UDT, ce qui est cohérent avec DBTYPE_BYTES.
[!REMARQUE]
Une nouvelle interface est utilisée pour traiter les UDT comme paramètres, ISSCommandWithParameters, qui hérite de ICommandWithParameters. Les applications doivent utiliser cette interface pour définir au moins le SSPROP_PARAM_UDT_NAME de la propriété DBPROPSET_SQLSERVERPARAMETER définie pour les paramètres UDT. Si cela n'est pas fait, ICommand::Execute retourne DB_E_ERRORSOCCURRED. Ce jeu d'interface et de propriété est décrit plus loin dans cette rubrique.
Si un type défini par l'utilisateur est inséré dans une colonne qui n'est pas assez grande pour contenir toutes ses données, ICommand::Execute retourne S_OK avec l'état DB_E_ERRORSOCCURRED.
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.
Ajout et modifications dans les ensembles de lignes OLE DB
SQL Server Native Client ajoute de nouvelles valeurs ou apporte des modifications à un grand nombre d'ensembles de lignes de schéma OLE DB principaux.
Ensemble de lignes de schéma PROCEDURE_PARAMETERS
Les ajouts suivants ont été effectués dans l'ensemble de lignes de schéma PROCEDURE_PARAMETERS.
Nom de colonne |
Type |
Description |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Identificateur de nom en trois parties. |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Identificateur de nom en trois parties. |
SS_UDT_NAME |
DBTYPE_WSTR |
Identificateur de nom en trois parties. |
SS_UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Le nom complet d'assembly qui inclut le nom du type et toutes les identification d'assembly nécessaires pour être référencés par le CLR. |
Ensemble de lignes de schéma SQL_ASSEMBLIES
Le fournisseur OLE DB de SQL Server Native Client expose un nouvel ensemble de lignes de schéma spécifique au fournisseur qui décrit les UDT enregistrés. Le serveur ASSEMBLY peut être spécifié en tant que DBTYPE_WSTR, mais n'est pas présent dans l'ensemble de lignes. S'il n'est pas spécifié, l'ensemble de lignes aura comme valeur par défaut le serveur actuel. L'ensemble de lignes de schéma SQL_ASSEMBLIES est défini dans le tableau suivant.
Nom de colonne |
Type |
Description |
---|---|---|
ASSEMBLY_CATALOG |
DBTYPE_WSTR |
Nom de catalogue de l'assembly qui contient le type. |
ASSEMBLY_SCHEMA |
DBTYPE_WSTR |
Nom de schéma ou de propriétaire de l'assembly qui contient le type. Bien que les assemblys aient une portée définie par base de données et non par schéma, ils conservent un propriétaire qui est indiqué ici. |
ASSEMBLY_NAME |
DBTYPE_WSTR |
Nom de l'assembly qui contient le type. |
ASSEMBLY_ID |
DBTYPE_UI4 |
ID d'objet de l'assembly qui contient le type. |
PERMISSION_SET |
DBTYPE_WSTR |
Valeur qui indique la portée d'accès de l'assembly. Les valeurs incluent SAFE, EXTERNAL_ACCESS et UNSAFE. |
ASSEMBLY_BINARY |
DBTYPE_BYTES |
Représentation binaire de l'assembly. |
Ensemble de lignes de schéma SQL_ASSEMBLIES_ DEPENDENCIES
Le fournisseur OLE DB de SQL Server Native Client expose un nouvel ensemble de lignes de schéma spécifique au fournisseur qui décrit les dépendances d'assembly d'un serveur donné. ASSEMBLY_SERVER peut être spécifié par l'appelant en tant que DBTYPE_WSTR, mais n'est pas présent dans l'ensemble de lignes. S'il n'est pas spécifié, l'ensemble de lignes aura comme valeur par défaut le serveur actuel. L'ensemble de lignes de schéma SQL_ASSEMBLY_DEPENDENCIES est défini dans le tableau suivant.
Nom de colonne |
Type |
Description |
---|---|---|
ASSEMBLY_CATALOG |
DBTYPE_WSTR |
Nom de catalogue de l'assembly qui contient le type. |
ASSEMBLY_SCHEMA |
DBTYPE_WSTR |
Nom de schéma ou de propriétaire de l'assembly qui contient le type. Bien que les assemblys aient une portée définie par base de données et non par schéma, ils conservent un propriétaire qui est indiqué ici. |
ASSEMBLY_ID |
DBTYPE_UI4 |
ID d'objet de l'assembly. |
REFERENCED_ASSEMBLY_ID |
DBTYPE_UI4 |
ID d'objet de l'assembly référencé. |
Ensemble de lignes de schéma SQL_USER_TYPES
Le fournisseur OLE DB de SQL Server Native Client expose le nouvel ensemble de lignes de schéma, SQL_USER_TYPES, qui décrit quand sont ajoutés les types définis par l'utilisateur (UDT) enregistrés pour un serveur donné. UDT_SERVER doit être spécifié en tant que DBTYPE_WSTR par l'appelant, mais n'est pas présent dans l'ensemble de lignes. L'ensemble de lignes de schéma SQL_USER_TYPES est défini dans le tableau suivant.
Nom de colonne |
Type |
Description |
---|---|---|
UDT_CATALOGNAME |
DBTYPE_WSTR |
Pour les colonnes UDT, cette propriété est une chaîne qui spécifie le nom du catalogue dans lequel le schéma UDT est défini. |
UDT_SCHEMANAME |
DBTYPE_WSTR |
Pour les colonnes UDT, cette propriété est une chaîne qui spécifie le nom du schéma où le schéma UDT est défini. |
UDT_NAME |
DBTYPE_WSTR |
Nom de l'assembly contenant la classe UDT. |
UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Le nom de type complet (AQN) inclut le nom de type précédé, le cas échéant, de l'espace de noms. |
Ensemble de lignes de schéma COLUMNS
Les colonnes suivantes ont été ajoutées à l'ensemble de lignes de schéma COLUMNS.
Nom de colonne |
Type |
Description |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Pour les colonnes UDT, cette propriété est une chaîne qui spécifie le nom du catalogue dans lequel le schéma UDT est défini. |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Pour les colonnes UDT, cette propriété est une chaîne qui spécifie le nom du schéma dans lequel le schéma UDT est défini. |
SS_UDT_NAME |
DBTYPE_WSTR |
Nom du type défini par l'utilisateur (UDT). |
SS_UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Le nom de type complet (AQN) inclut le nom de type précédé, le cas échéant, de l'espace de noms. |
Ajouts et modifications effectués dans le jeu de propriétés OLE DB
SQL Server Native Client ajoute de nouvelles valeurs ou apporte des modifications à un grand nombre de jeux de propriétés OLE DB principaux.
Jeu de propriétés DBPROPSET_SQLSERVERPARAMETER
Pour permettre la prise en charge des types définis par l'utilisateur (UDT) via OLE DB, SQL Server Native Client implémente le nouveau jeu de propriétés DBPROPSET_SQLSERVERPARAMETER qui contient les valeurs suivantes.
Nom |
Type |
Description |
---|---|---|
SSPROP_PARAM_UDT_CATALOGNAME |
DBTYPE_WSTR |
Identificateur de nom en trois parties. Pour les paramètres UDT, cette propriété est une chaîne qui spécifie le nom du catalogue dans lequel le type défini par l'utilisateur est défini. |
SSPROP_PARAM_UDT_SCHEMANAME |
DBTYPE_WSTR |
Identificateur de nom en trois parties. Pour les paramètres UDT, cette propriété est une chaîne qui spécifie le nom du schéma dans lequel le type défini par l'utilisateur est défini. |
SSPROP_PARAM_UDT_NAME |
DBTYPE_WSTR |
Identificateur de nom en trois parties. Pour les colonnes UDT, cette propriété est une chaîne qui spécifie le nom en une partie du type défini par l'utilisateur. |
SSPROP_PARAM_UDT_NAME est obligatoire. SSPROP_PARAM_UDT_CATALOGNAME et SSPROP_PARAM_UDT_SCHEMANAME sont facultatifs. Si l'une des propriétés est spécifiée de manière incorrecte, DB_E_ERRORSINCOMMAND est retourné. Si SSPROP_PARAM_UDT_CATALOGNAME et SSPROP_PARAM_UDT_SCHEMANAME ne sont pas spécifiés, le type défini par l'utilisateur (UDT) doit être défini dans la même base de données et dans le même schéma que la table. Si la définition du type défini par l'utilisateur ne se trouve pas dans le même schéma que la table (mais dans la même base de données), SSPROP_PARAM_UDT_SCHEMANAME doit être spécifié. Si la définition du type défini par l'utilisateur se trouve dans une base de données différente, SSPROP_PARAM_UDT_CATALOGNAME et SSPROP_PARAM_UDT_SCHEMANAME doivent être spécifiés.
Jeu de propriétés DBPROPSET_SQLSERVERCOLUMN
Pour permettre la prise en charge de la création de tables dans l'interface ITableDefinition, SQL Server Native Client ajoute les trois nouvelles colonnes suivantes au jeu de propriétés DBPROPSET_SQLSERVERCOLUMN.
Nom |
Description |
Type |
Description |
---|---|---|---|
SSPROP_COL_UDT_CATALOGNAME |
UDT_CATALOGNAME |
VT_BSTR |
Pour les colonnes de type DBTYPE_UDT, cette propriété est une chaîne qui spécifie le nom du catalogue dans lequel le type défini par l'utilisateur (UDT) est défini. |
SSPROP_COL_UDT_SCHEMANAME |
UDT_SCHEMANAME |
VT_BSTR |
Pour les colonnes de type DBTYPE_UDT, cette propriété est une chaîne qui spécifie le nom du schéma dans lequel le type défini par l'utilisateur (UDT) est défini. |
SSPROP_COL_UDT_NAME |
UDT_NAME |
VT_BSTR |
Pour les colonnes de type DBTYPE_UDT, cette propriété est une chaîne qui spécifie le nom en une partie du type défini par l'utilisateur (UDT). Pour les autres types de colonnes, cette propriété retourne une chaîne vide. |
[!REMARQUE]
Les types définis par l'utilisateur (UDT) n'apparaissent pas dans l'ensemble de lignes de schéma PROVIDER_TYPES. Toutes les colonnes ont un accès en lecture et écriture.
ADO fait référence à ces propriétés en utilisant l'entrée correspondante dans la colonne Description.
SSPROP_COL_UDTNAME est obligatoire. SSPROP_COL_UDT_CATALOGNAME et SSPROP_COL_UDT_SCHEMANAME sont facultatifs. Si l'une de ces propriétés est spécifiée de manière incorrecte, DB_E_ERRORSINCOMMAND est retourné.
Si ni SSPROP_COL_UDT_CATALOGNAME ni SSPROP_COL_UDT_SCHEMANAME n'est spécifié, le type défini par l'utilisateur (UDT) doit être défini dans la même base de données et dans le même schéma que la table.
Si la définition du type défini par l'utilisateur (UDT) ne se trouve pas dans le même schéma que la table (mais dans la même base de données), SSPROP_COL_UDT_SCHEMANAME doit être spécifié.
Si la définition du type défini par l'utilisateur (UDT) se trouve dans une base de données différente, SSPROP_COL_UDT_CATALOGNAME et SSPROP_COL_UDT_SCHEMANAME doivent être spécifiés.
Ajout et modifications dans l'interface OLE DB
SQL Server Native Client ajoute de nouvelles valeurs ou apporte des modifications à un grand nombre des interfaces OLE DB principales.
Interface ISSCommandWithParameters
Pour prendre en charge les types définis par l'utilisateur (UDT) via OLE DB, SQL Server Native Client implémente différentes modifications, notamment l'ajout de l'interface ISSCommandWithParameters. Cette nouvelle interface hérite de l'interface OLE DB ICommandWithParameters principale. Outre les trois méthodes héritées de ICommandWithParameters (GetParameterInfo, MapParameterNames et SetParameterInfo), ISSCommandWithParameters fournit les méthodes GetParameterProperties et SetParameterProperties employées pour la gestion des types de données spécifiques au serveur.
[!REMARQUE]
L'interface ISSCommandWithParameters exploite également la nouvelle structure SSPARAMPROPS.
Interface IColumnsRowset
Outre l'interface ISSCommandWithParameters, SQL Server Native Client ajoute également de nouvelles valeurs à l'ensemble de lignes retourné en appelant la méthode IColumnsRowset::GetColumnRowset, notamment les valeurs suivantes.
Nom de colonne |
Type |
Description |
---|---|---|
DBCOLUMN_SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Identificateur du nom de catalogue d'un type défini par l'utilisateur (UDT). |
DBCOLUMN_SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Identificateur du nom de schéma d'un type défini par l'utilisateur (UDT). |
DBCOLUMN_SS_UDT_NAME |
DBTYPE_WSTR |
Identificateur du nom d'un type défini par l'utilisateur (UDT). |
DBCOLUMN_SS_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Nom complet de l'assembly, incluant le nom du type et toutes les informations d'identification de l'assembly nécessaires pour qu'il soit référencé par le CLR. |
Vous pouvez différencier une colonne UDT de serveur d'autres types binaires lorsque DBCOLUMN_TYPE est défini sur DBTYPE_UDT en consultant les métadonnées UDT ajoutées spécifiées ci-dessus. Si ces données sont partiellement complètes, le type de serveur est un type défini par l'utilisateur (UDT). Pour les types serveur autres que des types définis par l'utilisateur (UDT), ces colonnes sont toujours retournées comme NULL.
Pilote ODBC SQL Server Native Client
Différentes modifications ont été apportées au pilote ODBC SQL Server Native Client pour prendre en charge les types définis par l'utilisateur (UDT). Le pilote ODBC SQL Server Native Client mappe le type défini par l'utilisateur SQL Server à un identificateur de type de données SQL spécifique au pilote, SQL_SS_UDT. Les colonnes UDT sont signalées en tant que SQL_SS_UDT. Si vous mappez une colonne UDT explicitement à un autre type dans une instruction SQL à l'aide des méthodes ToString ou ToXMLString du type défini par l'utilisateur ou via la fonction CAST/CONVERT, le type de la colonne dans le jeu de résultats reflète le type réel dans lequel la colonne a été convertie.
SQLColAttribute, SQLDescribeParam, SQLGetDescField
Quatre nouveaux champs de descripteur spécifiques au pilote ont été ajoutés pour fournir des informations supplémentaires pour une colonne UDT d'un jeu de résultats, ou pour un paramètre UDT d'une procédure stockée/requête paramétrable. Ces champs de descripteur sont extraits via les fonctions SQLColAttribute, SQLDescribeParam et SQLGetDescField.
Les quatre nouveaux champs de descripteur ajoutés sont SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME et SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.
SQLColumns, SQLProcedureColumns
De plus, trois nouvelles colonnes spécifiques au pilote sont ajoutées au jeu de résultats retourné par les fonctions SQLColumns et SQLProcedureColumns pour fournir des informations supplémentaires sur une colonne de jeu de résultats UDT ou sur un paramètre UDT. Ces trois nouvelles colonnes sont SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME et SS_UDT_ASSEMBLY_TYPE_NAME.
Conversions prises en charge
Lorsque vous procédez à des conversions entre des types de données SQL vers C, SQL_C_WCHAR, SQL_C_BINARY et SQL_C_CHAR peuvent tous être convertis en SQL_SS_XML. Notez toutefois que les données binaires sont converties en chaîne hexadécimale lors de la conversion depuis les types de données SQL SQL_C_WCHAR et SQL_C_CHAR.
Lorsque vous procédez à des conversions entre des types de données C vers SQL, SQL_C_WCHAR, SQL_C_BINARY et SQL_C_CHAR peuvent tous être convertis en SQL_SS_UDT. Notez toutefois que les données binaires sont converties en chaîne hexadécimale lors de la conversion depuis les types de données SQL SQL_C_WCHAR et SQL_C_CHAR.
Voir aussi