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


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

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

См. также