Sdílet prostřednictvím


Ověření dat v datových sadách v aplikacích .NET Framework

Poznámka:

Třídy DataSet a související třídy jsou starší technologie rozhraní .NET Framework z počátku 2000, které umožňují aplikacím pracovat s daty v paměti, zatímco aplikace jsou odpojeny od databáze. Tyto technologie jsou zvláště užitečné pro aplikace, které uživatelům umožňují upravovat data a uchovávat změny zpět do databáze. I když jsou datové sady ověřenou úspěšnou technologií, doporučeným přístupem pro nové aplikace .NET je použití Entity Framework Core. Entity Framework poskytuje přirozenější způsob práce s tabulkovými daty jako objektovými modely a má jednodušší programovací rozhraní.

Ověření dat je proces potvrzení, že hodnoty zadané do datových objektů odpovídají omezením ve schématu datové sady. Proces ověření také potvrdí, že tyto hodnoty následují podle pravidel vytvořených pro vaši aplikaci. Před odesláním aktualizací do podkladové databáze je vhodné ověřit data. Tím se sníží počet chyb a potenciální počet odezv mezi aplikací a databází.

Data, která se zapisují do datové sady, lze ověřit začleněním ověřovacích kontrol přímo do této datové sady. Datová sada může zkontrolovat data bez ohledu na to, jak se aktualizace provádí – ať už přímo ovládacími prvky ve formuláři, v rámci komponenty nebo jiným způsobem. Vzhledem k tomu, že datová sada je součástí vaší aplikace (na rozdíl od back-endu databáze), je to logické místo pro sestavení ověřování specifického pro aplikaci.

Nejlepším místem pro přidání ověření do aplikace je soubor částečné třídy datové sady. V jazyce Visual Basic nebo Visual C# otevřete Návrhář datové sady a poklikejte na sloupec nebo tabulku, pro kterou chcete vytvořit ověření. Tato akce otevře soubor kódu, kde můžete vytvořit obslužnou rutinu ColumnChanging události.RowChanging

private static void OnColumnChanging(object sender, DataColumnChangeEventArgs e)
{

}

Ověření dat

Ověřování v datové sadě se provádí následujícími způsoby:

  • Vytvořením vlastního ověření specifického pro aplikaci, které během změn může kontrolovat hodnoty v jednotlivých sloupcích dat. Další informace naleznete v tématu Postupy: Ověření dat během změn sloupců.

  • Vytvořením vlastního ověření specifického pro aplikaci, které může kontrolovat, zda údaje odpovídají hodnotám, zatímco se mění celý datový řádek. Další informace naleznete v tématu Postupy: Ověření dat během změn řádků.

  • Vytvořením klíčů, jedinečných omezení atd. v rámci skutečné definice schématu datové sady.

  • Nastavením vlastností objektu DataColumn , například MaxLength, AllowDBNulla Unique.

Objekt DataTable vyvolá několik událostí, když dojde ke změně v záznamu.

  • Události ColumnChanging a ColumnChanged se generují během a po každé změně jednotlivého sloupce. Událost ColumnChanging je užitečná, když chcete ověřit změny v konkrétních sloupcích. Informace o navrhované změně se předávají jako argument s událostí.
  • Události RowChanging a RowChanged jsou vyvolány během a po jakékoli změně v řádku. Událost RowChanging je obecnější. Označuje, že se změna vyskytuje někde v řádku, ale nevíte, který sloupec se změnil.

Ve výchozím nastavení každá změna sloupce vyvolává čtyři události. První jsou události ColumnChanging a ColumnChanged pro konkrétní sloupec, který se mění. Dále jsou události RowChanging a RowChanged. Pokud se v řádku provádí více změn, události budou vyvolány pro každou změnu.

Poznámka:

Metoda datového BeginEdit řádku vypne RowChanging a RowChanged události po každé změně jednotlivých sloupců. V takovém případě není událost vyvolána, dokud není volána metoda EndEdit, a události RowChanging a RowChanged jsou vyvolány pouze jednou. Další informace najdete v tématu Vypnutí omezení při vyplňování datové sady.

Událost, kterou zvolíte, závisí na tom, jak podrobné má být ověření. Pokud je důležité zachytit chybu okamžitě při změně sloupce, sestavte ověřování pomocí události ColumnChanging. V opačném případě použijte RowChanging událost, která může vést k zachycení několika chyb najednou. Pokud jsou vaše data strukturovaná tak, aby se hodnota jednoho sloupce ověřila na základě obsahu jiného sloupce, proveďte ověření během RowChanging události.

Když se záznamy aktualizují, objekt vyvolá události, DataTable na které můžete reagovat, když dojde ke změnám a po provedení změn.

