Gestione di eventi DataAdapterHandling DataAdapter Events

DataAdapter di ADO.NET espone tre eventi che è possibile usare per rispondere alle modifiche apportate ai dati nell'origine dati.The ADO.NET DataAdapter exposes three events that you can use to respond to changes made to data at the data source. Nella tabella seguente vengono descritti gli eventi di DataAdapter.The following table shows the DataAdapter events.

EventoEvent DescrizioneDescription
RowUpdating Sta per iniziare un'operazione UPDATE, INSERT o DELETE su una riga tramite la chiamata a uno dei metodi Update.An UPDATE, INSERT, or DELETE operation on a row (by a call to one of the Update methods) is about to begin.
RowUpdated È stata completata un'operazione UPDATE, INSERT o DELETE su una riga tramite la chiamata a uno dei metodi Update.An UPDATE, INSERT, or DELETE operation on a row (by a call to one of the Update methods) is complete.
FillError Si è verificato un errore durante un'operazione Fill.An error has occurred during a Fill operation.

RowUpdating e RowUpdatedRowUpdating and RowUpdated

RowUpdating viene generato prima che un aggiornamento a una riga di DataSet sia stato elaborato nell'origine dati.RowUpdating is raised before any update to a row from the DataSet has been processed at the data source. RowUpdated viene generato dopo che un aggiornamento a una riga di DataSet è stato elaborato nell'origine dati.RowUpdated is raised after any update to a row from the DataSet has been processed at the data source. Di conseguenza, è possibile usare RowUpdating per modificare il comportamento dell'aggiornamento prima che venga eseguito, in modo da fornire una gestione aggiuntiva quando verrà eseguito l'aggiornamento, conservare un riferimento a una riga aggiornata, annullare l'aggiornamento corrente e pianificarlo per un processo in batch che verrà eseguito successivamente e così via.As a result, you can use RowUpdating to modify update behavior before it happens, to provide additional handling when an update will occur, to retain a reference to an updated row, to cancel the current update and schedule it for a batch process to be processed later, and so on. RowUpdated risulta utile per rispondere a errori ed eccezioni che si verificano durante l'aggiornamento.RowUpdated is useful for responding to errors and exceptions that occur during the update. È possibile aggiungere le informazioni sugli errori al DataSet così come riprovare la logica e così via.You can add error information to the DataSet, as well as retry logic, and so on.

Gli argomenti RowUpdatingEventArgs e RowUpdatedEventArgs passati agli eventi RowUpdating e RowUpdated includono una proprietà Command che fa riferimento all'oggetto Command usato per eseguire l'aggiornamento, una proprietà Row che fa riferimento all'oggetto DataRow contenente le informazioni aggiornate, una proprietà StatementType relativa al tipo di aggiornamento eseguito, l'oggetto TableMapping, se applicabile, e lo Status dell'operazione.The RowUpdatingEventArgs and RowUpdatedEventArgs arguments passed to the RowUpdating and RowUpdated events include the following: a Command property that references the Command object being used to perform the update; a Row property that references the DataRow object containing the updated information; a StatementType property for what type of update is being performed; the TableMapping, if applicable; and the Status of the operation.

È possibile usare la proprietà Status per determinare se si è verificato un errore durante l'operazione ed eventualmente per controllare le operazioni relative alle righe correnti e risultanti.You can use the Status property to determine if an error has occurred during the operation and, if desired, to control the actions against the current and resulting rows. Quando si verifica l'evento, la proprietà Status sarà uguale a Continue o ErrorsOccurred.When the event occurs, the Status property equals either Continue or ErrorsOccurred. Nella tabella seguente sono indicati i valori su cui è possibile impostare la proprietà Status per controllare le operazioni successive durante l'aggiornamento.The following table shows the values to which you can set the Status property in order to control later actions during the update.

StatoStatus DescrizioneDescription
Continue Continua l'operazione di aggiornamento.Continue the update operation.
ErrorsOccurred Interrompe l'operazione di aggiornamento e genera un'eccezione.Abort the update operation and throw an exception.
SkipCurrentRow Ignora la riga corrente e continua l'operazione di aggiornamento.Ignore the current row and continue the update operation.
SkipAllRemainingRows Interrompe l'operazione di aggiornamento, ma non genera un'eccezione.Abort the update operation but do not throw an exception.

Se si imposta la proprietà Status su ErrorsOccurred, verrà generata un'eccezione.Setting the Status property to ErrorsOccurred causes an exception to be thrown. È possibile controllare l'eccezione generata impostando la proprietà Errors sull'eccezione desiderata.You can control which exception is thrown by setting the Errors property to the desired exception. Se si usa uno degli altri valori di Status non verrà generata alcuna eccezione.Using one of the other values for Status prevents an exception from being thrown.

