Udostępnij przez


Zdarzenia połączenia

Dotyczy: .NET Framework .NET Standard

Pobieranie ADO.NET

Dostawca danych Programu Microsoft SqlClient dla programu SQL Server ma obiekty połączenia z dwoma zdarzeniami, których można użyć do pobierania komunikatów informacyjnych ze źródła danych lub określenia, czy stan połączenia uległ zmianie. W poniższej tabeli opisano zdarzenia obiektu Connection .

Event Description
InfoMessage Występuje, gdy komunikat informacyjny jest zwracany ze źródła danych. Komunikaty informacyjne to komunikaty ze źródła danych, które nie powodują zgłoszenia wyjątku.
StateChange Występuje, gdy stan połączenia ulegnie zmianie.

Praca z wydarzeniem InfoMessage

Ostrzeżenia i komunikaty informacyjne ze źródła danych programu SQL Server można pobrać przy użyciu InfoMessage zdarzenia SqlConnection obiektu. Błędy zwracane ze źródła danych o poziomie ważności od 11 do 16 powodują zgłoszenie wyjątku. Zdarzenie InfoMessage może jednak służyć do uzyskiwania komunikatów ze źródła danych, które nie są skojarzone z błędem. W przypadku programu Microsoft SQL Server każdy błąd o ważności 10 lub mniejszej jest uznawany za komunikat informacyjny i może zostać przechwycony przy użyciu InfoMessage zdarzenia. Aby uzyskać więcej informacji, zobacz artykuł Stopnie błędów silnika bazy danych.

Zdarzenie InfoMessage otrzymuje obiekt SqlInfoMessageEventArgs, który w swojej właściwości Errors zawiera kolekcję komunikatów ze źródła danych. W tej kolekcji można wykonywać zapytania dotyczące obiektów Error dla numeru błędu, tekstu komunikatu i źródła błędu. Dostawca danych Microsoft SqlClient dla programu SQL Server zawiera również szczegółowe informacje o bazie danych, procedurze składowanej i numerze wiersza, z którego pochodzi komunikat.

Example

W poniższym przykładzie kodu pokazano, jak dodać program obsługi zdarzeń dla InfoMessage zdarzenia.

// 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);
        }
    };

Obsługa błędów jako wiadomości informacyjne

Zdarzenie InfoMessage zwykle jest uruchamiane tylko w przypadku komunikatów informacyjnych i ostrzegawczych wysyłanych z serwera. Jednak w przypadku wystąpienia rzeczywistego błędu wykonanie metody ExecuteNonQuery lub ExecuteReader , która rozpoczęła operację serwera, zostanie zatrzymana i zostanie zgłoszony wyjątek.

Jeśli chcesz kontynuować przetwarzanie pozostałych instrukcji w poleceniu niezależnie od błędów generowanych przez serwer, ustaw właściwość FireInfoMessageEventOnUserErrors elementu SqlConnection na wartość true. Ustawienie tej właściwości powoduje, że połączenie uruchamia InfoMessage zdarzenie w przypadku błędów, zamiast zgłaszać wyjątek i przerywać przetwarzanie. Aplikacja kliencka może następnie obsługiwać to zdarzenie i reagować na warunki błędu.

Uwaga / Notatka

Błąd z poziomem ważności 17 lub wyższym, który powoduje zatrzymanie przetwarzania polecenia przez serwer, musi być obsługiwany jako wyjątek. W takim przypadku zgłaszany jest wyjątek niezależnie od tego, jak błąd jest obsługiwany w zdarzeniu InfoMessage.

Praca nad zdarzeniem StateChange

Zdarzenie StateChange występuje, gdy stan połączenia ulegnie zmianie. Zdarzenie StateChange odbiera StateChangeEventArgs , które umożliwia określenie zmiany stanu połączenia przy użyciu właściwości OriginalState i CurrentState . Właściwość OriginalState to ConnectionState wyliczenie wskazujące stan połączenia przed jego zmianą. CurrentState to ConnectionState wyliczenie wskazujące stan połączenia po jego zmianie.

Poniższy przykład kodu używa zdarzenia StateChange do zapisania komunikatu w konsoli po zmianie stanu połączenia .

// 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);
    };

Zobacz także