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 DataSet
do elementu , a także logikę ponawiania prób itd.
Argumenty RowUpdatingEventArgs i przekazywane do zdarzeń i RowUpdated
RowUpdatedEventArgs 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 Continue
ErrorsOccurred
. 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 DataSet
obiekcie , pomija wyjątek i kontynuuje przetwarzanie (dublowanie zachowania ContinueUpdateOnError
= true
elementu ).
' 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 Continue false 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;
}
}