Partager via


Écriture d’applications ODBC 3.x

Lorsqu’une application ODBC 2.x est mise à niveau vers ODBC 3.x, elle doit être écrite de sorte qu’elle fonctionne avec les pilotes ODBC 2.x et 3.x . L’application doit incorporer du code conditionnel pour tirer pleinement parti des fonctionnalités ODBC 3.x .

L’attribut d’environnement SQL_ATTR_ODBC_VERSION doit être défini sur SQL_OV_ODBC2. Cela garantit que le pilote se comporte comme un pilote ODBC 2.x en ce qui concerne les modifications décrites dans la section Modifications comportementales.

Si l’application utilise l’une des fonctionnalités décrites dans la section Nouvelles fonctionnalités, le code conditionnel doit être utilisé pour déterminer si le pilote est un pilote ODBC 3.x ou ODBC 2.x . L’application utilise SQLGetDiagField et SQLGetDiagRec pour obtenir des SQLSTATEs ODBC 3.x tout en effectuant un traitement des erreurs sur ces fragments de code conditionnel. Les points suivants concernant les nouvelles fonctionnalités doivent être pris en compte :

  • Une application affectée par la modification du comportement de taille de l’ensemble de lignes doit être prudent de ne pas appeler SQLFetch lorsque la taille du tableau est supérieure à 1. Ces applications doivent remplacer les appels à SQLExtendedFetch par des appels à SQLSetStmtAttr pour définir l’attribut d’instruction SQL_ATTR_ARRAY_STATUS_PTR et SQLFetchScroll, afin qu’ils disposent d’un code commun qui fonctionne avec les pilotes ODBC 3.x et ODBC 2.x . Étant donné que SQLSetStmtAttr avec SQL_ATTR_ROW_ARRAY_SIZE sera mappé à SQLSetStmtAttr avec SQL_ROWSET_SIZE pour les pilotes ODBC 2.x , les applications peuvent simplement définir SQL_ATTR_ROW_ARRAY_SIZE pour leurs opérations de récupération multirow.

  • La plupart des applications qui effectuent une mise à niveau ne sont pas réellement affectées par les modifications apportées aux codes SQLSTATE. Pour les applications affectées, elles peuvent effectuer une recherche mécanique et la remplacer dans la plupart des cas à l’aide de la table de conversion d’erreurs dans la section « Mappage SQLSTATE » pour convertir les codes d’erreur ODBC 3.x en codes ODBC 2.x . Dans la mesure où ODBC 3.x Driver Manager effectue le mappage entre ODBC 2.x SQLSTATEs et ODBC 3.x SQLSTATEs, ces enregistreurs d’applications n’ont besoin que de case activée pour les SQLSTATEs ODBC 3.x et ne s’inquiètent pas de l’inclusion d’ODBC 2.x SQLSTATEs dans le code conditionnel.

  • Si une application utilise très bien les types de données date, heure et timestamp, l’application peut se déclarer comme une application ODBC 2.x et utiliser son code existant au lieu d’utiliser du code de conditionnement.

