接続イベントの使用

Connection オブジェクトは、データ ソースから情報メッセージを取得したり Connection 状態の変化を確認したりするために使用できる 2 つのイベントを持っています。Connection オブジェクトのイベントを次の表に示します。

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

InfoMessage

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

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

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

SqlClient

  Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;")

  AddHandler nwindConn.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
[C#]
  SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;");

  nwindConn.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);
  }
}

OleDb

  Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;")

  AddHandler nwindConn.InfoMessage, New OleDbInfoMessageEventHandler(AddressOf OnInfoMessage)


Private Shared Sub OnInfoMessage(sender As Object, args As OleDbInfoMessageEventArgs)
  Dim err As OleDbError
  For Each err In args.Errors
    Console.WriteLine("The {0} has received a SQLState {1} error number {2}:\n{3}", _
                      err.Source, err.SQLState, err.NativeError, err.Message)
  Next
End Sub
[C#]
  OleDbConnection nwindConn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind;");

  nwindConn.InfoMessage  += new OleDbInfoMessageEventHandler(OnInfoMessage);


protected static void OnInfoMessage(object sender, OleDbInfoMessageEventArgs args)
{
  foreach (OleDbError err in args.Errors)
  {
    Console.WriteLine("The {0} has received a SQLState {1} error number {2}:\n{3}",
                      err.Source, err.SQLState, err.NativeError, err.Message);
  }
}

StateChange

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

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

  AddHandler nwindConn.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
[C#]
  nwindConn.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);
}

参照

.NET Framework データ プロバイダによるデータのアクセス