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. Odbc Driver for DB2 n’émet pas d’événements. Toutefois, lorsque SNA (APPC/LU 6.2) est utilisé pour le transport réseau du pilote ODBC pour DB2, les événements de transport SNA APPC de bas niveau 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’ils sont utilisés via 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 les messages SQL et les codes de référence 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 ODBC Driver for DB2.

ODBC Driver for 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 vérifier l’exécution des 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 a réussi, l’exécution a réussi avec un avertissement.

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

  • SQLCODE = 100, « aucune donnée » n’a été trouvée. Par exemple, une instruction FETCH n’a retourné aucune donnée, car le curseur a été 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 des programmes d’application avec des codes communs pour les conditions d’erreur courantes (les valeurs de SQLSTATE sont propres au produit uniquement si l’erreur ou l’avertissement est propre 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 Réussite. L’exécution de l’instruction SQL a réussi et n’a entraîné aucun type d’avertissement ou de condition 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. SqlSTATE de 08S01 (exception de connexion avec un code de sous-classe de S01) indique également une erreur spécifique au pilote. Cela signifie que SQLCODE doit être recherché dans la documentation spécifique au pilote incluse dans odbc Driver for DB2.

Si SQLSTATE n’indique pas d’erreur spécifique au pilote lorsque ODBC Driver for DB2 transmet un SQLSTATE de 08S01, il indique une erreur réseau. Par exemple, un CODE SQLCODE de -603 est une erreur spécifique au pilote 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 (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 odbc Driver for DB2. Dans certains cas, le texte d’erreur peut fournir des informations limitées. Par exemple, le texte d’erreur d’un CODE SQLCODE de -603 lit :

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 est-elle une erreur DB2, une erreur client réseau ou 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 odbc Driver for DB2 sont des erreurs DB2 et ne sont pas documentés dans l’aide ODBC Driver for DB2.

SQLSTATE de HY000 est défini comme une erreur spécifique au pilote. SqlSTATE de 08S01 indique également une erreur spécifique au pilote. Dans ce cas, vous devez rechercher SQLCODE dans la documentation spécifique au pilote incluse avec le pilote ODBC Driver for DB2.

Si SQLSTATE n’indique pas d’erreur spécifique au pilote, vous devez rechercher SQLCODE dans le manuel DB2 approprié pour la plateforme cible. Par exemple, un SQLCODE de -603 est documenté dans l’annexe B, « SQLCODEs et SQLSTATEs », dans la base de données AS /400 Advanced Series DB2 pour AS/400 SQL Programming, version 4, numéro de document SC41-5611-00 publié par IBM. La valeur -603 de la variable SQLCODE correspond à la valeur 23515 de la variable SQLSTATE dans la liste de codes d'erreur DB2 pour OS/400. Par exemple, l’explication de ce code SQLCODE 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, elles indiquent généralement une condition d’erreur spécifique au pilote.

Une dernière étape de compréhension d’une erreur consiste à vérifier le fichier db2oledb.h. Ce fichier n’est pas installé par le programme d’installation du client Host Integration Client 2000, mais se trouve sur le CD-ROM pour dans le dossier SDK\Include. Un CODE SQL (par exemple, -603) se trouve en recherchant la colonne la plus à droite du fichier db2oledb.h pour une valeur proche de 603. Par exemple, recherchez le commentaire « /* -600 */ », puis comptez trois lignes supplémentaires pour le numéro de ligne 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.