La mise à niveau doit également inclure les étapes suivantes :

  • Appelez SQLSetEnvAttr avant d’allouer une connexion pour définir l’attribut d’environnement SQL_ATTR_ODBC_VERSION sur SQL_OV_ODBC2.

  • Remplacez tous les appels à SQLAllocEnv, SQLAlloc Connecter ou SQLAllocStmt par des appels à SQLAllocHandle par l’argument HandleType approprié de SQL_HANDLE_ENV, de SQL_HANDLE_DBC ou de SQL_HANDLE_STMT.

  • Remplacez tous les appels à SQLFreeEnv ou SQLFree Connecter par des appels à SQLFreeHandle par l’argument HandleType approprié de SQL_HANDLE_DBC ou de SQL_HANDLE_STMT.

  • Remplacez tous les appels à SQLSet Connecter Option par des appels à SQLSet Connecter Attr. Si vous définissez un attribut dont la valeur est une chaîne, définissez l’argument StringLength de manière appropriée. Remplacez l’argument Attribut de SQL_XXXX par SQL_ATTR_XXXX.

  • Remplacez tous les appels à SQLGet Connecter Option par des appels à SQLGet Connecter Attr. Si vous obtenez une chaîne ou un attribut binaire, définissez BufferLength sur la valeur appropriée et transmettez un argument StringLength . Remplacez l’argument Attribut de SQL_XXXX par SQL_ATTR_XXXX.

  • Remplacez tous les appels à SQLSetStmtOption par des appels à SQLSetStmtAttr. Si vous définissez un attribut dont la valeur est une chaîne, définissez l’argument StringLength de manière appropriée. Remplacez l’argument Attribut de SQL_XXXX par SQL_ATTR_XXXX.

  • Remplacez tous les appels à SQLGetStmtOption par des appels à SQLGetStmtAttr. Si vous obtenez une chaîne ou un attribut binaire, définissez BufferLength sur la valeur appropriée et transmettez un argument StringLength . Remplacez l’argument Attribut de SQL_XXXX par SQL_ATTR_XXXX.

  • Remplacez tous les appels à SQLTransact par des appels à SQLEndTran. Si le handle valide le plus à droite de l’appel SQLTransact est un handle d’environnement, un argument HandleType de SQL_HANDLE_ENV doit être utilisé dans l’appel SQLEndTran avec l’argument Handle approprié. Si le handle valide le plus à droite de votre appel SQLTransact est un handle de connexion, un argument HandleType de SQL_HANDLE_DBC doit être utilisé dans l’appel SQLEndTran avec l’argument Handle approprié.

  • Remplacez tous les appels à SQLColAttributes par des appels à SQLColAttribute. Si l’argument FieldIdentifier est SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE ou SQL_COLUMN_LENGTH, ne modifiez rien d’autre que le nom de la fonction. Si ce n’est pas le cas, remplacez FieldIdentifier de SQL_COLUMN_XXXX par SQL_DESC_XXXX. Si FieldIdentifier est SQL_DESC_CONCISE_TYPE et que le type de données est un type de données datetime, remplacez le type de données ODBC 3.x correspondant.

  • Si vous utilisez des curseurs de bloc, des curseurs défilants ou les deux, l’application effectue les opérations suivantes :

    • Définit la taille de l’ensemble de lignes, le type de curseur et la concurrence de curseur à l’aide de SQLSetStmtAttr.

    • Appelle SQLSetStmtAttr pour définir SQL_ATTR_ROW_STATUS_PTR pour pointer vers un tableau d’enregistrements d’état.

    • Appelle SQLSetStmtAttr pour définir SQL_ATTR_ROWS_FETCHED_PTR pour pointer vers un SQLINTEGER.

    • Exécute les liaisons requises et exécute l’instruction SQL.

    • Appelle SQLFetchScroll dans une boucle pour extraire des lignes et se déplacer dans le jeu de résultats.

    • Si elle souhaite extraire par signet, l’application appelle SQLSetStmtAttr pour définir SQL_ATTR_FETCH_BOOKMARK_PTR sur une variable qui contiendra le signet de la ligne qu’elle souhaite récupérer, puis appelle SQLFetchScroll avec un argument FetchOrientation de SQL_FETCH_BOOKMARK.

  • Si vous utilisez des tableaux de paramètres, l’application effectue les opérations suivantes :

    • Appelle SQLSetStmtAttr pour définir l’attribut SQL_ATTR_PARAMSET_SIZE sur la taille du tableau de paramètres.

    • Appelle SQLSetStmtAttr pour définir SQL_ATTR_ROWS_PROCESSED_PTR pour pointer vers une variable UDWORD interne.

    • Effectue les opérations de préparation, de liaison et d’exécution appropriées.

    • Si l’exécution s’arrête pour une raison quelconque (par exemple, SQL_NEED_DATA), elle peut trouver la ligne « actuelle » des paramètres en inspectant l’emplacement vers lequel pointe SQL_ATTR_ROWS_PROCESSED_PTR.

Cette section contient les rubriques suivantes :