Udostępnij przez


Obsługiwać zdarzenia DataAdapter

Dotyczy: .NET Framework .NET Standard

Pobieranie ADO.NET

Dostawca danych Microsoft SqlClient dla programu SQL Server SqlDataAdapter uwidacznia trzy zdarzenia, których można użyć do reagowania na zmiany wprowadzone w danych w źródle danych. W poniższej DataAdapter tabeli przedstawiono zdarzenia.

Event Description
RowUpdating Operacja UPDATE, INSERT lub DELETE w wierszu (przez wywołanie jednej z Update metod) ma się rozpocząć.
RowUpdated Operacja UPDATE, INSERT lub DELETE w wierszu (przez wywołanie jednej z Update metod) została ukończona.
FillError Wystąpił błąd podczas Fill operacji.

Zdarzenia RowUpdating i RowUpdated

RowUpdating jest wywoływany przed przetworzeniem jakiejkolwiek aktualizacji wiersza z DataSet w źródle danych. RowUpdated jest wywoływany po przetworzeniu każdej aktualizacji wiersza z DataSet w źródle danych. W związku z tym można użyć RowUpdating do zmiany zachowania aktualizacji przed jej wystąpieniem, aby zapewnić dodatkową obsługę, gdy aktualizacja wystąpi, zachować odwołanie do zaktualizowanego wiersza, anulować bieżącą aktualizację i zaplanować jej przetworzenie w trybie wsadowym, i tak dalej. RowUpdated jest przydatny w przypadku reagowania na błędy i wyjątki występujące podczas aktualizacji. Możesz dodać informacje o błędzieDataSetdo elementu , a także logikę ponawiania prób itd.

Argumenty RowUpdatingEventArgs i RowUpdatedEventArgs przekazywane do zdarzeń RowUpdating i RowUpdated obejmują następujące: właściwość Command odwołującą się do obiektu używanego do przeprowadzenia aktualizacji; właściwość Row odwołującą się do obiektu, który zawiera zaktualizowane informacje; właściwość StatementType określającą typ aktualizacji, który jest realizowany; TableMapping, jeśli dotyczy; i Status operacji.

Za pomocą Status właściwości można określić, czy wystąpił błąd podczas operacji, a w razie potrzeby można kontrolować akcje względem bieżących i wynikowych wierszy. Gdy wystąpi zdarzenie, właściwość Status jest równa albo Continue, albo ErrorsOccurred. W poniższej tabeli przedstawiono wartości, dla których można ustawić Status właściwość w celu kontrolowania późniejszych akcji podczas aktualizacji.

Status Description
Continue Kontynuuj operację aktualizacji.
ErrorsOccurred Przerwanie operacji aktualizacji i zgłoszenie wyjątku.
SkipCurrentRow Ignoruj bieżący wiersz i kontynuuj operację aktualizacji.
SkipAllRemainingRows Przerwij operację aktualizacji, ale nie zgłaszaj wyjątku.

Ustawienie właściwości Status na ErrorsOccurred powoduje zgłoszenie wyjątku. Możesz kontrolować, który wyjątek jest zgłaszany, ustawiając Errors właściwość na żądany wyjątek. Użycie jednej z pozostałych wartości dla Status zapobiega zgłoszeniu wyjątku.

Za pomocą ContinueUpdateOnError właściwości można również obsługiwać błędy dla zaktualizowanych wierszy. Jeśli DataAdapter.ContinueUpdateOnError jest true, gdy aktualizacja wiersza prowadzi do zgłoszenia wyjątku, tekst wyjątku zostanie umieszczony w RowError informacjach o danym wierszu, a przetwarzanie będzie kontynuowane bez zgłaszania wyjątku. Dzięki temu można reagować na błędy, gdy Update jest zakończone, w przeciwieństwie do zdarzenia RowUpdated, które umożliwia reagowanie na błędy, gdy napotkasz błąd.

Poniższy przykładowy kod pokazuje, jak dodawać i usuwać programy obsługi zdarzeń. Program RowUpdating obsługi zdarzeń zapisuje dziennik wszystkich usuniętych rekordów z sygnaturą czasową. Procedura RowUpdated obsługi zdarzeń dodaje informacje o błędzie do właściwości obiektu wiersza DataSet, pomija wyjątek i kontynuuje przetwarzanie (odzwierciedla zachowanie elementu ContinueUpdateOnError = true).

