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

Область применения: .NET Framework .NET .NET Standard

Скачать ADO.NET

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

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

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

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

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