アプリケーションでのエラーとメッセージの処理

SQL Server データベース エンジンまたは RAISERROR ステートメントにより生成されるエラーは結果セットには含まれません。エラーは、結果セットの処理とは別のエラー処理メカニズムによりアプリケーションに返されます。

各データベース アプリケーション プログラミング インターフェイス (API) には、エラーとメッセージを返すための一連の関数、インターフェイス、メソッド、オブジェクト、または構造体が用意されています。通常、各 API 関数またはメソッドでは、操作が成功したかどうかを示すステータス コードが返されます。成功以外のステータス コードが返された場合、アプリケーションでは、エラー関数、メソッド、またはオブジェクトが呼び出されエラー情報が取得されます。

データベース エンジンでは、次のいずれかの方法で呼び出し元に情報を返します。

  1. エラー

    • 重要度レベルが 11 以上の sys.messages のエラー。

    • 重要度レベルが 11 以上の RAISERROR ステートメント。

  2. メッセージ

    • PRINT ステートメントの出力。

    • 複数の DBCC ステートメントの出力。

    • 重要度レベルが 10 以下の sys.messages のエラー。

    • 重要度レベルが 10 以下の RAISERROR ステートメント。

通常、ADO (ActiveX Data Objects) や OLE DB などの API を使用するアプリケーションでは、エラーとメッセージが区別されません。ODBC (Open Database Connectivity) アプリケーションでは、メッセージの場合は関数の戻り値 SQL_SUCCESS_WITH_INFO が生成され、エラーの場合は戻り値 SQL_ERROR が生成されます。この両者の違いが最も明確になるのは DB-Library です。DB-Library では、エラーの場合はアプリケーション エラー ハンドラ関数に返され、メッセージの場合はアプリケーション メッセージ ハンドラ関数に返されます。同様に、SqlClient プロバイダの使用時に、エラーが発生すると SqlException 例外がスローされます。メッセージにより制御フローが変更されることはありませんが、InfoMessage イベント ハンドラのコールバックを登録することにより、アプリケーション コードでメッセージが表示されないようにすることができます。

次に示す他のコンポーネントによりエラーが発生することがあります。

  • OLE DB Provider for SQL Server および SQL Server ODBC ドライバにより、それぞれ独自のエラーが生成されます。これらのエラーの形式は、API 仕様で定義された形式に準拠しています。

  • Net-Library では独自のエラーが生成されます。

  • 拡張ストアド プロシージャ API では、独自の形式のエラーが生成されます。

  • SQL Server のウィザード、アプリケーション、およびユーティリティ (SQL Server Management Studio や sqlcmd ユーティリティなど) では、独自のエラーが生成されることがあります。

これらのコンポーネントのエラーは、データベース エンジンのエラーと同じ基本的なメカニズムを使用して、呼び出し元のアプリケーションに返されます。アプリケーションでは、データベース エンジンのエラーで使用されるエラー処理ロジックと同じロジックを使用して、これらのエラーを処理できます。これらのエラーはデータベース エンジンの外部で発生したものであるため、Transact-SQL TRY...CATCH 構造では処理できません。詳細については、「TRY...CATCH (Transact-SQL)」を参照してください。

ODBC のエラー処理