static DataSet DataAdapterEventsDemo(SqlConnection connection, DataSet custDS)
{
    // Assumes that connection is a valid SqlConnection object 
    // and custDS includes the Customers table.
    SqlDataAdapter custAdapter = new SqlDataAdapter(
        "SELECT CustomerID, CompanyName FROM Customers", connection);

    // Add handlers.  
    custAdapter.RowUpdating += new SqlRowUpdatingEventHandler(OnRowUpdating);
    custAdapter.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated);

    // Set DataAdapter command properties, fill DataSet, modify DataSet.  
    custAdapter.Update(custDS, "Customers");

    // Remove handlers.  
    custAdapter.RowUpdating -= new SqlRowUpdatingEventHandler(OnRowUpdating);
    custAdapter.RowUpdated -= new SqlRowUpdatedEventHandler(OnRowUpdated);

    return custDS;
}

protected static void OnRowUpdating(object sender, SqlRowUpdatingEventArgs args)
{
    if (args.StatementType == StatementType.Delete)
    {
        // Saves the removing rows with additional information in a file.
        System.IO.TextWriter tw = System.IO.File.AppendText("Deletes.log");
        tw.WriteLine(
          "{0}: Customer {1} Deleted.", DateTime.Now,
           args.Row["CustomerID", DataRowVersion.Original]);
        tw.Close();
    }
}

protected static void OnRowUpdated(object sender, SqlRowUpdatedEventArgs args)
{
    if (args.Status == UpdateStatus.ErrorsOccurred)
    {
        // Adds the error message to the row and skips from it.
        args.Row.RowError = args.Errors.Message;
        args.Status = UpdateStatus.SkipCurrentRow;
    }
}

Zdarzenie FillError

DataAdapter emituje zdarzenie FillError w przypadku wystąpienia błędu podczas operacji Fill. Ten typ błędu występuje często, gdy nie można przekonwertować danych w wierszu, który jest dodawany, na typ .NET bez utraty precyzji.

Jeśli podczas Fill operacji wystąpi błąd, bieżący wiersz nie zostanie dodany do elementu DataTable. Zdarzenie FillError umożliwia rozwiązanie błędu i dodanie wiersza lub zignorowanie wykluczonego wiersza i kontynuowanie Fill operacji.

Przekazany FillErrorEventArgs do FillError zdarzenia może zawierać kilka właściwości, które umożliwiają reagowanie na błędy i ich rozwiązywanie. W poniższej tabeli przedstawiono właściwości FillErrorEventArgs obiektu.

Majątek Description
Errors To zdarzenie Exception miało miejsce.
DataTable Obiekt DataTable wypełniany po wystąpieniu błędu.
Values Tablica obiektów, która zawiera wartości wiersza dodawanego podczas wystąpienia błędu. Odwołania porządkowe elementów tablicy Values odpowiadają porządkowym odwołaniom kolumn w wierszu, który jest dodawany. Na przykład Values[0] to wartość, która została dodana jako pierwsza kolumna wiersza.
Continue Umożliwia wybranie, czy zgłosić wyjątek, czy nie. Ustawienie właściwości Continue na wartość false spowoduje zatrzymanie bieżącej operacji Fill i zgłoszenie wyjątku. Ustawienie Continue na true kontynuuje operację Fill mimo błędu.

Poniższy przykład kodu dodaje procedurę obsługi zdarzeń dla FillError zdarzenia DataAdapter. FillError W kodzie zdarzenia przykład określa, czy istnieje możliwość utraty precyzji, zapewniając możliwość reagowania na wyjątek.

static DataSet DataAdapterFillAndError(SqlDataAdapter adapter)
{
    // Assuemes adapter is a valid SqlDataAdapter object.
    adapter.FillError += new FillErrorEventHandler(FillError);

    DataSet dataSet = new DataSet();
    adapter.Fill(dataSet);
    return dataSet;
}

protected static void FillError(object sender, FillErrorEventArgs args)
{
    if (args.Errors.GetType() == typeof(System.OverflowException))
    {
        // Code to handle precision loss.  
        // Add a row to table using the values from the first two columns.
        DataRow myRow = args.DataTable.Rows.Add(new object[]
           {args.Values[0], args.Values[1], DBNull.Value});
        //Set the RowError containing the value for the third column.  
        myRow.RowError =
           "OverflowException Encountered. Value from data source: " +
           args.Values[2];
        args.Continue = true;
    }
}

Zobacz także