接続イベントConnection Events

すべての .NET Framework データプロバイダーには、データソースから情報メッセージを取得したり、接続の状態が変更されたかどうかを確認したりするために使用できる、2つのイベントを持つ接続オブジェクトがあります。All of the .NET Framework data providers have Connection objects with two events that you can use to retrieve informational messages from a data source or to determine if the state of a Connection has changed. 次の表では、接続オブジェクトのイベントについて説明します。The following table describes the events of the Connection object.

イベントEvent 説明Description
InfoMessageInfoMessage データ ソースから情報メッセージが返されたときに発生します。Occurs when an informational message is returned from a data source. 情報メッセージはデータ ソースからのメッセージであり、例外はスローされません。Informational messages are messages from a data source that do not result in an exception being thrown.
StateChangeStateChange 接続の状態が変化したときに発生します。Occurs when the state of the Connection changes.

InfoMessage イベントの使用Working with the InfoMessage Event

InfoMessage オブジェクトの SqlConnection イベントを使用して、SQL Server データ ソースから警告や情報メッセージを取得できます。You can retrieve warnings and informational messages from a SQL Server data source using the InfoMessage event of the SqlConnection object. 重大度レベルが 11 から 16 のエラーがデータ ソースから返されると、例外がスローされます。Errors returned from the data source with a severity level of 11 through 16 cause an exception to be thrown. InfoMessage イベントを使用して、エラーに関連付けられていないメッセージをデータ ソースから取得することもできます。However, the InfoMessage event can be used to obtain messages from the data source that are not associated with an error. Microsoft SQL Server の場合は、重大度レベルが 10 以下のエラーは情報メッセージと見なされ、InfoMessage イベントでキャプチャされます。In the case of Microsoft SQL Server, any error with a severity of 10 or less is considered to be an informational message, and can be captured by using the InfoMessage event. 詳細については、データベースエンジンエラーの重大度に関する記事を参照してください。For more information, see the Database Engine Error Severities article.

イベントInfoMessageは、そのSqlInfoMessageEventArgs Errorsプロパティに、データソースからのメッセージのコレクションを含むオブジェクトを受け取ります。The InfoMessage event receives an SqlInfoMessageEventArgs object containing, in its Errors property, a collection of the messages from the data source. エラー番号とメッセージテキスト、およびエラーの原因については、このコレクション内のerrorオブジェクトに対してクエリを実行できます。You can query the Error objects in this collection for the error number and message text, as well as the source of the error. .NET Framework Data Provider for SQL Server には、データベースの詳細情報、ストアド プロシージャ、およびメッセージ送信元の行番号も含まれます。The .NET Framework Data Provider for SQL Server also includes detail about the database, stored procedure, and line number that the message came from.

Example

InfoMessage イベントのイベント ハンドラーを追加する方法を次のコード サンプルに示します。The following code example shows how to add an event handler for the InfoMessage event.

' 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 としてのエラー処理Handling Errors as InfoMessages

InfoMessage イベントは通常、サーバーが情報メッセージまたは警告メッセージを送信した場合に限り発生します。The InfoMessage event will normally fire only for informational and warning messages that are sent from the server. ただし、実際のエラーが発生すると、サーバー操作を開始したExecuteNonQueryまたはExecuteReaderメソッドの実行が停止し、例外がスローされます。However, when an actual error occurs, the execution of the ExecuteNonQuery or ExecuteReader method that initiated the server operation is halted and an exception is thrown.

サーバーでエラーが発生してもコマンド内の残りのステートメントの処理を続行する場合は、FireInfoMessageEventOnUserErrorsSqlConnection プロパティを true に設定します。If you want to continue processing the rest of the statements in a command regardless of any errors produced by the server, set the FireInfoMessageEventOnUserErrors property of the SqlConnection to true. このように設定すると、エラーが発生したとき、接続は例外をスローして処理を中断する代わりに、InfoMessage イベントを発生させます。Doing this causes the connection to fire the InfoMessage event for errors instead of throwing an exception and interrupting processing. クライアント アプリケーションは、このイベントを処理し、エラーに応答できます。The client application can then handle this event and respond to error conditions.

注意

重大度レベルが 17 以上のエラーが発生すると、サーバーのコマンド処理が停止します。このエラーは、例外として処理する必要があります。An error with a severity level of 17 or above that causes the server to stop processing the command must be handled as an exception. この場合、InfoMessage イベントによるエラー処理の方法にかかわらず例外がスローされます。In this case, an exception is thrown regardless of how the error is handled in the InfoMessage event.

StateChange イベントの使用Working with the StateChange Event

StateChangeイベントは、接続の状態が変化したときに発生します。The StateChange event occurs when the state of a Connection changes. StateChangeイベントは、 StateChangeEventArgs originalstate プロパティと設定されたプロパティを使用して、接続の状態の変化を確認できるようにを受け取ります。The StateChange event receives StateChangeEventArgs that enable you to determine the change in state of the Connection by using the OriginalState and CurrentState properties. Originalstateプロパティは、変更ConnectionState前の接続の状態を示す列挙体です。The OriginalState property is a ConnectionState enumeration that indicates the state of the Connection before it changed. "状態 " は、 変更後のConnectionState 接続の状態を示す列挙体です。CurrentState is a ConnectionState enumeration that indicates the state of the Connection after it changed.

次のコード例では、 StateChangeイベントを使用して、接続の状態が変化したときにコンソールにメッセージを書き込みます。The following code example uses the StateChange event to write a message to the console when the state of the Connection changes.

' 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);  
}  

関連項目See also