Risoluzione dei problemi del driver ODBC per DB2

Windows 2000 Visualizzatore eventi può essere uno strumento utile per la risoluzione dei problemi di accesso ai dati in alcuni casi. ODBC Driver for DB2 non genera eventi. Tuttavia, quando SNA (APPC/LU 6.2) viene usato per il trasporto di rete per il driver ODBC per DB2, il SNA APPC di basso livello genera eventi sulla connessione SNA.

Il driver ODBC per DB2 fornito con Host Integration Server ha la possibilità di tracciare i flussi di dati DRDA quando vengono usati tramite TCP/IP. Questa funzionalità è accessibile dalla traccia del servizio SNADB2 all'interno dell'utilità di traccia fornita con Host Integration Server.

Questa funzionalità mostra gli stessi dati di una traccia APPC, ma senza gli indicatori di controllo (ad esempio, What_Received). Gli errori di socket vengono tracciati e i codici di errore possono essere cercati in Winsock2.h forniti con Win32 SDK.

Quando ODBC Driver for DB2 passa un codice di errore, l'origine migliore in cui cercare il significato del codice restituito è spesso il riferimento SQL o sql Messages and Codes Reference per il database SQL di destinazione. In questo caso, il database di destinazione è una delle piattaforme DB2 supportate dal driver ODBC per DB2.

ODBC Driver for DB2 gestisce una variabile integer interna denominata SQLCODE e una variabile di stringa di caratteri a 5 byte interna denominata SQLSTATE usata per controllare l'esecuzione di istruzioni SQL in DB2. SQLCODE viene impostata da DB2 dopo l'esecuzione di ogni istruzione SQL. DB2 restituisce i seguenti valori per SQLCODE:

  • Se SQLCODE = 0, l'esecuzione è stata completata.

  • Se SQLCODE > 0, l'esecuzione ha avuto esito positivo con un avviso.

  • Se SQLCODE < 0, l'esecuzione non è riuscita.

  • SQLCODE = 100 è stato trovato "nessun dato". Ad esempio, un'istruzione FETCH non restituisce dati perché il cursore è stato posizionato dopo l'ultima riga della tabella dei risultati.

    Anche SQLSTATE viene impostata da DB2 dopo l'esecuzione di ogni istruzione SQL. I programmi applicativi possono controllare l'esecuzione delle istruzioni SQL verificando SQLSTATE anziché SQLCODE. SQLSTATE fornisce ai programmi dell'applicazione codici comuni per le condizioni di errore comuni (i valori di SQLSTATE sono specifici del prodotto solo se l'errore o l'avviso è specifico del prodotto). SQLSTATE è inoltre progettata in modo da consentire ai programmi applicativi di verificare errori o classi di errori specifici.

    I valori SQLSTATE sono costituiti dal valore di un codice di classe di due caratteri, seguito dal valore di un codice di sottoclasse di tre caratteri. Il primo carattere di un valore SQLSTATE indica se l'esecuzione dell'istruzione SQL è stata completata o meno a seconda che il valore sia rispettivamente uguale a zero o diverso da zero. I valori dei codici di classe rappresentano classi di condizioni di esecuzione completata o non completata. Nella tabella seguente vengono descritti i codici di classe SQLSTATE usati da DB2.

Codice di classe Descrizione della classe di errore
00 Completamento. L'esecuzione dell'istruzione SQL ha avuto esito positivo e non ha generato alcun tipo di avviso o condizione di eccezione.
01 Avviso
02 Nessun dato
07 Errore SQL dinamico
08 Eccezione della connessione
0A La funzionalità non è supportata
0F Token non valido
21 Violazione della cardinalità
22 Eccezione dei dati
23 Violazione delle limitazioni
24 Stato del cursore non valido
25 Stato della transazione non valido
26 Identificatore dell'istruzione SQL non valido
2D Termine della transazione non valido
34 Nome di cursore non valido
39 Eccezione di chiamata di funzione esterna
40 Rollback della transazione
42 Errore di sintassi o violazione della regola di accesso
44 Violazione della clausola WITH CHECK OPTION
51 Stato dell'applicazione non valido
53 Operando non valido o specifica incoerente
54 Limite SQL o di prodotto superato
55 Oggetto non in stato prerequisito
56 Errore SQL vario o del prodotto
57 Risorsa non disponibile o intervento dell'operatore
58 Errore di sistema

