DataAdapter-gebeurtenissen verwerken

De ADO.NET DataAdapter bevat drie gebeurtenissen die u kunt gebruiken om te reageren op wijzigingen in gegevens in de gegevensbron. In de volgende tabel ziet u de DataAdapter gebeurtenissen.

Gebeurtenis Beschrijving
RowUpdating Een UPDATE-, INSERT- of DELETE-bewerking op een rij (door een aanroep naar een van de Update methoden) begint.
RowUpdated Een UPDATE-, INSERT- of DELETE-bewerking op een rij (door een aanroep naar een van de Update methoden) is voltooid.
FillError Er is een fout opgetreden tijdens een Fill bewerking.

RowUpdating en RowUpdated

RowUpdating wordt gegenereerd voordat een update naar een rij van de DataSet gegevensbron is verwerkt. RowUpdated wordt gegenereerd nadat een update naar een rij van de DataSet gegevensbron is verwerkt. Als gevolg hiervan kunt RowUpdating u het updategedrag wijzigen voordat dit gebeurt, om extra verwerking te bieden wanneer een update plaatsvindt, om een verwijzing naar een bijgewerkte rij te behouden, de huidige update te annuleren en te plannen dat een batchproces later wordt verwerkt, enzovoort. RowUpdated is handig voor het reageren op fouten en uitzonderingen die optreden tijdens de update. U kunt foutinformatie toevoegen aan de DataSet, evenals logica voor opnieuw proberen, enzovoort.

De RowUpdatingEventArgs argumenten die RowUpdatedEventArgs aan de RowUpdating en RowUpdated gebeurtenissen worden doorgegeven, bevatten het volgende: een Command eigenschap die verwijst naar het Command object dat wordt gebruikt om de update uit te voeren; een Row eigenschap die verwijst naar het DataRow object met de bijgewerkte informatie; een StatementType eigenschap voor welk type update wordt uitgevoerd; de TableMapping, indien van toepassing; en de Status bewerking.

U kunt de Status eigenschap gebruiken om te bepalen of er een fout is opgetreden tijdens de bewerking en, indien gewenst, om de acties te beheren op basis van de huidige en resulterende rijen. Wanneer de gebeurtenis plaatsvindt, is Continue de Status eigenschap gelijk aan of ErrorsOccurred. In de volgende tabel ziet u de waarden waarop u de Status eigenschap kunt instellen om latere acties tijdens de update te beheren.

-Status Beschrijving
Continue Ga door met de updatebewerking.
ErrorsOccurred De updatebewerking afbreken en een uitzondering genereren.
SkipCurrentRow Negeer de huidige rij en ga door met de updatebewerking.
SkipAllRemainingRows De updatebewerking afbreken, maar er wordt geen uitzondering gegenereerd.

Als u de Status eigenschap instelt om ErrorsOccurred een uitzondering op te geven, wordt er een uitzondering gegenereerd. U kunt bepalen welke uitzondering wordt gegenereerd door de Errors eigenschap in te stellen op de gewenste uitzondering. Als u een van de andere waarden gebruikt, voorkomt Status u dat er een uitzondering wordt gegenereerd.

U kunt de ContinueUpdateOnError eigenschap ook gebruiken om fouten voor bijgewerkte rijen af te handelen. trueAls DataAdapter.ContinueUpdateOnError er een update van een rij resulteert in een uitzondering, wordt de tekst van de uitzondering in de RowError informatie van de specifieke rij geplaatst en wordt de verwerking voortgezet zonder een uitzondering te genereren. Hierdoor kunt u reageren op fouten wanneer de Update fout is voltooid, in tegenstelling tot de RowUpdated gebeurtenis, waarmee u kunt reageren op fouten wanneer de fout optreedt.

In het volgende codevoorbeeld ziet u hoe u gebeurtenis-handlers toevoegt en verwijdert. De RowUpdating gebeurtenishandler schrijft een logboek van alle verwijderde records met een tijdstempel. De RowUpdated gebeurtenis-handler voegt foutinformatie toe aan de eigenschap van de RowError rij in deDataSet, onderdrukt de uitzondering en blijft verwerken (spiegeling van het gedrag van = ContinueUpdateOnErrortrue).

' 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

De DataAdapter gebeurtenis treedt FillError op wanneer er een fout optreedt tijdens een Fill bewerking. Dit type fout treedt meestal op wanneer de gegevens in de rij die worden toegevoegd, niet kunnen worden geconverteerd naar een .NET Framework-type zonder enige precisieverlies.

Als er een fout optreedt tijdens een Fill bewerking, wordt de huidige rij niet toegevoegd aan de DataTable. Met FillError de gebeurtenis kunt u de fout oplossen en de rij toevoegen of de uitgesloten rij negeren en doorgaan met de Fill bewerking.

De FillErrorEventArgs doorgegeven aan de FillError gebeurtenis kan verschillende eigenschappen bevatten waarmee u kunt reageren op en fouten kunt oplossen. In de volgende tabel ziet u de eigenschappen van het FillErrorEventArgs object.

Eigenschappen Beschrijving
Errors Dat Exception gebeurde.
DataTable Het DataTable object wordt opgevuld wanneer de fout is opgetreden.
Values Een matrix met objecten die de waarden van de rij bevat die worden toegevoegd wanneer de fout is opgetreden. De rangtelverwijzingen van de Values matrix komen overeen met de rangtelverwijzingen van de kolommen van de rij die wordt toegevoegd. Is bijvoorbeeld Values[0] de waarde die wordt toegevoegd als de eerste kolom van de rij.
Continue Hiermee kunt u kiezen of u een uitzondering wilt genereren. Als u de Continue eigenschap instelt om de huidige Fill bewerking te false stoppen, wordt er een uitzondering gegenereerd. Instelling Continue om de Fill bewerking voort te true zetten ondanks de fout.

In het volgende codevoorbeeld wordt een gebeurtenis-handler toegevoegd voor de gebeurtenis van de FillErrorDataAdapter. In de FillError gebeurteniscode bepaalt het voorbeeld of er sprake is van precisieverlies, waardoor de mogelijkheid wordt geboden om op de uitzondering te reageren.

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

Zie ook