Share via


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

Poznámka:

Datové sady a související třídy jsou staršími technologiemi rozhraní .NET Framework z počátku 2000, které aplikacím umožňují pracovat s daty v paměti, zatímco aplikace jsou odpojené od databáze. 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ž se datové sady ukázaly jako velmi úspěšná technologie, doporučujeme, aby nové aplikace .NET používaly 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, můžete ověřit tak, že do samotné datové sady sestavíte ověření. 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 data na hodnoty, zatímco se mění celý řádek dat. 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 vyvolá DataTable několik událostí, když se v záznamu vyskytuje změna:

  • Události ColumnChanging a ColumnChanged události se generují během a po každé změně jednotlivých sloupců. 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 události.
  • Události RowChanging jsou RowChanged 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í je ColumnChanging událost a ColumnChanged události pro konkrétní sloupec, který se mění. Dále jsou události RowChanging a RowChanged události. Pokud se v řádku provádí více změn, události se pro každou změnu vytvoří.

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 EndEdit metoda není volána, když RowChanging jsou RowChanged události 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, ověření sestavení pomocí ColumnChanging události. 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á typovou datovou sadu, můžete vytvořit obslužné rutiny událostí silného typu. 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 obslužné rutiny událostí typu předávají argument, který obsahuje názvy sloupců tabulky, které usnadňují 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 navrženou novou hodnotou.
ColumnChanged Hodnota ve sloupci byla změněna. Událost vám předá řádek a sloupec spolu s navrženou hodnotou.
RowChanging Změny provedené u objektu DataRow se chystá potvrdit zpět do datové sady. Pokud jste metodu BeginEdit nevolali, RowChanging je událost vyvolána pro každou změnu ve sloupci ihned po ColumnChanging vyvolání události. 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 předá vám řádek spolu s hodnotou označující, jaký typ akce (odstraně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 ColumnChangingprocesu aktualizace jsou vyvolány události RowChanginga RowDeleting události. 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.

RowChanged Události ColumnChangeda RowDeleted události jsou události oznámení, které jsou vyvolány 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) z obslužné rutiny události, která mění sloupec.

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

Během události je možné provést RowChanging také ověření.

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 nastavily chybu sloupce, pokud Quantity je sloupec 0 nebo méně. Obslužné rutiny událostí, které mění řádek, 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 datovou sadu v Návrháři datových sad. 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 RowChangingDataTable události v souboru částečné třídy datové sady.

    Tip

    Poklikáním nalevo od názvu tabulky vytvořte obslužnou rutinu události, která mění řádek. 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 datovou sadu v Návrháři datových sad. 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ří soubor částečné třídy pro DataTablesoubor .

    Poznámka:

    Návrhář datových sad pro událost automaticky nevytvoří obslužnou rutinu RowChanging události. 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", "");
        }
    }
    

Načtení 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 GetChangesHasChanges metody 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ískání všech změněné záznamy z datové sady

  • GetChanges Volání metody 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ískání všech změněné záznamy z tabulky dat

  • GetChanges Volání metody 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();
    

Získání 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 v datových řádcích změní, zachová datová sada původní (Original) i nové (Current) verze řá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é.

DataRowVersion Předání hodnoty spolu s indexem sloupce (nebo názvem sloupce jako řetězce) vrátí hodnotu z konkrétní verze řádku daného sloupce. Změněný sloupec se identifikuje během ColumnChanging událostí a ColumnChanged událostí. 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();