エラーとメッセージの処理
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
アプリケーションで ODBC 関数を呼び出すときは、ドライバーが関数を実行して診断情報を 2 とおりの方法で返します。つまり、リターン コードで ODBC 関数が成功したか失敗したかを示し、診断レコードで関数の詳細な情報を伝えます。 診断レコードは、ヘッダー レコードと状態レコードから構成されます。 関数が成功した場合でも、少なくとも 1 つの診断レコード、つまりヘッダー レコードが返されます。
診断情報を開発時に使用すると、ハードコードした SQL ステートメントに存在する、無効なハンドルや構文エラーなどのプログラミング エラーを把握できます。 実行時に使用すると、ユーザーが入力した SQL ステートメントのデータの切り捨て、規則違反、構文エラーなどの実行時エラーや警告を確認できます。 一般的に、プログラミング ロジックはリターン コードを基に組み立てます。
たとえば、アプリケーションが SQLFetch を呼び出して結果セット内の行を取得した後、リターン コードは、結果セットの末尾に達した (SQL_NO_DATA)、情報メッセージが返された (SQL_SUCCESS_WITH_INFO)、またはエラーが発生した (SQL_ERROR) かどうかを示します。
SQL Server Native Client ODBC ドライバーがSQL_SUCCESS以外のものを返す場合、アプリケーションは SQLGetDiagRec を呼び出して、情報またはエラー メッセージを取得できます。 SQLGetDiagRec を使用して、複数のメッセージがある場合にメッセージ セットを上下にスクロールします。
リターン コード SQL_INVALID_HANDLE は常にプログラミング エラーを示します。実行時にはこのコードが返されないようにしてください。 それ以外のリターン コードは実行時の情報を含んでいます。ただし、SQL_ERROR はプログラミング エラーを示す場合もあります。
元の Microsoft SQL Server ネイティブ API DB-Library for C を使用すると、アプリケーションは、エラーまたはメッセージを返すコールバック エラー処理およびメッセージ処理関数をインストールできます。 PRINT、RAISERROR、DBCC、SET などの一部の Transact-SQL ステートメントは、結果セットではなく DB-Library メッセージ ハンドラー関数に結果を返します。 しかし、ODBC API にはそのようなコールバック機能がありません。 SQL Server Native Client ODBC ドライバーは、SQL Server から返されるメッセージを検出すると、ODBC リターン コードをSQL_SUCCESS_WITH_INFOまたはSQL_ERRORに設定し、メッセージを 1 つ以上の診断レコードとして返します。 そのため、ODBC アプリケーションでは、これらのリターン コードを慎重にテストし、メッセージ データを取得するために SQLGetDiagRec を呼び出す必要があります。
エラーのトレースの詳細については、「データ アクセスのトレース」を参照してください。 SQL Server 2012 (11.x) に追加されたエラーのトレースの機能強化については、「拡張イベント ログの診断情報へのアクセス」を参照してください。