次の方法で共有


接続イベント

すべての .NET Framework データ プロバイダーには 、データ ソースから情報メッセージを取得したり、接続の状態が変更されたかどうかを判断したりするために使用できる 2 つのイベントを含む Connection オブジェクトがあります。 Connection オブジェクトのイベントを次の表に示します。

出来事 説明
情報メッセージ データ ソースから情報メッセージが返されたときに発生します。 情報メッセージはデータ ソースからのメッセージであり、例外はスローされません。
状態変更 Connection の状態が変化したときに発生します。

InfoMessage イベントの操作

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

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

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

' Assumes that connection represents a SqlConnection object.  
  AddHandler connection.InfoMessage, _  
    New SqlInfoMessageEventHandler(AddressOf OnInfoMessage)  
  
Private Shared Sub OnInfoMessage(sender As Object, _  
  args As SqlInfoMessageEventArgs)  
  Dim err As SqlError  
  For Each 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)  
  Next  
End Sub  
// Assumes that connection represents a SqlConnection object.  
  connection.InfoMessage +=
    new SqlInfoMessageEventHandler(OnInfoMessage);  
  
protected static void OnInfoMessage(  
  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);  
  }  
}  

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

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

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

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

StateChange イベントの操作

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

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

' Assumes connection represents a SqlConnection object.  
  AddHandler connection.StateChange, _  
    New StateChangeEventHandler(AddressOf OnStateChange)  
  
Protected Shared Sub OnStateChange( _  
  sender As Object, args As StateChangeEventArgs)  
  
  Console.WriteLine( _  
  "The current Connection state has changed from {0} to {1}.", _  
  args.OriginalState, args.CurrentState)  
End Sub  
// Assumes connection represents a SqlConnection object.  
  connection.StateChange  += new StateChangeEventHandler(OnStateChange);  
  
protected static void OnStateChange(object sender,
  StateChangeEventArgs args)  
{  
  Console.WriteLine(  
    "The current Connection state has changed from {0} to {1}.",  
      args.OriginalState, args.CurrentState);  
}  

こちらも参照ください