次の方法で共有


ODBC Driver for DB2 のトラブルシューティング

Windows 2000 イベント ビューアーは、場合によってはデータ アクセスのトラブルシューティングに役立つツールです。 ODBC Driver for DB2 はイベントを発行しません。 ただし、ODBC Driver for DB2 のネットワーク トランスポートに SNA (APPC/LU 6.2) が使用されている場合、低レベルの SNA APPC トランスポートは SNA 接続でイベントを発行します。

Host Integration Server に付属の ODBC Driver for DB2 には、TCP/IP 経由で使用する場合に DRDA データ フローをトレースする機能があります。 この機能は、Host Integration Server に付属しているトレース ユーティリティ内の SNADB2 サービス トレースからアクセスできます。

この機能では、APPC トレースと同じデータが表示されますが、制御インジケーター (What_Received など) は表示しません。 ソケット エラーがトレースされ、Win32 SDK で提供されている Winsock2.h でエラー コードを検索できます。

ODBC Driver for DB2 がエラー コードを渡す場合、リターン コードの意味を検索する最適なソースは、多くの場合、ターゲット SQL データベースの SQL リファレンスまたは SQL メッセージとコード リファレンスです。 この場合、ターゲット データベースは ODBC Driver for DB2 でサポートされている DB2 プラットフォームの 1 つです。

ODBC Driver for DB2 では、SQLCODE という名前の内部整数変数と、DB2 での SQL ステートメントの実行をチェックするために使用される SQLSTATE という名前の内部 5 バイト文字列変数が保持されます。 SQLCODE は、各 SQL ステートメントの実行後に DB2 によって設定されます。 DB2 は、SQLCODE に対して次の値を返します。

  • SQLCODE = 0 の場合、実行は成功しました。

  • SQLCODE > 0 の場合、警告で実行が成功しました。

  • SQLCODE < 0 の場合、実行は成功していません。

  • SQLCODE = 100、"no data" が見つかりませんでした。 たとえば、結果テーブルの最後の行の後にカーソルが置かれたため、 FETCH ステートメントはデータを返さなかったとします。

    SQLSTATE は、各 SQL ステートメントの実行後に DB2 によっても設定されます。 アプリケーション・プログラムは、SQLCODE の代わりに SQLSTATE をテストすることによって、SQL ステートメントの実行を確認できます。 SQLSTATE は、一般的なエラー条件に共通コードをアプリケーション・プログラムに提供します (SQLSTATE の値は、エラーまたは警告が製品固有の場合にのみ製品固有です)。 さらに、SQLSTATE は、アプリケーション プログラムが特定のエラーまたはエラー クラスをテストできるように設計されています。

    SQLSTATE 値は、2 文字のクラス コード値の後に 3 文字のサブクラス コード値が続きます。 SQLSTATE 値の最初の文字は、SQL ステートメントが正常に実行されたか、失敗したか (それぞれ 0 と等しいか等しくないか) を示します。 クラス コード値は、成功した実行条件と失敗した実行条件のクラスを表します。 次の表では、DB2 で使用される SQLSTATE クラス コードについて説明します。

クラス コード Error クラスの説明
00 正常に完了しました。 SQL ステートメントの実行が成功し、何らかの種類の警告または例外条件が発生しませんでした。
01 Warnung
02 データなし
07 動的 SQL エラー
08 接続の例外
0A サポートしていない機能
0F 無効なトークン
21 カーディナリティ違反
22 データ例外
23 制約違反
24 カーソル状態が無効
25 トランザクションの状態が無効です
26 SQL ステートメント識別子が無効です
2D トランザクションの終了が無効です
34 カーソル名が無効
39 外部関数呼び出しの例外
40 トランザクションのロールバック
42 構文エラーまたはアクセス規則違反
44 「WITH CHECK OPTION」違反
51 アプリケーションの状態が無効です
53 オペランドが無効か指定が一貫していません
54 SQL または製品の制限を超えました
55 前提条件の状態ではないオブジェクト
56 その他の SQL または製品エラー
57 リソースが使用できないか、オペレーターの介入
58 システム エラー

HY000 の SQLSTATE 値は、ドライバー固有のエラーとして定義されます。 08S01 の SQLSTATE (サブクラス コード S01 での接続例外) も、ドライバー固有のエラーを示します。 これは、ODBC Driver for DB2 に含まれるドライバー固有のドキュメントで SQLCODE を参照する必要があることを意味します。

ODBC Driver for DB2 が 08S01 の SQLSTATE を返すときに、SQLSTATE がドライバー固有のエラーを示さない場合は、ネットワーク エラーを示します。 たとえば、-603 の SQLCODE は、ODBC Driver for DB2 で提供される db2oledb.h インクルード ファイルのDB2OLEDB_COMM_HOST_CONNECT_FAILEDにマップされるドライバー固有のエラーです。 SQLSTATE が 08S01 のエラーは、SDK\Include サブディレクトリの Host Integration Server CD にある db2oledb.h インクルード ファイル (SQLCODE 値) に記載されています。

次の手順は、エラーの調査に役立ちます。 まず、ODBC Driver for DB2 によって返されるエラー テキストを読み取ります。 場合によっては、エラー テキストによって情報が制限される場合があります。 たとえば、-603 の SQLCODE からのエラー テキストは次のように読み取ります。

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

次の手順では、SQLSTATE を参照してエラーの原因を特定します。 エラーは DB2 エラー、ネットワーク クライアント エラー、または ODBC ドライバー エラーですか? 08S01 の SQLSTATE は次のように定義されます。

Communication link failure.  

この定義は、エラーが ODBC ドライバーの基になるネットワーク クライアントに関連していることをユーザー、管理者、または開発者に通知するためのものです。

残念ながら、ODBC Driver for DB2 によって返される SQLSTATE コードの多くは DB2 エラーであり、ODBC Driver for DB2 ヘルプには記載されていません。

HY000 の SQLSTATE は、ドライバー固有のエラーとして定義されています。 SQLSTATE 08S01 は、ドライバー固有のエラーも示します。 この場合は、ODBC Driver for DB2 に含まれているドライバー固有のドキュメントで SQLCODE を参照する必要があります。

SQLSTATE がドライバー固有のエラーを示していない場合は、ターゲット プラットフォーム用の適切な DB2 マニュアルで SQLCODE を検索する必要があります。 たとえば、IBM i SQL プログラミング用 IBM i Advanced Series DB2 バージョン 4 のドキュメント番号 SC41-5611-00 の付録 B「SQLCODEs と SQLSTATEs」に、-603 の SQLCODE が記載されています。 -603 の SQLCODE は、DB2 for IBM i エラー・コード・リストの SQLSTATE 23515 に対応します。 たとえば、この SQLCODE の説明は次のとおりです。

Unique index cannot be created because of duplicate keys.   

これらの付録に記載されている SQLSTATE 定義と SQLCODE 定義が、返される実際のエラーと一致しない場合、通常はドライバー固有のエラー状態を示します。

エラーを理解するための最後の手順は、db2oledb.h ファイルを確認することです。 このファイルは、Host Integration Client 2000 のセットアップではインストールされませんが、SDK\Include フォルダーの CD-ROM にあります。 SQLCODE (たとえば、-603) は、db2oledb.h ファイルの右端の列で 603 に近い値を検索することで見つけることができます。 たとえば、コメント "/* -600 */" を見つけて、行番号 603 までの 3 行をカウントダウンします。 内部エラー コード -603 は、次のように定義されています。

DB2OLEDB_COMM_HOST_CONNECT_FAILED.  

この特定のエラーは、通常、構成パラメーターまたは渡された接続文字列に問題があることを示します。