Résolution des problèmes du pilote ODBC pour DB2

Le observateur d'événements Windows 2000 peut être un outil utile pour résoudre les problèmes d’accès aux données dans certains cas. Le pilote ODBC pour DB2 ne émet pas d’événements. Toutefois, lorsque SNA (APPC/LU 6.2) est utilisé pour le transport réseau pour le pilote ODBC pour DB2, le transport APPC SNA de bas niveau émet des événements sur la connexion SNA.

Le pilote ODBC pour DB2 fourni avec Host Integration Server a la possibilité de suivre les flux de données DRDA lorsqu’il est utilisé sur TCP/IP. Cette fonctionnalité est accessible à partir du suivi du service SNADB2 à l’intérieur de l’utilitaire Trace fourni avec Host Integration Server.

Cette fonctionnalité affiche les mêmes données qu’une trace APPC, mais sans les indicateurs de contrôle (par exemple, What_Received). Les erreurs de socket sont tracées et les codes d’erreur peuvent être recherchés dans Winsock2.h fourni avec le Kit de développement logiciel (SDK) Win32.

Lorsque le pilote ODBC pour DB2 transmet un code d’erreur, la meilleure source dans laquelle rechercher la signification du code de retour est souvent la référence SQL ou la référence des messages et codes SQL pour la base de données SQL cible. Dans ce cas, la base de données cible est l’une des plateformes DB2 prises en charge par le pilote ODBC pour DB2.

Le pilote ODBC pour DB2 gère une variable entière interne nommée SQLCODE et une variable de chaîne de caractères de 5 octets interne nommée SQLSTATE utilisée pour case activée l’exécution d’instructions SQL sur DB2. SQLCODE est définie par DB2 après l'exécution de chaque instruction SQL. DB2 renvoie les valeurs suivantes pour SQLCODE :

  • Si SQLCODE = 0, l'instruction a été exécutée.

  • Si SQLCODE > 0, l’exécution a réussi avec un avertissement.

  • Si SQLCODE < 0, l’exécution n’a pas réussi.

  • SQLCODE = 100, « aucune donnée » n’a été trouvée. Par exemple, une instruction FETCH ne renvoyait aucune donnée, car le curseur était positionné après la dernière ligne de la table de résultats.

    SQLSTATE est également définie par DB2 après l'exécution de chaque instruction SQL. Les programmes d'application peuvent vérifier l'exécution des instructions SQL en testant SQLSTATE plutôt que SQLCODE. SQLSTATE fournit aux programmes d’application des codes courants pour les conditions d’erreur courantes (les valeurs de SQLSTATE sont spécifiques au produit uniquement si l’erreur ou l’avertissement est spécifique au produit). Par ailleurs, SQLSTATE est conçu pour permettre aux programmes d'application de rechercher les erreurs ou classes d'erreur spécifiques.

    Les valeurs SQLSTATE consistent en une valeur de code de classe à deux caractères et d'une valeur de code de sous-classe à trois caractères. Le premier caractère d'une valeur SQLSTATE indique si l'instruction SQL a été exécutée ou non (égal ou différent de zéro, respectivement). Les valeurs de code de classe représentent des classes de conditions de réussite ou d'échec de l'exécution. Le tableau suivant décrit les codes de classe SQLSTATE utilisés par DB2.

Code de classe Description de la classe d'erreur
00 Opération terminée correctement. L’exécution de l’instruction SQL a réussi et n’a entraîné aucun type de condition d’avertissement ou d’exception.
01 Avertissement
02 Pas de données
07 Erreur SQL dynamique
08 Exception de connexion
0A Fonctionnalité non prise en charge
0F Jeton non valide
21 Violation de cardinalité
22 Exception de données
23 Violation de contrainte
24 État de curseur non valide
25 État de transaction non valide
26 Identificateur d'instruction SQL non valide
2D Fin de transaction non valide
34 Nom de curseur non valide
39 Exception d'appel de fonction externe
40 Restauration de transaction
42 Erreur de syntaxe ou violation de règle d'accès
44 Violation de WITH CHECK OPTION
51 État d'application non valide
53 Opérande non valide ou spécification incohérente
54 Limite de produit ou SQL dépassée
55 L'objet n'est pas dans l'état prérequis
56 Erreur de produit ou SQL diverse
57 Ressource indisponible ou intervention de l'opérateur
58 Erreur système