Pokud vaše aplikace používá silně typovanou datovou sadu, můžete vytvořit obslužné rutiny událostí silně typované. Tím se přidají čtyři další typované události, pro které můžete vytvářet obslužné rutiny: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeletinga dataTableNameRowDeleted. Tyto typové obslužné rutiny událostí předávají argument, který obsahuje názvy sloupců vaší tabulky, což usnadňuje zápis a čtení kódu.

Události aktualizace dat

Událost Popis
ColumnChanging Hodnota ve sloupci se mění. Událost vám předá řádek a sloupec spolu s novou navrženou hodnotou.
ColumnChanged Hodnota ve sloupci byla změněna. Událost vám předá informace o řádku a sloupci spolu s navrženou hodnotou.
RowChanging Do datové sady se chystají potvrdit změny provedené u objektu DataRow. Pokud jste nezavolali metodu BeginEdit, událost RowChanging je vyvolána pro každou změnu sloupce ihned poté, co byla vyvolána událost ColumnChanging. Pokud jste volali BeginEdit před provedením změn, RowChanging událost se vyvolá pouze při volání EndEdit metody.

Událost předá vám řádek spolu s hodnotou označující, jaký typ akce (změna, vložení atd.) se provádí.
RowChanged Řádek byl změněn. Událost předá vám řádek spolu s hodnotou označující, jaký typ akce (změna, vložení atd.) se provádí.
RowDeleting Řádek se odstraňuje. Událost vám předá řádek spolu s hodnotou označující, jaký typ akce (smazání) se provádí.
RowDeleted Řádek byl odstraněn. Událost předá vám řádek spolu s hodnotou označující, jaký typ akce (odstranění) se provádí.

Během procesu aktualizace jsou vyvolány události ColumnChanging, RowChanging a RowDeleting. Tyto události můžete použít k ověření dat nebo provádění jiných typů zpracování. Vzhledem k tomu, že aktualizace probíhá během těchto událostí, můžete ji zrušit vyvoláním výjimky, která brání dokončení aktualizace.

ColumnChanged, RowChanged a RowDeleted jsou oznámeními, která jsou vyvolána po úspěšném dokončení aktualizace. Tyto události jsou užitečné, když chcete na základě úspěšné aktualizace provést další akce.

Ověření dat během změn sloupců

Poznámka:

Návrhář datové sady vytvoří částečnou třídu, ve které je možné do datové sady přidat logiku ověření. Datová sada vygenerovaná návrhářem neodstraní ani nezmění žádný kód v částečné třídě.

Data můžete ověřit, když se hodnota v datovém sloupci změní, a to reagováním na ColumnChanging událost. Při vyvolání tato událost předá argument události (ProposedValue), který obsahuje hodnotu, která se navrhuje pro aktuální sloupec. Na základě obsahu e.ProposedValuemůžete:

  • Přijměte navrženou hodnotu tím, že nic neděláte.

  • Zamítněte navrženou hodnotu nastavením chyby sloupce (SetColumnError) ze zpracovatele události pro změnu sloupce.

  • Volitelně můžete použít ErrorProvider ovládací prvek k zobrazení chybové zprávy uživateli. Další informace naleznete v tématu ErrorProvider komponenta.

Ověření lze také provést během události RowChanging.

Ověření dat během změn řádků

Můžete napsat kód, který ověří, že každý sloupec, který chcete ověřit, obsahuje data, která splňují požadavky vaší aplikace. Uděláte to tak, že nastavíte sloupec tak, aby označil, že obsahuje chybu, pokud je navrhovaná hodnota nepřijatelná. Následující příklady nastaví chybu sloupce, pokud je sloupec Quantity 0 nebo méně. Obslužné rutiny událostí pro změnu řádku by se měly podobat následujícím příkladům.

Ověření dat při změně řádku (Visual Basic)

  1. Otevřete svou datovou sadu v návrháři datové sady . Další informace naleznete v tématu Návod: Vytvoření datové sady v Návrháři datových sad.

  2. Poklikejte na záhlaví tabulky, kterou chcete ověřit. Tato akce automaticky vytvoří obslužnou rutinu události RowChangingDataTable v souboru částečné třídy datové sady.

    Návod

    Poklikáním nalevo od názvu tabulky vytvoříte událostní obslužnou rutinu pro změnu řádku. Pokud dvakrát kliknete na název tabulky, můžete ho upravit.

    Private Sub Order_DetailsDataTable_Order_DetailsRowChanging(
        ByVal sender As System.Object, 
        ByVal e As Order_DetailsRowChangeEvent
      ) Handles Me.Order_DetailsRowChanging
    
        If CType(e.Row.Quantity, Short) <= 0 Then
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError("Quantity", "")
        End If
    End Sub
    

