Поделиться через


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

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

Событие Описание
ИнформационноеСообщение Происходит, когда информационное сообщение возвращается из источника данных. Информационные сообщения — это сообщения из источника данных, которые не приводят к возникновению исключения.
Изменение состояния Происходит при изменении состояния подключения .

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

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

Событие 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);  
  }  
}  

Обработка ошибок как информационных сообщений

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

Если вы хотите продолжить обработку остальных операторов в команде независимо от любых ошибок, созданных сервером, задайте свойству объекта FireInfoMessageEventOnUserErrorsSqlConnection значение true. Это приводит к тому, что подключение вызывает событие InfoMessage при возникновении ошибок, вместо того чтобы вызывать исключение и прерывать обработку. Клиентское приложение может обрабатывать это событие и реагировать на ошибки.

Замечание

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

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

Событие StateChange возникает при изменении состояния подключения . Событие StateChange получает StateChangeEventArgs , позволяющее определить изменение состояния подключения с помощью свойств OriginalState и 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);  
}  

См. также