ODBC 仕様では、ADO や OLE DB などの汎用データベース API、および ODBC に対して作成された API (RDO、DAO (Data Access Object)、および MFC (Microsoft Foundation Class) のデータベース クラス) のエラー モデルの基礎となるエラー モデルが導入されました。この仕様は SQL Server Native Client ODBC ドライバにも適用されます。この ODBC エラー モデルでは、エラーに次の属性があります。

  • SQLSTATE

    SQLSTATE は ODBC 仕様で独自に定義された 5 文字のエラー コードです。SQLSTATE コードは、すべての ODBC ドライバに共通であり、これを使用すれば、各種のデータベースから返されるさまざまなエラー コードをすべて検査しなくてもアプリケーションで基本的なエラー処理をコード化できます。ODBC の SQLSTATE はデータベース エンジンのエラー メッセージの状態属性とは関係ありません。

    ODBC 2.x では、SQLSTATE コードが返され、ODBC 3.x では、Open Group Data Management: Structured Query Language (SQL), Version 2 の標準に準拠した SQLSTATE コードが返されます。すべての ODBC ドライバで同じ SQLSTATE コード セットが返されるので、SQLSTATE コードに基づいてエラー処理を行うアプリケーションの移植性が向上します。

  • ネイティブ エラー番号

    ネイティブ エラー番号は、基になるデータベースにより生成されるエラー番号です。ODBC アプリケーションでは、データベース エンジンのエラー番号をネイティブ エラー番号として受け取ります。

  • エラー メッセージ文字列

    エラー メッセージは、エラー メッセージ文字列パラメータに格納されて返されます。

ODBC 関数から SQL_SUCCESS 以外のステータスが返された場合、アプリケーションでは SQLGetDiagRec を呼び出してエラー情報を取得できます。たとえば、ODBC アプリケーションで構文エラー (SQL Server エラー番号 170) を受け取った場合は、SQLGetDiagRec により次のエラー情報が返されます。

szSqlState = 42000, pfNative = 170
szErrorMsg =
'[Microsoft][ODBC SQL Server Driver][SQL Server]
                                     Line 1: Incorrect syntax near *'

ODBC の SQLGetDiagField 関数を使用すると、ODBC ドライバでは、ドライバから返される診断レコード内でドライバ固有の診断フィールドを指定できます。SQL Server ODBC ドライバでは、データベース エンジンの重要度レベルおよび状態コードなどの、データベース エンジン エラー情報を格納するドライバ固有のフィールドを指定します。

ODBC アプリケーションにおけるエラー メッセージの取得の詳細については、「エラーとメッセージの処理」を参照してください。

ADO のエラー処理

ADO では Errors オブジェクトと Errors コレクションを使用して、SQLSTATE、ネイティブ エラー番号、エラー メッセージ文字列などの標準的なエラー情報が返されます。これらの情報は ODBC のエラー処理の場合と同じです。ADO ではプロバイダ固有のエラー インターフェイスがサポートされていないので、ADO アプリケーションでは、重要度レベルや状態コードなどのデータベース エンジン固有のエラー情報は使用できません。

ADO アプリケーションにおけるエラー メッセージの取得の詳細については、「エラーとメッセージの処理」を参照してください。

OLE DB のエラー処理

OLE DB では、IErrorInfo インターフェイスを使用して、SQLSTATE、ネイティブ エラー番号、エラー文字列などの標準的なエラー情報を返します。これらの情報は ODBC のエラー処理の場合と同じです。OLE DB Provider for SQL Server では、ISQLServerErrorInfo インターフェイスが定義され、重要度レベル、状態コード、プロシージャ名、行番号などのデータベース エンジン固有の情報を返します。

OLE DB アプリケーションにおけるエラー メッセージの取得の詳細については、「エラー」を参照してください。

SqlClient エラー処理

SQL Server データベース エンジンにより未処理のエラーが発生したときに、SqlClient マネージ プロバイダにより SqlException 例外がスローされます。アプリケーションでは、SqlException クラスを通じて、エラー番号、エラー メッセージ、エラーの重要度レベル、その他の例外のコンテキスト情報など、サーバー側で生成されたエラーに関する情報を取得できます。

アプリケーションでは、SqlConnection クラスで InfoMessage イベントをリッスンする SqlInfoMessageEventHandler デリゲートを作成して、SQL Server データベース エンジンにより送信された警告または情報メッセージを処理できます。例外の場合と同様に、重要度レベル、状態コードなどのメッセージ コンテキスト情報は、引数としてコールバックに渡されます。