次の方法で共有


接続イベント

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

ADO.NET のダウンロード

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

event 説明
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 イベントを発生させます。 クライアント アプリケーションは、このイベントを処理し、エラーに応答できます。

Note

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

StateChange イベントを操作する

StateChange イベントは、Connection の状態が変化したときに発生します。 StateChange イベントは、OriginalState プロパティと CurrentState プロパティを使用して、Connection の状態の変化を判別できる StateChangeEventArgs を受け取ります。 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);
    };

関連項目