Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
ADO.NET DataAdapter exponerar tre händelser som du kan använda för att svara på ändringar som gjorts i datakällan. I följande tabell visas DataAdapter händelserna.
| Evenemang | Beskrivning |
|---|---|
RowUpdating |
En uppdaterings-, INSERT- eller DELETE-åtgärd på en rad (med ett anrop till någon av Update metoderna) håller på att påbörjas. |
RowUpdated |
En uppdateringsåtgärd, infogning eller borttagning på en rad (genom ett anrop till en av metoderna Update) är slutförd. |
FillError |
Ett fel har uppstått under en Fill åtgärd. |
RowUpdating och RowUpdated
RowUpdating genereras innan någon uppdatering till en rad från DataSet har bearbetats i datakällan.
RowUpdated genereras efter att en uppdatering till en rad från DataSet har bearbetats i datakällan. Därför kan du använda RowUpdating för att ändra uppdateringsbeteendet innan det inträffar, för att tillhandahålla ytterligare hantering när en uppdatering inträffar, för att behålla en referens till en uppdaterad rad, avbryta den aktuella uppdateringen och schemalägga den för att en batchprocess ska bearbetas senare och så vidare.
RowUpdated är användbart för att svara på fel och undantag som inträffar under uppdateringen. Du kan lägga till felinformation i DataSet, samt omförsökslogik och så vidare.
Argumenten RowUpdatingEventArgs och RowUpdatedEventArgs som skickas till händelserna och RowUpdating innehåller följande: en RowUpdated egenskap som refererar Command till objektet som används för att utföra uppdateringen, en Command egenskap som refererar Row till DataRow objektet som innehåller den uppdaterade informationen, en StatementType egenskap för vilken typ av uppdatering som utförs, TableMapping, om tillämpligt, och Status för åtgärden.
Du kan använda Status egenskapen för att avgöra om ett fel har inträffat under åtgärden och, om så önskas, för att kontrollera åtgärderna mot de aktuella och resulterande raderna. När händelsen inträffar är egenskapen Status lika med antingen Continue eller ErrorsOccurred. I följande tabell visas de värden som du kan ange Status egenskapen till för att styra senare åtgärder under uppdateringen.
| Läge | Beskrivning |
|---|---|
Continue |
Fortsätt uppdateringsåtgärden. |
ErrorsOccurred |
Avbryt uppdateringsåtgärden och utlöser ett undantag. |
SkipCurrentRow |
Ignorera den aktuella raden och fortsätt uppdateringsåtgärden. |
SkipAllRemainingRows |
Avbryt uppdateringsåtgärden men utlöser inget undantag. |
Om du ställer in egenskapen Status på ErrorsOccurred genereras ett undantag. Du kan styra vilket undantag som genereras genom att ange Errors egenskapen till önskat undantag. Om du använder något av de andra värdena för Status förhindras ett undantag från att genereras.
Du kan också använda egenskapen ContinueUpdateOnError för att hantera fel för uppdaterade rader. Om DataAdapter.ContinueUpdateOnError är true, när en uppdatering av en rad resulterar i ett undantag som utlöses, placeras texten i undantaget i RowError informationen för den specifika raden, och bearbetningen fortsätter utan att utlösa ett undantag. På så sätt kan du svara på fel när Update är klar, till skillnad från när RowUpdated-händelsen inträffar, vilket gör att du kan svara på fel när felet uppstår.
Följande kodexempel visar hur du både lägger till och tar bort händelsehanterare. Händelsehanteraren RowUpdating skriver en logg över alla borttagna poster med en tidsstämpel. Händelsehanteraren RowUpdated lägger till felinformation till RowError egenskapen för raden i DataSet, undertrycker undantaget och fortsätter bearbetningen (spegling av beteendet förContinueUpdateOnError = 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;
}
}
Fyllningsfel
DataAdapter utlöser händelsen FillError när ett fel inträffar under en Fill åtgärd. Den här typen av fel inträffar ofta när data i raden som läggs till inte kunde konverteras till en .NET Framework-typ utan någon förlust av precision.
Om ett fel inträffar under en Fill åtgärd läggs inte den aktuella raden till i DataTable. Med FillError händelsen kan du lösa felet och lägga till raden, eller ignorera den exkluderade raden och fortsätta åtgärden Fill .
Det FillErrorEventArgs som skickas till FillError-händelsen kan innehålla flera egenskaper som gör att du kan svara på och lösa fel. I följande tabell visas objektets FillErrorEventArgs egenskaper.
| Fastighet | Beskrivning |
|---|---|
Errors |
Det Exception inträffade. |
DataTable |
Objektet DataTable fylls i när felet inträffade. |
Values |
En matris med objekt som innehåller värdena för raden som läggs till när felet inträffade. Matrisens Values ordningsreferenser motsvarar ordningsreferenserna för kolumnerna i raden som läggs till. Är till exempel Values[0] det värde som lades till som den första kolumnen på raden. |
Continue |
Gör att du kan välja om du vill utlösa ett undantag eller inte. Om du anger egenskapen Continue till false stoppas den aktuella Fill åtgärden och ett undantag genereras. Att ställa in Continue till true fortsätter Fill åtgärden trots felet. |
Följande kodexempel lägger till en händelsehanterare för FillError händelsen för DataAdapter.
FillError I händelsekoden avgör exemplet om det finns risk för precisionsförlust, vilket ger möjlighet att svara på undantaget.
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;
}
}