La valeur SQLSTATE de HY000 est définie comme une erreur spécifique au pilote. Une valeur SQLSTATE de 08S01 (exception de connexion avec un code de sous-classe S01) indique également une erreur spécifique au pilote. Cela signifie que le CODE SQL doit être recherché dans la documentation spécifique au pilote incluse avec le pilote ODBC pour DB2.

Si SQLSTATE n’indique pas d’erreur spécifique au pilote lorsque le pilote ODBC pour DB2 renvoie une valeur SQLSTATE de 08S01, il indique une erreur réseau. Par exemple, un CODE SQL de -603 est une erreur spécifique au pilote qui est mappée à DB2OLEDB_COMM_HOST_CONNECT_FAILED dans le fichier include db2oledb.h fourni avec le pilote ODBC pour DB2. Les erreurs avec un SQLSTATE de 08S01 sont documentées dans le fichier include db2oledb.h (la valeur SQLCODE) qui se trouve sur le CD Host Integration Server dans le sous-répertoire SDK\Include.

Les étapes suivantes permettent de rechercher une erreur. Commencez par lire le texte d’erreur fourni retourné par le pilote ODBC pour DB2. Dans certains cas, le texte d’erreur peut fournir des informations limitées. Par exemple, le texte d’erreur d’un CODE SQL DE -603 indique :

Test connection failed because of an error in initializing driver.  
Could not connect to specified host.   

L'étape suivante consiste à recherche la variable SQLSTATE pour identifier la source de l'erreur. L’erreur s’agit-il d’une erreur DB2, d’une erreur de client réseau ou d’une erreur de pilote ODBC ? La valeur 08S01 pour la variable SQLSTATE est définie comme suit :

Communication link failure.  

Cette définition est destinée à informer l’utilisateur, l’administrateur ou le développeur que l’erreur est liée au client réseau sous-jacent du pilote ODBC.

Malheureusement, la plupart des codes SQLSTATE retournés par le pilote ODBC pour DB2 sont des erreurs DB2 et ne sont pas documentés dans l’aide du pilote ODBC pour DB2.

LE SQLSTATE de HY000 est défini comme une erreur spécifique au pilote. Une valeur SQLSTATE de 08S01 indique également une erreur spécifique au pilote. Dans ce cas, vous devez rechercher le CODE SQL dans la documentation spécifique au pilote incluse avec le pilote ODBC pour DB2.

Si SQLSTATE n’indique pas d’erreur spécifique au pilote, vous devez rechercher le CODE SQL dans le manuel DB2 approprié pour la plateforme cible. Par exemple, un CODE SQL de -603 est documenté dans l’Annexe B, « SQLCODEs et SQLSTATEs », dans ibm i Advanced Series DB2 for IBM i SQL Programming, version 4, numéro de document SC41-5611-00 publié par IBM. Un CODE SQL de -603 correspond à SQLSTATE 23515 dans la liste des codes d’erreur DB2 pour IBM i. Par exemple, l’explication de ce CODE SQL est la suivante :

Unique index cannot be created because of duplicate keys.   

Lorsque les définitions SQLSTATE et SQLCODE documentées dans ces annexes créent une incompatibilité avec les erreurs réelles retournées, cela indique généralement une condition d’erreur spécifique au pilote.

Une dernière étape pour comprendre une erreur consiste à case activée le fichier db2oledb.h. Ce fichier n’est pas installé par le programme d’installation de Host Integration Client 2000, mais se trouve sur le CD-ROM pour dans le dossier SDK\Include. Vous trouverez un CODE SQL (par exemple, -603) en recherchant une valeur proche de 603 dans la colonne la plus à droite du fichier db2oledb.h. Pour instance, recherchez le commentaire « /* -600 */ », puis comptez trois lignes supplémentaires à la ligne numéro 603. Le code d’erreur interne -603 est défini comme suit :

DB2OLEDB_COMM_HOST_CONNECT_FAILED.  

Cette erreur spécifique indique généralement un problème au niveau des paramètres de configuration ou de la chaîne de connexion transmise.