모든 .NET Framework 데이터 공급자에는 데이터 원본에서 정보 메시지를 검색하거나 연결 상태가 변경되었는지 확인하는 데 사용할 수 있는 두 개의 이벤트가 있는 Connection 개체가 있습니다. 다음 표에서는 Connection 개체의 이벤트를 설명합니다.
이벤트 | 설명 |
---|---|
InfoMessage | 데이터 원본에서 정보 메시지를 반환할 때 발생합니다. 정보 메시지는 예외가 발생하지 않는 데이터 출처의 메시지입니다. |
상태변경 | 연결 상태가 변경되면 발생합니다. |
InfoMessage 이벤트 처리 작업
InfoMessage 개체의 SqlConnection 이벤트를 사용하여 SQL Server 데이터 원본에서 경고 및 정보 메시지를 검색할 수 있습니다. 데이터 원본에서 반환된 심각도 수준이 11부터 16까지인 오류가 발생하여 예외가 발생합니다. 그러나 InfoMessage 이 이벤트를 사용하여 오류와 연결되지 않은 데이터 원본에서 메시지를 가져올 수 있습니다. Microsoft SQL Server의 경우 심각도가 10 이하인 오류는 정보 메시지로 간주되며 이벤트를 사용하여 InfoMessage 캡처할 수 있습니다. 자세한 내용은 데이터베이스 엔진 오류 심각도 문서를 참조하세요.
이벤트는 InfoMessage 데이터 원본의 메시지 컬렉션을 포함하는 SqlInfoMessageEventArgs 해당 개체의 Errors 속성에 있습니다. 이 컬렉션의 오류 개체에서 오류 번호 및 메시지 텍스트와 오류의 원본을 쿼리할 수 있습니다. .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 메서드의 실행이 중지되고 예외가 throw됩니다.
명령의 나머지 문을 서버에서 발생한 오류와 관계없이 계속 처리하려면, FireInfoMessageEventOnUserErrors 속성을 SqlConnection로 설정합니다true
. 이렇게 하면 예외를 throw하고 처리를 중단하는 대신 오류에 대한 이벤트 InfoMessage를 트리거합니다. 그러면 클라이언트 애플리케이션이 이 이벤트를 처리하고 오류 조건에 응답할 수 있습니다.
비고
서버에서 명령 처리를 중지하도록 하는 심각도 수준이 17 이상인 오류는 예외로 처리되어야 합니다. 이 경우 InfoMessage 이벤트에서 오류가 처리되는 방식과 관계없이 예외가 발생합니다.
StateChange 이벤트 다루기
StateChange 이벤트는 연결 상태가 변경되면 발생합니다. StateChange 이벤트는 StateChangeEventArgsOriginalState 및 CurrentState 속성을 사용하여 연결 상태 변경을 확인할 수 있도록 수신합니다. OriginalState 속성은 ConnectionState 변경 전 연결의 상태를 나타내는 열거형입니다. CurrentState 는 ConnectionState연결 이 변경된 후의 상태를 나타내는 열거형입니다.
다음 코드 예제에서는 StateChange 이벤트를 사용하여 연결 상태가 변경되면 콘솔에 메시지를 씁니다.
' 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);
}