エラーとメッセージの処理
アプリケーションで ODBC 関数を呼び出すときは、ドライバが関数を実行して診断情報を 2 とおりの方法で返します。つまり、リターン コードで ODBC 関数が成功したか失敗したかを示し、診断レコードで関数の詳細な情報を伝えます。診断レコードは、ヘッダー レコードと状態レコードから構成されます。関数が成功した場合でも、少なくとも 1 つの診断レコード、つまりヘッダー レコードが返されます。
診断情報を開発時に使用すると、ハードコードした SQL ステートメントに存在する、無効なハンドルや構文エラーなどのプログラミング エラーを把握できます。実行時に使用すると、ユーザーが入力した SQL ステートメントのデータの切り捨て、規則違反、構文エラーなどの実行時エラーや警告を確認できます。一般的に、プログラミング ロジックはリターン コードを基に組み立てます。
たとえば、アプリケーションから SQLFetch を呼び出して結果セットの行を取得すると、結果セットの終端に到達したかどうか (SQL_NO_DATA)、情報メッセージが返されたかどうか (SQL_SUCCESS_WITH_INFO)、またはエラーが発生したかどうか (SQL_ERROR) がリターン コードに示されます。
SQL 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 から戻ってきたメッセージを SQL Native Client ODBC ドライバで検出すると、ODBC リターン コードが SQL_SUCCESS_WITH_INFO または SQL_ERROR に設定され、メッセージが 1 つ以上の診断レコードとして返されます。したがって、ODBC アプリケーションではリターン コードを適切に確認し、SQLGetDiagRec を呼び出してメッセージ データを取得する必要があります。