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

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

Событие Описание
InfoMessage Возникает, когда из источника данных возвращается информационное сообщение. Информационные сообщения - это сообщения из источника данных, которые не приводят к формированию исключения.
StateChange Возникает при изменении состояния объекта Connection.

Работа с событием InfoMessage

При помощи события InfoMessage объекта SqlConnection можно получать предупреждения и информационные сообщения из источника данных SQL Server. Ошибки со степенью серьезности от 11 до 16, возвращаемые из источника данных, вызывают формирование исключения. Однако событие InfoMessage также можно использовать, чтобы получать сообщения из источника данных, которые не связаны с ошибками. В случае с Microsoft SQL Server любая ошибка с серьезностью 10 или меньше считается информационным сообщением, их можно отслеживать при помощи события InfoMessage. Дополнительные сведения см. в статье Степени серьезности ошибок компонента Database Engine.

Событие InfoMessage принимает объект SqlInfoMessageEventArgs, в свойстве Errors которого содержится коллекция сообщений из источника данных. У объектов Error этой коллекции можно запрашивать номер ошибки и текст сообщения, а также сведения об источнике ошибки. Поставщик данных .NET Framework для 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, которые инициировали серверную операцию, приостанавливается с формированием исключения.

Если требуется продолжить обработку остальных инструкций команды несмотря ни на какие ошибки, выдаваемые сервером, следует задать свойству FireInfoMessageEventOnUserErrors объекта SqlConnection значение true. В этом случае соединение вызовет для ошибок событие InfoMessage, а не будет формировать исключение и прерывать обработку. После этого клиентское приложение сможет обработать это событие и отреагировать на условия ошибки.

Примечание

Ошибка со степенью серьезности 17 и выше, в результате которой сервер прекращает обработку команды, должна обрабатываться как исключение. В этом случае исключение формируется независимо от того, как обрабатывается ошибка в событии InfoMessage.

Работа с событием StateChange

Событие StateChange возникает при изменении состояния объекта Connection. Событие StateChange воспринимается объектом StateChangeEventArgs, который позволяет определять состояние объекта Connection при помощи свойств OriginalState и CurrentState. Свойство OriginalState является перечислением ConnectionState, которое указывает состояние объекта Connection до его изменения. Свойство CurrentState является перечислением ConnectionState, которое указывает состояние объекта Connection после его изменения.

В следующем примере кода событие 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);  
}  

См. также