Ověření dat při změně řádku (C#)

  1. Otevřete svou datovou sadu v návrháři datové sady . Další informace naleznete v tématu Návod: Vytvoření datové sady v Návrháři datových sad.

  2. Poklikejte na záhlaví tabulky, kterou chcete ověřit. Tato akce vytvoří částečný soubor třídy pro DataTable.

    Poznámka:

    Návrhář datových sad automaticky nevytvoří obslužnou rutinu pro událost RowChanging. Musíte vytvořit metodu RowChanging pro zpracování události a spustit kód pro připojení události v inicializační metodě tabulky.

  3. Zkopírujte následující kód do částečné třídy:

    public override void EndInit()
    {
        base.EndInit();
        Order_DetailsRowChanging += TestRowChangeEvent;
    }
    
    public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e)
    {
        if ((short)e.Row.Quantity <= 0)
        {
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
        }
        else
        {
            e.Row.SetColumnError("Quantity", "");
        }
    }
    

Aby bylo možné získat změněné řádky

Každý řádek v tabulce dat má RowState vlastnost, která sleduje aktuální stav tohoto řádku pomocí hodnot v výčtu DataRowState . Změněné řádky můžete vrátit z datové sady nebo tabulky dat voláním GetChanges metody nebo DataSetDataTable. Změny můžete ověřit před voláním GetChanges zavoláním metody HasChanges datové sady.

Poznámka:

Po potvrzení změn do datové sady nebo tabulky dat (voláním AcceptChanges metody) GetChanges metoda nevrátí žádná data. Pokud vaše aplikace potřebuje zpracovat změněné řádky, musíte změny zpracovat před voláním AcceptChanges metody.

GetChanges Volání metody datové sady nebo tabulky dat vrátí novou datovou sadu nebo tabulku dat, která obsahuje pouze změněné záznamy. Pokud chcete získat konkrétní záznamy , například pouze nové záznamy nebo pouze upravené záznamy, můžete předat hodnotu z výčtu DataRowState jako parametr metody GetChanges .

Výčet DataRowVersion použijte pro přístup k různým verzím řádku (například původní hodnoty, které byly v řádku před zpracováním).

Získat všechny změněné záznamy z datové sady

  • Zavolejte metodu GetChanges datové sady.

    Následující příklad vytvoří novou datovou sadu s názvem changedRecords a naplní ji všemi změněnými záznamy z jiné datové sady.dataSet1

    DataSet changedRecords = dataSet1.GetChanges();
    

Získat všechny změněné záznamy z datové tabulky

  • Zavolejte metodu GetChanges objektu DataTable.

    Následující příklad vytvoří novou datovou tabulku s názvem changedRecordsTable a naplní ji všemi změněnými záznamy z jiné tabulky dat s názvem dataTable1.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Pro zobrazení všech záznamů, které mají konkrétní stav řádku

  • GetChanges Zavolejte metodu datové sady nebo tabulky dat a předejte DataRowState hodnotu výčtu jako argument.

    Následující příklad ukazuje, jak vytvořit novou datovou sadu s názvem addedRecords a naplnit ji pouze záznamy, které byly přidány do dataSet1 datové sady.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    

    Následující příklad ukazuje, jak vrátit všechny záznamy, které byly nedávno přidány do Customers tabulky:

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    

Přístup k původní verzi DataRow

Když se provedou změny v datových řádcích, datová sada zachová jak původní (Original), tak novou (Current) verzi řádku. Například před voláním AcceptChanges metody může vaše aplikace přistupovat k různým verzím záznamu (jak je definováno v výčtu DataRowVersion ) a odpovídajícím způsobem zpracovávat změny.

Poznámka:

Různé verze řádku existují až po úpravě a před zavolání AcceptChanges metody. Po zavolání AcceptChanges metody jsou aktuální a původní verze stejné.

Předání hodnoty DataRowVersion spolu s indexem sloupce (nebo názvem sloupce jako řetězce) vrátí hodnotu z verze řádku tohoto sloupce. Změněný sloupec se identifikuje během událostí ColumnChanging a ColumnChanged. Pro účely ověření je vhodná doba ke kontrole různých verzí řádků. Pokud jste však dočasně pozastavili omezení, tyto události se nevyvolají a budete muset programově určit, které sloupce se změnily. Můžete to provést iterací v Columns kolekci a porovnáním různých DataRowVersion hodnot.

Získání původní verze záznamu

  • Přejděte k hodnotě sloupce předáním DataRowVersion řádku, který chcete vrátit.

    Následující příklad ukazuje, jak pomocí DataRowVersion hodnoty získat původní hodnotu CompanyName pole v DataRow:

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    

Přístup k aktuální verzi DataRow

Získání aktuální verze záznamu

  • Získejte přístup k hodnotě sloupce a pak přidejte parametr do indexu, který označuje verzi řádku, který chcete vrátit.

    Následující příklad ukazuje, jak pomocí DataRowVersion hodnoty získat aktuální hodnotu CompanyName pole v DataRow:

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();