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. 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ž 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ě TableAdapter
dat 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:
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.
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.UpdateAll
metoda).
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
.
Aktualizace kódu pro potvrzení změn do souvisejících tabulek před uložením
Poklikejte na tlačítko Uložit na BindingNavigator formuláři 1 v Editoru kódu.
Přidejte řádek kódu pro volání
OrdersBindingSource.EndEdit
metody za řádek, který volá metoduCustomersBindingSource.EndEdit
. Kód v události kliknutí na tlačítko Uložit by měl vypadat přibližně takto:
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ů
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.
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:
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. Booleovský. |
tableName TableAdapter – 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ě. |