Sdílet prostřednictvím


Hierarchická aktualizace ve vývoji rozhraní .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í.

Hierarchická aktualizace odkazuje na proces ukládání aktualizovaných dat (z datové sady se dvěma nebo více souvisejícími tabulkami) zpět do databáze při zachování pravidel referenční integrity. Referenční integrita odkazuje na pravidla konzistence poskytovaná omezeními v databázi, která řídí chování vkládání, aktualizace a odstraňování souvisejících záznamů. Jedná se například o referenční integritu, která vynucuje vytvoření záznamu zákazníka před povolením vytvoření objednávek pro daného zákazníka. Další informace o relacích v datových sadách najdete v tématu Relace v datových sadách.

Funkce hierarchické aktualizace používá TableAdapterManager ke správě TableAdapterdat v zadané datové sadě. Komponenta TableAdapterManager je třída vygenerovaná sadou Visual Studio, nikoli typ .NET. Když přetáhnete tabulku z okna Zdroje dat na stránku Windows Form nebo WPF, Visual Studio přidá do formuláře nebo stránky proměnnou typu TableAdapterManager a zobrazí se v návrháři v zásobníku komponent. Podrobné informace o TableAdapterManager třídě naleznete v Části TableAdapterManager Reference TableAdapterErs.

Datová sada ve výchozím nastavení považuje související tabulky za "pouze relace", což znamená, že nevynucuje omezení cizího klíče. Toto nastavení můžete upravit v době návrhu pomocí Návrháře datových sad. Vyberte relační čáru mezi dvěma tabulkami a zobrazte dialogové okno Relace . Změny, které tady provedete, určují, jak se TableAdapterManager chovají při odesílání změn v souvisejících tabulkách zpět do databáze.

Povolení hierarchické aktualizace v datové sadě

Ve výchozím nastavení je hierarchická aktualizace povolená pro všechny nové datové sady přidané nebo vytvořené v projektu. Zapněte nebo vypněte hierarchickou aktualizaci nastavením vlastnosti Hierarchical Update typu datové sady v datové sadě na hodnotu True nebo False:

Nastavení hierarchické aktualizace

Vytvoření nové relace mezi tabulkami

Pokud chcete vytvořit novou relaci mezi dvěma tabulkami, vyberte v Návrháři datových sad záhlaví každé tabulky a pak klikněte pravým tlačítkem myši a vyberte Přidat relaci.

Hierarchická aktualizace – přidání relační nabídky

Vysvětlení omezení cizího klíče, kaskádových aktualizací a odstranění

Je důležité pochopit, jak se omezení cizího klíče a kaskádové chování v databázi vytvářejí v kódu vygenerované datové sady.

Ve výchozím nastavení se datové tabulky v datové sadě generují s relacemi (DataRelation), které odpovídají relacím v databázi. Relace v datové sadě se ale negeneruje jako omezení cizího klíče. Konfiguruje DataRelation se pouze jako Relační pouze bez UpdateRule nebo DeleteRule v účinnosti.

Ve výchozím nastavení jsou kaskádové aktualizace a kaskádové odstranění vypnuté, i když je relace databáze nastavená s kaskádovými aktualizacemi nebo zapnutými kaskádovými odstraněními. Například vytvoření nového zákazníka a nové objednávky a následné pokus o uložení dat může způsobit konflikt s omezeními cizího klíče, která jsou definována v databázi. Další informace najdete v tématu Vypnutí omezení při vyplňování datové sady.

Nastavení pořadí pro provádění aktualizací

Nastavení pořadí provádění aktualizací nastaví pořadí jednotlivých vložení, aktualizací a odstranění, které jsou potřeba k uložení všech upravených dat ve všech tabulkách datové sady. Když je povolena hierarchická aktualizace, vložení se nejprve provede, pak se aktualizuje a pak odstraní. UpdateOrder Poskytuje TableAdapterManager vlastnost, která se dá nastavit tak, aby nejprve prováděla aktualizace, pak vloží a pak odstraní.

