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


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

Применимо: платформа .NET Framework .NET Standard

Скачать ADO.NET

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

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

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

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

Событие InfoMessage принимает объект SqlInfoMessageEventArgs, в свойстве Errors которого содержится коллекция сообщений из источника данных. У объектов Error этой коллекции можно запрашивать номер ошибки, текст сообщения и сведения об источнике ошибки. Поставщик данных Microsoft SqlClient для SQL Server также включает сведения о базе данных, хранимой процедуре и номере строки, связанной с сообщением.

Пример

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

// Assumes that connection represents a SqlConnection object.
connection.InfoMessage +=
    (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 that connection represents a SqlConnection object.
connection.StateChange +=
    (object sender, StateChangeEventArgs args) =>
    {
        Console.WriteLine(
          "The current Connection state has changed from {0} to {1}.",
            args.OriginalState, args.CurrentState);
    };

См. также