Obsługa zdarzeń elementu DataAdapter

DataAdapter ADO.NET 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.

Wydarzenie opis
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.

RowUpdating i RowUpdated

RowUpdating jest wywoływana przed aktualizacją wiersza z DataSet obiektu , która została przetworzona w źródle danych. RowUpdated jest wywoływany po każdej aktualizacji wiersza z DataSet obiektu , który został przetworzony w źródle danych. W związku z tym można użyć RowUpdating polecenia , aby zmodyfikować zachowanie aktualizacji przed jego wystąpieniem, aby zapewnić dodatkową obsługę w przypadku wystąpienia aktualizacji, zachować odwołanie do zaktualizowanego wiersza, anulować bieżącą aktualizację i zaplanować jej przetwarzanie wsadowe później itd. RowUpdated jest przydatny w przypadku reagowania na błędy i wyjątki występujące podczas aktualizacji. Możesz dodać informacje o błędzie DataSetdo elementu , a także logikę ponawiania prób itd.

Argumenty RowUpdatingEventArgs i przekazywane do zdarzeń i RowUpdatedRowUpdatedEventArgs obejmują następujące właściwości: Command właściwość odwołującą Command się do obiektu używanego do przeprowadzenia aktualizacji; Row właściwość odwołująca się DataRow do RowUpdating obiektu zawierającego zaktualizowane informacje; StatementType właściwość dla tego, jakiego typu aktualizacji jest wykonywana; TableMapping, jeśli dotyczy; oraz 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, Status właściwość jest równa lub ContinueErrorsOccurred. 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.

Stan opis
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.

Status Ustawienie właściwości powoduje ErrorsOccurred 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 uniemożliwia Status zgłaszanie wyjątku.

Za pomocą ContinueUpdateOnError właściwości można również obsługiwać błędy dla zaktualizowanych wierszy. Jeśli DataAdapter.ContinueUpdateOnError wartość to true, gdy aktualizacja wiersza spowoduje zgłoszenie wyjątku, tekst wyjątku zostanie umieszczony w RowError informacjach o określonym wierszu, a przetwarzanie będzie kontynuowane bez zgłaszania wyjątku. Dzięki temu można reagować na błędy po Update zakończeniu RowUpdated , w przeciwieństwie do zdarzenia, co umożliwia reagowanie na błędy po napotkaniu błędu.

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 RowError właściwości wiersza w DataSetobiekcie , pomija wyjątek i kontynuuje przetwarzanie (dublowanie zachowania ContinueUpdateOnError = trueelementu ).

' Assumes that connection is a valid SqlConnection object.  
Dim custAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT CustomerID, CompanyName FROM Customers", connection)  
  
' Add handlers.  
AddHandler custAdapter.RowUpdating, New SqlRowUpdatingEventHandler( _  
  AddressOf OnRowUpdating)  
AddHandler custAdapter.RowUpdated, New SqlRowUpdatedEventHandler(  
  AddressOf OnRowUpdated)  
  
' Set DataAdapter command properties, fill DataSet, and modify DataSet.  
  
custAdapter.Update(custDS, "Customers")  
  
' Remove handlers.  
RemoveHandler custAdapter.RowUpdating, _  
  New SqlRowUpdatingEventHandler(AddressOf OnRowUpdating)  
RemoveHandler custAdapter.RowUpdated, _  
  New SqlRowUpdatedEventHandler(AddressOf OnRowUpdated)  
  
Private Shared Sub OnRowUpdating(sender As Object, _  
  args As SqlRowUpdatingEventArgs)  
  If args.StatementType = StatementType.Delete Then  
    Dim tw As System.IO.TextWriter = _  
  System.IO.File.AppendText("Deletes.log")  
    tw.WriteLine( _  
      "{0}: Customer {1} Deleted.", DateTime.Now, args.Row(_  
      "CustomerID", DataRowVersion.Original))  
    tw.Close()  
  End If  
End Sub  
  
Private Shared Sub OnRowUpdated( _  
  sender As Object, args As SqlRowUpdatedEventArgs)  
  If args.Status = UpdateStatus.ErrorsOccurred  
    args.Status = UpdateStatus.SkipCurrentRow  
    args.Row.RowError = args.Errors.Message  
  End If  
End Sub  
// Assumes that connection is a valid SqlConnection object.  
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);  
  
protected static void OnRowUpdating(  
  object sender, SqlRowUpdatingEventArgs args)  
{  
  if (args.StatementType == StatementType.Delete)  
  {  
    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)  
  {  
    args.Row.RowError = args.Errors.Message;  
    args.Status = UpdateStatus.SkipCurrentRow;  
  }  
}  

Fillerror

Problemy DataAdapter z FillError zdarzeniem, gdy wystąpi błąd podczas Fill operacji. Ten typ błędu występuje często, gdy nie można przekonwertować danych w dodanym wierszu na typ programu .NET Framework 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 rozwiązywanie ich. W poniższej tabeli przedstawiono właściwości FillErrorEventArgs obiektu.

Właściwości opis
Errors To 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 Values tablicy odpowiadają odwołaniom porządkowym kolumn dodawanego wiersza. 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. Ustawienie właściwości na Continuefalse wartość spowoduje zatrzymanie bieżącej Fill operacji i zostanie zgłoszony wyjątek. Ustawienie Continue , aby true kontynuować operację Fill pomimo 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.

AddHandler adapter.FillError, New FillErrorEventHandler( _  
  AddressOf FillError)  
  
Dim dataSet As DataSet = New DataSet  
adapter.Fill(dataSet, "ThisTable")  
  
Private Shared Sub FillError(sender As Object, _  
  args As FillErrorEventArgs)  
  If args.Errors.GetType() Is Type.GetType("System.OverflowException") Then  
    ' 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  
  End If  
End Sub  
adapter.FillError += new FillErrorEventHandler(FillError);  
  
DataSet dataSet = new DataSet();  
adapter.Fill(dataSet, "ThisTable");  
  
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 też