Poznámka:

Je důležité si uvědomit, že pořadí aktualizací je vše inkluzivní. To znamená, že při provedení aktualizací se vloží a odstraní pro všechny tabulky v datové sadě.

Chcete-li nastavit UpdateOrder vlastnost, po přetažení položek z okna Zdroje dat do formuláře vyberte v TableAdapterManager zásobníku součásti a potom nastavte UpdateOrder vlastnost v okně Vlastnosti .

Vytvoření záložní kopie datové sady před provedením hierarchické aktualizace

Při ukládání dat (voláním TableAdapterManager.UpdateAll() metody) TableAdapterManager se pokusí aktualizovat data pro každou tabulku v jedné transakci. Pokud některá část aktualizace pro libovolnou tabulku selže, celá transakce se vrátí zpět. Ve většině případů vrácení zpět vrátí vaši aplikaci do původního stavu.

Někdy ale můžete chtít datovou sadu obnovit ze záložní kopie. Jeden z příkladů může nastat, když používáte hodnoty automatického přírůstku. Pokud například operace uložení není úspěšná, hodnoty automatického přírůstku se v datové sadě neobnovují a datová sada bude dál vytvářet hodnoty automatického přírůstku. Tím se v číslování ponechá mezera, která nemusí být v aplikaci přijatelná. V situacích, kdy se jedná o problém, TableAdapterManager poskytuje BackupDataSetBeforeUpdate vlastnost, která nahradí existující datovou sadu záložní kopií, pokud transakce selže.

Poznámka:

Záložní kopie je v paměti pouze v době, kdy je metoda spuštěná TableAdapterManager.UpdateAll . Proto neexistuje žádný programový přístup k této zálohované datové sadě, protože buď nahradí původní datovou sadu, nebo přestane být obor, jakmile TableAdapterManager.UpdateAll metoda dokončí spuštění.

Úprava vygenerovaného kódu pro uložení pro provedení hierarchické aktualizace

Uložte změny ze souvisejících datových tabulek v datové sadě do databáze zavoláním TableAdapterManager.UpdateAll metody a předáním názvu datové sady, která obsahuje související tabulky. Spusťte například metodu TableAdapterManager.UpdateAll(NorthwindDataset) pro odesílání aktualizací ze všech tabulek v NorthwindDataset do back-end databáze.

Po vyřazení položek z okna Zdroje dat se do události automaticky přidá Form_Load kód, který naplní každou tabulku (metody TableAdapter.Fill ). Do události BindingNavigator kliknutí na tlačítko Uložit se také přidá kód pro uložení dat z datové sady zpět do databáze (TableAdapterManager.UpdateAllmetoda).

Vygenerovaný uložený kód obsahuje také řádek kódu, který volá metodu CustomersBindingSource.EndEdit . Konkrétně se volá EndEdit metoda prvního BindingSource, který je přidán do formuláře. Jinými slovy, tento kód je generován pouze pro první tabulku, která je přetažena z okna Zdroje dat do formuláře. Volání EndEdit potvrdí všechny změny, které jsou v procesu v jakýchkoli ovládacích prvcích vázaných na data, které jsou aktuálně upravovány. Proto pokud ovládací prvek vázané na data má stále fokus a kliknete na tlačítko Uložit , všechny čekající úpravy v daném ovládacím prvku jsou potvrzeny před skutečným uložením ( TableAdapterManager.UpdateAll metoda).

Poznámka:

