Zpracování událostí datovéhoadapteru

ADO.NET DataAdapter zveřejňuje tři události, které můžete použít k reagování na změny dat provedených ve zdroji dat. V následující tabulce jsou uvedeny DataAdapter události.

Událost Popis
RowUpdating Chystá se začít operace UPDATE, INSERT nebo DELETE na řádku (voláním jedné z Update metod).
RowUpdated Je dokončena operace UPDATE, INSERT nebo DELETE na řádku (voláním jedné z Update metod).
FillError Během operace došlo k Fill chybě.

RowUpdating and RowUpdated

RowUpdating je vyvolána před jakoukoli aktualizací řádku, která byla zpracována u zdroje dat DataSet. RowUpdated je vyvolána po zpracování jakékoliv aktualizace řádku ze zdroje dat DataSet. V důsledku toho můžete použít RowUpdating ke změně chování aktualizace dříve, než k ní dojde, k zajištění dalšího zpracování při aktualizaci, k zachování odkazu na aktualizovaný řádek, zrušení aktuální aktualizace a naplánování zpracování dávkového procesu později atd. RowUpdated je užitečné pro reagování na chyby a výjimky, ke kterým dochází během aktualizace. Do DataSet můžete přidat informace o chybách, logiku opakování a podobně.

Argumenty RowUpdatingEventArgs a RowUpdatedEventArgs předané RowUpdating a RowUpdated události zahrnují následující: Command vlastnost, která odkazuje na Command objekt použitý k provedení aktualizace; Row vlastnost, která odkazuje na DataRow objekt obsahující aktualizované informace; StatementType vlastnost o tom, jaký typ aktualizace se provádí; TableMapping, pokud je to relevantní; a Status operace.

Pomocí vlastnosti můžete Status určit, jestli během operace došlo k chybě, a v případě potřeby můžete řídit akce proti aktuálním a výsledným řádkům. Když dojde k události, Status vlastnost se rovná buď Continue nebo ErrorsOccurred. Následující tabulka ukazuje hodnoty, na které můžete vlastnost nastavit Status , aby bylo možné řídit pozdější akce během aktualizace.

Stav Popis
Continue Pokračujte v operaci aktualizace.
ErrorsOccurred Přerušte operaci aktualizace a vyvoláte výjimku.
SkipCurrentRow Ignorujte aktuální řádek a pokračujte v operaci aktualizace.
SkipAllRemainingRows Přerušte operaci aktualizace, ale nevyvolejte výjimku.

Nastavení vlastnosti Status na ErrorsOccurred způsobí vyvolání výjimky. Můžete určit, která výjimka je vyvolána nastavením vlastnosti Errors na požadovanou výjimku. Použití některé z ostatních hodnot pro Status zabrání vyvolání výjimky.

Můžete také použít vlastnost ContinueUpdateOnError k zachycení chyb aktualizovaných řádků. Pokud DataAdapter.ContinueUpdateOnError je true, když aktualizace řádku vyvolá výjimku, text výjimky bude umístěn do RowError informací konkrétního řádku a zpracování pokračuje bez vyvolání výjimky. To vám umožní reagovat na chyby, když je Update dokončeno, na rozdíl od RowUpdated události, která umožňuje reagovat na chyby, když dojde k chybě.

Následující ukázka kódu ukazuje, jak přidat a odebrat obslužné rutiny událostí. Obslužná rutina RowUpdating události zapíše protokol všech odstraněných záznamů s časovým razítkem. Obslužná rutina RowUpdated události přidá informace o chybách do vlastnosti RowError řádku v DataSet, potlačí výjimku a pokračuje ve zpracování (zrcadlení chování 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;  
  }  
}  

FillError

Událost DataAdapter je vydána FillError, když dojde k chybě během Fill operace. K tomuto typu chyby obvykle dochází, když data v řádku, který se přidává, nelze převést na typ rozhraní .NET Framework bez ztráty přesnosti.

Pokud během operace dojde k Fill chybě, aktuální řádek není přidán do objektu DataTable. Tato FillError událost umožňuje vyřešit chybu a přidat řádek nebo ignorovat vyloučený řádek a pokračovat v Fill operaci.

Argument FillErrorEventArgs předaný události FillError může obsahovat několik vlastností, které umožňují reagovat na chyby a vyřešit je. Následující tabulka ukazuje vlastnosti objektu FillErrorEventArgs .

Vlastnictví Popis
Errors K tomu Exception došlo.
DataTable Objekt DataTable , který se vyplní, když došlo k chybě.
Values Pole objektů, které obsahuje hodnoty řádku, které se přidají při výskytu chyby. Pořadové odkazy pole Values odpovídají pořadovým odkazům sloupců řádku, který se přidává. Jedná se například Values[0] o hodnotu, která se přidala jako první sloupec řádku.
Continue Umožňuje zvolit, jestli chcete vyvolat výjimku nebo ne. Nastavením vlastnosti Continue na false dojde k zastavení aktuální operace Fill, a bude vyvolána výjimka. Nastavení Continue na true umožní pokračovat v operaci Fill i přes chybu.

Následující příklad kódu přidává obslužnou rutinu pro událost FillError objektu DataAdapter. FillError V kódu události příklad určuje, zda existuje potenciál pro ztrátu přesnosti, a poskytuje příležitost reagovat na výjimku.

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

Viz také