接続イベント

適用対象: .NET Framework .NET .NET Standard

ADO.NET のダウンロード

Microsoft SqlClient Data Provider for SQL Server には、データ ソースから情報メッセージを取得したり、Connection の状態が変更されたかどうかを判断したりするために使用できる、2 つのイベントを持った Connection オブジェクトがあります。 Connection オブジェクトのイベントを次の表に示します。

イベント 説明
InfoMessage データ ソースから情報メッセージが返されたときに発生します。 情報メッセージとは、例外がスローされることのない、データ ソースが返すメッセージです。
StateChange Connection の状態が変化したときに発生します。

InfoMessage イベントを操作する

InfoMessage オブジェクトの SqlConnection イベントを使用して、SQL Server データ ソースから警告や情報メッセージを取得できます。 データ ソースから重大度レベル 11 ~ 16 のエラーが返されると、例外がスローされます。 しかし、InfoMessage イベントを使用すると、エラーに関連付けられていないデータ ソースからメッセージを取得することができます。 Microsoft SQL Server では、重大度が 10 以下のエラーは情報メッセージと見なされ、InfoMessage イベントを使用してキャプチャできます。 詳しくは、「データベース エンジン エラーの重大度」をご覧ください。

InfoMessage イベントは SqlInfoMessageEventArgs オブジェクトを受け取り、その Errors プロパティにはデータ ソースからのメッセージのコレクションが格納されています。 このコレクションの中の Error オブジェクトにエラー番号、メッセージ テキスト、エラーの原因についてクエリを実行することができます。 また、Microsoft SqlClient Data Provider for SQL Server には、メッセージの送信元のデータベース、ストアド プロシージャ、および行番号に関する詳細も含まれています。

InfoMessage イベントのイベント ハンドラーを追加する方法を次のコード サンプルに示します。

// Assumes that connection represents a SqlConnection object.
connection.InfoMessage +=
    (object sender, SqlInfoMessageEventArgs args) =>
    {
        foreach (SqlError err in args.Errors)
        {
            Console.WriteLine(
          "The {0} has received a severity {1}, state {2} error number {3}\n" +
          "on line {4} of procedure {5} on server {6}:\n{7}",
           err.Source, err.Class, err.State, err.Number, err.LineNumber,
           err.Procedure, err.Server, err.Message);
        }
    };

エラーを InfoMessage として処理する

InfoMessage イベントは通常、サーバーが情報メッセージまたは警告メッセージを送信した場合に限り発生します。 ただし、実際にエラーが発生した場合は、サーバーの操作を開始した ExecuteNonQuery メソッドまたは ExecuteReader メソッドの実行は停止され、例外がスローされます。

サーバーでエラーが発生してもコマンド内の残りのステートメントの処理を続行する場合は、FireInfoMessageEventOnUserErrorsSqlConnection プロパティを true に設定します。 このプロパティを設定すると、接続は例外をスローして処理を中断する代わりに、エラー時に InfoMessage イベントを発生させます。 クライアント アプリケーションは、このイベントを処理し、エラーに応答できます。

重大度レベルが 17 以上のエラーが発生すると、サーバーのコマンド処理が停止します。このエラーは、例外として処理する必要があります。 この場合、InfoMessage イベントによるエラー処理の方法にかかわらず例外がスローされます。

StateChange イベントを操作する

StateChange イベントは、Connection の状態が変化したときに発生します。 StateChange イベントは StateChangeEventArgs を受け取ります。これにより、OriginalState プロパティと CurrentState プロパティを使用して、Connection の状態の変化を判別できます。 OriginalState プロパティは、変更前の Connection の状態を示す ConnectionState 列挙体です。 CurrentState は、Connection の状態が変化した後の状態を示す ConnectionState 列挙型です。

StateChange イベントを使用して Connection の状態が変化したときにコンソールにメッセージを出力するコード サンプルを次に示します。

// Assumes that connection represents a SqlConnection object.
connection.StateChange +=
    (object sender, StateChangeEventArgs args) =>
    {
        Console.WriteLine(
          "The current Connection state has changed from {0} to {1}.",
            args.OriginalState, args.CurrentState);
    };