Návrhář datových sad přidá BindingSource.EndEdit kód pouze pro první tabulku, která se do formuláře přehodí. Proto musíte přidat řádek kódu pro volání BindingSource.EndEdit metody pro každou související tabulku ve formuláři. V tomto názorném postupu to znamená, že musíte přidat volání metody OrdersBindingSource.EndEdit .

  1. Poklikejte na tlačítko Uložit na BindingNavigator formuláři 1 v Editoru kódu.

  2. Přidejte řádek kódu pro volání OrdersBindingSource.EndEdit metody za řádek, který volá metodu CustomersBindingSource.EndEdit . Kód v události kliknutí na tlačítko Uložit by měl vypadat přibližně takto:

    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Kromě potvrzení změn v související podřízené tabulce před uložením dat do databáze může být také nutné před přidáním nových podřízených záznamů do datové sady potvrdit nově vytvořené nadřazené záznamy. Jinými slovy, může být nutné přidat nový nadřazený záznam (Customer) do datové sady před omezeními cizího klíče povolit přidání nových podřízených záznamů (Orders) do datové sady. K tomu můžete použít podřízenou BindingSource.AddingNew událost.

Poznámka:

To, jestli musíte potvrdit nové nadřazené záznamy, závisí na typu ovládacího prvku, který se používá k vytvoření vazby ke zdroji dat. V tomto názorném postupu použijete jednotlivé ovládací prvky k vytvoření vazby k nadřazené tabulce. To vyžaduje další kód k potvrzení nového nadřazeného záznamu. Pokud byly nadřazené záznamy místo toho zobrazeny v komplexním ovládacím prvku vazby, jako je například DataGridViewtato další EndEdit volání nadřazeného záznamu, nebude nutné. Důvodem je to, že základní funkce datové vazby ovládacího prvku zpracovává potvrzení nových záznamů.

Přidání kódu pro potvrzení nadřazených záznamů v datové sadě před přidáním nových podřízených záznamů

  1. Vytvořte obslužnou rutinu OrdersBindingSource.AddingNew události pro událost.

    • Otevřete Formulář 1 v návrhovém zobrazení, vyberte OrdersBindingSource na hlavním panelu komponent, v okně Vlastnosti vyberte Události a potom poklikejte na událost AddingNew.
  2. Přidejte řádek kódu do obslužné rutiny události, která volá metodu CustomersBindingSource.EndEdit . Kód v obslužné rutině OrdersBindingSource_AddingNew události by měl vypadat nějak takto:

    this.customersBindingSource.EndEdit();
    

Referenční dokumentace tableAdapterManager

Ve výchozím nastavení TableAdapterManager se třída generuje při vytváření datové sady, která obsahuje související tabulky. Chcete-li zabránit generování třídy, změňte hodnotu Hierarchical Update vlastnosti datové sady na false. Když přetáhnete tabulku, která má relaci na návrhovou plochu stránky Windows Form nebo WPF, Visual Studio deklaruje členovou proměnnou třídy. Pokud nepoužíváte vazbu dat, musíte proměnnou deklarovat ručně.

Třída TableAdapterManager není typem .NET. Proto ho nemůžete vyhledat v dokumentaci. Vytvoří se v době návrhu jako součást procesu vytváření datové sady.

Níže jsou uvedené často používané metody a vlastnosti TableAdapterManager třídy:

Člen Popis
UpdateAll Metoda Uloží všechna data ze všech tabulek dat.
BackUpDataSetBeforeUpdate Vlastnost Určuje, zda se má před spuštěním TableAdapterManager.UpdateAll metody vytvořit záložní kopie datové sady. Boolean.
tableNameTableAdapter – vlastnost Představuje .TableAdapter Vygenerovaná TableAdapterManager vlastnost obsahuje vlastnost pro každou TableAdapter , která spravuje. Například datová sada s tabulkou Zákazníci a Objednávky se vygeneruje s datovou sadou TableAdapterManager obsahujícími CustomersTableAdapter a OrdersTableAdapter vlastnostmi.
UpdateOrder Vlastnost Řídí pořadí jednotlivých příkazů vložení, aktualizace a odstranění. Nastavte tuto hodnotu na jednu z hodnot v výčtu TableAdapterManager.UpdateOrderOption .

Ve výchozím nastavení je nastavena UpdateOrder na InsertUpdateDelete. To znamená, že se vloží, pak aktualizuje a pak odstraní pro všechny tabulky v datové sadě.