È inoltre possibile usare la proprietà ContinueUpdateOnError per gestire gli errori relativi alle righe aggiornate.You can also use the ContinueUpdateOnError property to handle errors for updated rows. Se DataAdapter.ContinueUpdateOnError è true, quando un aggiornamento di una riga determina la generazione di un'eccezione, il testo dell'eccezione viene inserito nelle informazioni RowError della stessa riga e l'elaborazione continua senza generare un'eccezione.If DataAdapter.ContinueUpdateOnError is true, when an update to a row results in an exception being thrown, the text of the exception is placed into the RowError information of the particular row, and processing continues without throwing an exception. In questo modo è possibile rispondere agli errori quando l'evento Update è completato, a differenza di quanto avviene con l'evento RowUpdated che consente di rispondere agli errori nel momento in cui si verificano.This enables you to respond to errors when the Update is complete, in contrast to the RowUpdated event, which enables you to respond to errors when the error is encountered.

Nell'esempio di codice seguente viene illustrato come aggiungere e rimuovere i gestori eventi.The following code sample shows how to both add and remove event handlers. Il gestore dell'evento RowUpdating scrive un log di tutti i record eliminati con un timestamp.The RowUpdating event handler writes a log of all deleted records with a time stamp. Il RowUpdated gestore eventi aggiunge informazioni sull'errore per il RowError proprietà della riga del DataSet, Elimina l'eccezione e continua l'elaborazione (il comportamento del mirroring ContinueUpdateOnError = true).The RowUpdated event handler adds error information to the RowError property of the row in the DataSet, suppresses the exception, and continues processing (mirroring the behavior of ContinueUpdateOnError = true).

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

FillErrorFillError

DataAdapter genera l'evento FillError quando si verifica un errore durante un'operazione Fill.The DataAdapter issues the FillError event when an error occurs during a Fill operation. Questo tipo di errore si verifica solitamente quando i dati nella riga che viene aggiunta non possono essere convertiti in un tipo .NET Framework senza una perdita di precisione.This type of error commonly occurs when the data in the row being added could not be converted to a .NET Framework type without some loss of precision.

Se si verifica un errore durante un'operazione Fill, la riga corrente non verrà aggiunta a DataTable.If an error occurs during a Fill operation, the current row is not added to the DataTable. L'evento FillError consente di risolvere l'errore e aggiungere la riga o di ignorare la riga esclusa e continuare l'operazione Fill.The FillError event enables you to resolve the error and add the row, or to ignore the excluded row and continue the Fill operation.

FillErrorEventArgs passato all'evento FillError può contenere diverse proprietà che consentono di rispondere agli errori e di risolverli.The FillErrorEventArgs passed to the FillError event can contain several properties that enable you to respond to and resolve errors. Nella tabella seguente sono illustrate le proprietà dell'oggetto FillErrorEventArgs.The following table shows the properties of the FillErrorEventArgs object.

ProprietàProperty DescrizioneDescription
Errors Exception generata.The Exception that occurred.
DataTable Oggetto DataTable in fase di riempimento quando si è verificato l'errore.The DataTable object being filled when the error occurred.
Values Matrice di oggetti contenente i valori della riga in fase di inserimento quando si è verificato l'errore.An array of objects that contains the values of the row being added when the error occurred. I riferimenti ordinali della matrice di Values corrispondono ai riferimenti ordinali delle colonne della riga che viene aggiunta.The ordinal references of the Values array correspond to the ordinal references of the columns of the row being added. Values[0], ad esempio, è il valore che era stato aggiunto come prima colonna della riga.For example, Values[0] is the value that was being added as the first column of the row.
Continue Consente di scegliere se generare o meno una Exception.Allows you to choose whether or not to throw an exception. Se si imposta la proprietà Continue su false, l'operazione Fill corrente verrà interrotta e verrà generata un'eccezione.Setting the Continue property to false will halt the current Fill operation, and an exception will be thrown. Se si imposta Continue su true, l'operazione Fill continuerà nonostante l'errore.Setting Continue to true continues the Fill operation despite the error.

Nell'esempio di codice seguente viene aggiunto un gestore per l'evento FillError di DataAdapter.The following code example adds an event handler for the FillError event of the DataAdapter. Nel codice dell'evento FillError viene determinato se esiste il rischio potenziale di una perdita di precisione e viene fornita la possibilità di rispondere all'eccezione.In the FillError event code, the example determines if there is the potential for precision loss, providing the opportunity to respond to the exception.

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.  
    args.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.  
    args.RowError =   
       "OverflowException Encountered. Value from data source: " +  
       args.Values[2];  
    args.Continue = true;  
  }  
}  

Vedere ancheSee Also

DataAdapter e DataReaderDataAdapters and DataReaders
Gestione di eventi di set di datiHandling DataSet Events
Gestione di eventi DataTableHandling DataTable Events
EventiEvents
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center