Il valore SQLSTATE di HY000 viene definito come errore specifico del driver. Un SQLSTATE di 08S01 (eccezione di connessione con codice di sottoclasse S01) indica anche un errore specifico del driver. Ciò significa che SQLCODE deve essere cercato nella documentazione specifica del driver inclusa nel driver ODBC per DB2.

Se SQLSTATE non indica un errore specifico del driver quando il driver ODBC per DB2 torna a sqlstate 08S01, indica un errore di rete. Ad esempio, un codice SQLCODE di -603 è un errore specifico del driver mappato a DB2OLEDB_COMM_HOST_CONNECT_FAILED nel file di inclusione db2oledb.h fornito con il driver ODBC per DB2. Gli errori con SQLSTATE di 08S01 sono documentati nel file di inclusione db2oledb.h (valore SQLCODE) che si trova nel CD di Host Integration Server nella sottodirectory SDK\Include.

Per la ricerca di un errore sono utili i seguenti passaggi. Per iniziare, leggere il testo dell'errore fornito restituito dal driver ODBC per DB2. In alcuni casi, il testo dell'errore può fornire informazioni limitate. Ad esempio, il testo di errore di un CODICE SQL di -603 legge:

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

Il passaggio successivo consiste nella ricerca del valore SQLSTATE per determinare l'origine dell'errore, L'errore è un errore DB2, un errore del client di rete o un errore del driver ODBC? Un valore SQLSTATE pari a 08S01 viene definito come segue:

Communication link failure.  

Questa definizione è destinata a informare l'utente, l'amministratore o lo sviluppatore che l'errore è correlato al client di rete sottostante del driver ODBC.

Sfortunatamente, molti dei codici SQLSTATE restituiti dal driver ODBC per DB2 sono errori DB2 e non sono documentati nella Guida di ODBC Driver for DB2.

SQLSTATE di HY000 è definito come errore specifico del driver. SqlSTATE 08S01 indica anche un errore specifico del driver. In questo caso, è necessario cercare SQLCODE nella documentazione specifica del driver inclusa nel driver ODBC Driver for DB2.

Se SQLSTATE non indica un errore specifico del driver, è necessario cercare SQLCODE nel manuale DB2 appropriato per la piattaforma di destinazione. Ad esempio, un SQLCODE di -603 è documentato in Appendice B, "SQLCODEs e SQLSTATEs", nell'as /400 Advanced Series DB2 per AS/400 SQL Programming, versione 4, numero di documento SC41-5611-00 pubblicato da IBM. Un valore SQLCODE pari a -603 corrisponde a SQLSTATE 23515 nell'elenco codici di errore di DB2 per OS/400. Ad esempio, la spiegazione per questo SQLCODE è:

Unique index cannot be created because of duplicate keys.   

Quando le definizioni SQLSTATE e SQLCODE documentate in queste appendice creano una mancata corrispondenza con gli errori effettivi restituiti, in genere indica una condizione di errore specifica del driver.

Un passaggio finale per comprendere un errore consiste nel controllare il file db2oledb.h. Questo file non è installato dal programma di installazione per il client di integrazione host 2000, ma si trova nella cartella CD-ROM per nella cartella SDK\Include. È possibile trovare un codice SQLCODE ,ad esempio -603, eseguendo una ricerca nella colonna più a destra del file db2oledb.h per un valore vicino a 603. Ad esempio, individuare il commento "/* -600 */" e quindi contare tre righe aggiuntive al numero di riga 603. Il codice di errore interno -603 è definito come segue:

DB2OLEDB_COMM_HOST_CONNECT_FAILED.  

Questo errore specifico indica in genere un problema relativo ai parametri di configurazione o alla stringa di connessione passati.