События подключенияConnection Events

Все поставщики данных .NET Framework имеют объекты соединения с двумя событиями, которые можно использовать для получения информационных сообщений из источника данных или для определения, изменилось ли состояние соединения .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. В следующей таблице описаны события объекта Connection .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.

Работа с событием InfoMessageWorking 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.

Событие получает объект, содержащий в его свойстве Errors коллекцию сообщений из источника данных. InfoMessage SqlInfoMessageEventArgsThe InfoMessage event receives an SqlInfoMessageEventArgs object containing, in its Errors property, a collection of the messages from the data source. Вы можете запросить объекты ошибок в этой коллекции, чтобы получить номер ошибки и текст сообщения, а также источник ошибки.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 для 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);  
  }  
}  

Обработка ошибок как событий InfoMessagesHandling 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.

Если требуется продолжить обработку остальных инструкций команды несмотря ни на какие ошибки, выдаваемые сервером, следует задать свойству FireInfoMessageEventOnUserErrors объекта SqlConnection значение 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.

Работа с событием StateChangeWorking with the StateChange Event

Событие StateChange возникает при изменении состояния соединения .The StateChange event occurs when the state of a Connection changes. Событие StateChange получает StateChangeEventArgs , позволяющее определить изменение состояния соединения с помощью свойств оригиналстате и CurrentState .The StateChange event receives StateChangeEventArgs that enable you to determine the change in state of the Connection by using the OriginalState and CurrentState properties. Свойство оригиналстатеConnectionState это перечисление, которое указывает состояние соединения до его изменения.The OriginalState property is a ConnectionState enumeration that indicates the state of the Connection before it changed. CurrentStateConnectionState это перечисление, указывающее состояние соединения после его изменения.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