Sdílet prostřednictvím


Zpracování událostí datovéhoadapteru

Platí pro: .NET Framework .NET Standard

Stáhnout ADO.NET

Zprostředkovatel dat Microsoft SqlClient pro SQL Server SqlDataAdapter zveřejňuje tři události, které můžete použít k reagování na změny provedené v datech ve zdroji dat. V následující tabulce jsou uvedeny DataAdapter události.

Event Description
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ě.

Události RowUpdating a RowUpdated

RowUpdating je vyvolána před tím, než byla zpracována jakákoli aktualizace do řádku ve DataSet u zdroje dat. RowUpdated je vyvolána po každé aktualizaci řádku z DataSet, která byla zpracována na zdroji dat. 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 logikyDataSet opakování můžete přidat informace o chybách a tak dále.

Argumenty RowUpdatingEventArgs předané RowUpdatedEventArgs a RowUpdating události zahrnují následující: RowUpdated vlastnost, která odkazuje na Command objekt použitý k provedení aktualizace; Command vlastnost, která odkazuje na Row objekt obsahující aktualizované informace; DataRow vlastnost pro jaký typ aktualizace se provádí; , StatementTypepokud je to možné; a TableMappingStatus 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 Description
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í, že bude vyhozena výjimka. Můžete určit, která výjimka bude vyvolána, tím že nastavíte vlastnost Errors na požadovanou výjimku. Použití jedné z ostatních hodnot pro Status zabrání vyvolání výjimky.

Také můžete použít vlastnost ContinueUpdateOnError ke zpracování chyb pro aktualizované řádky. Pokud je DataAdapter.ContinueUpdateOnErrortrue, při aktualizaci řádku, která vyvolá výjimku, je text výjimky umístěn do RowError informací konkrétního řádku a zpracování pokračuje bez vzniku výjimky. To vám umožní reagovat na chyby, když je Update dokončen, na rozdíl od události RowUpdated, která umožňuje reagovat na chyby, když k chybě dojde.

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 události RowUpdated přidá informace o chybách do vlastnosti RowError u řádku v DataSet, potlačí výjimku a pokračuje ve zpracování (zrcadlící chování 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;
    }
}

Událost FillError

`DataAdapter` vyvolá událost `FillError`, když dojde k chybě během operace `Fill`. K tomuto typu chyby obvykle dochází v případě, že data v řádku, který se přidává, nelze převést na typ .NET 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.

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

Vlastnictví Description
Errors K tomu došlo Exception.
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ý je přidáván. 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 se zastaví aktuální operace Fill a vyvolá se výjimka. Nastavení Continue na true pokračuje v operaci Fill navzdory chybě.

Následující příklad kódu přidá obslužnou rutinu pro událost FillErrorDataAdapter. 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.

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

Viz také