Mappage de types de données (ODBC)
Le pilote ODBC SQL Server Native Client mappe les types de données SQL SQL Server aux types de données SQL ODBC. Les sections suivantes traitent des types de données SQL SQL Server et des types de données SQL ODBC auxquels ils sont mappés. Elles décrivent également les types de données SQL ODBC et leurs types de données C ODBC correspondants, ainsi que les conversions prises en charge et par défaut.
[!REMARQUE]
Le type de données SQL Servertimestamp est mappé au type de données ODBC SQL_BINARY ou SQL_VARBINARY car les valeurs dans les colonnes timestamp ne sont pas des valeurs datetime, mais des valeurs binary(8) ou varbinary(8) qui indiquent la séquence d'activité SQL Server sur la ligne. Si le pilote ODBC SQL Server Native Client rencontre une valeur SQL_C_WCHAR (Unicode) qui correspond à un nombre impair d'octets, l'octet impaire de fin est tronqué.
Traitement du type de données sql_variant dans ODBC
La colonne du type de données sql_variant peut contenir n'importe quel type de données dans SQL Server, à l'exception d'objets volumineux (LOB) tels que text, ntext et image. Par exemple, la colonne peut contenir des valeurs smallint pour certaines lignes, des valeurs float pour d'autres lignes et des valeurs char/nchar dans le reste.
Le type de données sql_variant est semblable au type de données Variant dans Microsoft Visual Basic®.
Récupération de données à partir du serveur
Le concept des types variant n'est pas présent dans ODBC, ce qui limite l'utilisation du type de données sql_variant avec un pilote ODBC dans SQL Server. Dans SQL Server, si la liaison est spécifiée, le type de données sql_variant doit être lié à l'un des types de données ODBC documentés. SQL_CA_SS_VARIANT_TYPE, un nouvel attribut spécifique au pilote ODBC SQL Server Native Client, retourne le type de données d'une instance dans la colonne sql_variant à l'utilisateur.
Si aucune liaison n'est spécifiée, la fonction SQLGetData peut être utilisée pour déterminer le type de données d'une instance dans la colonne sql_variant.
Pour récupérer des données sql_variant, procédez comme suit.
Appelez SQLFetch pour définir le positionnement à la ligne récupérée.
Appelez SQLGetData, en spécifiant SQL_C_BINARY comme type et 0 comme longueur de données. Cela force le pilote à lire l'en-tête sql_variant. L'en-tête fournit le type de données de cette instance dans la colonne sql_variant. SQLGetData retourne la taille (en octets) de la valeur.
Appelez SQLColAttribute en spécifiant SQL_CA_SS_VARIANT_TYPE en tant que sa valeur d'attribut. Cette fonction retourne le type de données C de l'instance dans la colonne sql_variant au client.
Voici un segment de code qui illustre les étapes précédentes.
while ((retcode = SQLFetch (hstmt))==SQL_SUCCESS)
{
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
SQLError (NULL, NULL, hstmt, NULL,
&lNativeError,szError,MAX_DATA,&sReturned);
printf_s ("%s\n",szError);
goto Exit;
}
retcode = SQLGetData (hstmt, 1, SQL_C_BINARY,
pBuff,0,&Indicator);//Figure out the length
if (retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_SUCCESS)
{
SQLError (NULL, NULL, hstmt, NULL, &lNativeError,
szError,MAX_DATA,&sReturned);
printf_s ("%s\n",szError);
goto Exit;
}
printf_s ("Byte length : %d ",Indicator); //Print out the byte length
int iValue = 0;
retcode = SQLColAttribute (hstmt, 1, SQL_CA_SS_VARIANT_TYPE, NULL,
NULL,NULL,&iValue); //Figure out the type
printf_s ("Sub type = %d ",iValue);//Print the type, the return is C_type of the column]
// Set up a new binding or do the SQLGetData on that column with
// the appropriate type
}
Si l'utilisateur crée la liaison à l'aide de SQLBindCol, le pilote lit les métadonnées et les données. Le pilote convertit ensuite les données en un type ODBC approprié tel que spécifié dans la liaison.
Envoi de données au serveur
SQL_SS_VARIANT, un nouveau type de données spécifique au pilote ODBC SQL Server Native Client, est utilisé pour les données envoyées à une colonne sql_variant. Lorsque vous envoyez des données au serveur à l'aide de paramètres (par exemple, INSERT INTO TableName VALUES (??)), SQLBindParameter est utilisé pour spécifier les informations de paramètre, y compris le type C et le type SQL Server correspondant. Le pilote ODBC SQL Server Native Client convertit le type de données C en un sous-type sql_variant approprié.