Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op: .NET Framework
.NET
Standard
De Microsoft SqlClient-gegevensprovider voor SQL Server SqlDataAdapter 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.
| Event | Description |
|---|---|
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-gebeurtenissen
RowUpdating wordt gegenereerd voordat een update naar een rij van de DataSet gegevensbron is verwerkt.
RowUpdated wordt gegenereerd nadat elke update van een rij uit de DataSet is verwerkt bij de gegevensbron. Als gevolg hiervan kunt u RowUpdating gebruiken om het updategedrag te wijzigen voordat het plaatsvindt, om extra handelingen toe te voegen wanneer er een update plaatsvindt, om een verwijzing naar een bijgewerkte rij te behouden, om de huidige update te annuleren en te plannen voor verwerking door een batchproces op een later tijdstip, 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 en RowUpdatedEventArgs argumenten die 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 geüpdatete informatie; een StatementType eigenschap voor welk type update wordt uitgevoerd; de TableMapping, indien van toepassing; en de Status van de 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 de Status-eigenschap gelijk aan Continue 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.
| Toestand | Description |
|---|---|
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 |
Annuleer de updatebewerking, maar werp geen uitzondering. |
Als u de Status eigenschap instelt op ErrorsOccurred, 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 dat er een uitzondering wordt gegenereerd.
U kunt de ContinueUpdateOnError eigenschap ook gebruiken om fouten voor bijgewerkte rijen af te handelen. Als DataAdapter.ContinueUpdateOnErrortrue is, en een update van een rij tot een uitzondering leidt, wordt de tekst van de uitzondering in de RowError informatie van de specifieke rij geplaatst en wordt de verwerking voortgezet zonder een uitzondering op te werpen. Hierdoor kunt u reageren op fouten wanneer de Update voltooid is, in tegenstelling tot de RowUpdated gebeurtenis, waarmee u kunt reageren op fouten zodra de fout wordt tegengekomen.
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 gebeurtenishandler voegt foutinformatie toe aan de eigenschap van de rij in de RowErrorDataSet, ondervangt de uitzondering en gaat door met verwerken (vergelijkbaar met het gedrag van 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;
}
}
FillError-gebeurtenis
De DataAdapter geeft het FillError evenement af 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-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.
| Vastgoed | Description |
|---|---|
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. Een voorbeeld is dat Values[0] de waarde is die wordt toegevoegd als eerste kolom van de rij. |
Continue |
Hiermee kunt u kiezen of u een uitzondering wilt gooien. Het instellen van de Continue-eigenschap op false zal de huidige Fill-bewerking stoppen, en er zal een uitzondering worden gegenereerd. Instelling Continue op true gaat verder met de Fill bewerking ondanks de fout. |
In het volgende codevoorbeeld wordt een event handler toegevoegd voor de FillError-gebeurtenis van de DataAdapter. In de FillError gebeurteniscode bepaalt het voorbeeld of er sprake is van precisieverlies, waardoor de mogelijkheid wordt geboden om op de uitzondering te reageren.
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;
}
}