Uložit data do databáze
Publikováno: duben 2016
Datová sada je v paměti kopii dat. Pokud upravíte tato data, můžete uložit tyto změny zpět do databáze. Můžete udělat třemi způsoby:
pomocí jedné z volání
Update
metod TableAdapterpomocí jedné z metod TableAdapter DBDirect volání.
voláním metody UpdateAll na
TableAdapterManager
který Visual Studio generuje pro vás při datová sada obsahuje tabulky, které souvisejí s jinými tabulkami v datové sadě.
Když můžete vytvořit datovou vazbu tabulky datové sady na ovládací prvky na formuláři Windows nebo kódu stránky XAML, provede architektura datové vazby tuto práci za vás.
Pokud jste obeznámeni s adaptéry tabulek, můžete přejít přímo na jednu z těchto témat:
Téma | Popis |
---|---|
Postupy: Vkládání nových záznamů do databáze | Postup provádění aktualizací a vloží pomocí objekty TableAdapter nebo objekty příkazu |
Postupy: Aktualizace dat pomocí TableAdapter | Jak provádět aktualizace s objekty TableAdapter. |
Hierarchická aktualizace | Jak provádět aktualizace z datové sady pomocí dvou nebo více souvisejících tabulek. |
Návod: Zpracování výjimky souběžnosti | Způsob zpracování výjimek, když dva uživatelé pokusí změnit stejná data v databázi ve stejnou dobu. |
Postupy: Ukládání dat pomocí transakce | Jak k uložení dat v transakci pomocí oboru názvů System.Transactions a objekt TransactionScope |
Návod: Ukládání dat do transakce | Jak k uložení dat v transakci pomocí oboru názvů System.Transactions. |
Návod: Ukládání dat do databáze (více tabulek) | Jak upravit záznamy a uložit změny ve více tabulkách zpět do databáze. |
Postupy: Ukládání dat z objektu do databáze | Jak předat data z objektu, který není v datové sadě k databázi pomocí TableAdapter DbDirect metody. |
Návod: Ukládání dat pomocí metod TableAdapter DBDirect | Způsob použití objektu TableAdapter odesílat dotazy SQL přímo do databáze. |
Postupy: Uložení datové sady ve formátu XML | Jak uložit datové sady do dokumentu XML. |
Dvoufázová aktualizace
Aktualizace zdroje dat je dvoustupňový proces. Prvním krokem je aktualizace datové sady pomocí nové záznamy, záznamy změněné nebo odstraněné záznamy. Pokud vaše aplikace nikdy odesílá tyto změny zpět do zdroje dat, pak budete mít k aktualizaci.
Pokud odešlete změny zpět do databáze, druhý krok není potřeba. Pokud nepoužíváte ovládací prvky vázané na data, budete muset ručně volat metodu aktualizace stejné TableAdapter (nebo adaptér dat), který jste použili k naplnění datové sady, i když můžete použít také různé adaptéry, například chcete-li přesunout data z jednoho zdroje dat na jiný nebo aktualizovat více zdrojů dat. Pokud nepoužíváte datové vazby a ukládají změny pro tabulky v relaci, budete muset ručně vytvořit instanci proměnné automaticky generované třídy TableAdapterManager a volejte příslušnou metodu UdpateAll.
Proces aktualizace dvoufázová a role DataRowVersion v úspěšné aktualizaci
Datové sady obsahuje kolekce tabulek, které obsahují kolekce řádků. Při přidávání nebo odstraňování řádků, pokud máte v úmyslu později aktualizovat podkladové zdroje dat je nutné použít metody na vlastnost DataTable.DataRowCollection. Tyto metody provádět sledování změn, které jsou potřebné pro aktualizaci zdroje dat. Pokud zavoláte kolekci RemoveAt u vlastnosti řádků, nebude odstranění sdělují zpět do databáze.
Slučování datové sady
Můžete aktualizovat obsah datové sady pomocí slučování s jinou datovou sadu. To zahrnuje kopírování obsahu zdroj datové sady do volání datové sady (označována jako cíl datové sady). Při sloučení datové sady jsou přidány nové záznamy v datové sadě zdrojové do cílové datové sady. Kromě toho další sloupce v datové sadě zdroje jsou přidány do cílové datové sady. Slučování datové sady je užitečné, pokud máte místní datovou sadu a získat druhý datové sady z jiné aplikace nebo součásti, jako jsou webové služby XML, nebo pokud potřebujete k integraci dat z více datových sad.
Při slučování datové sady, můžete předat argument typu Boolean (preserveChanges
), která oznamuje Merge Metoda zda chcete zachovat existující změny v datové sadě cíl. Vzhledem k tomu, že datové sady udržovat více verzí sady záznamů, je důležité mít na paměti, že je více než jedna verze záznamy sloučení. Následující tabulka znázorňuje záznam v dva datové sady, které budou sloučeny:
DataRowVersion | Cílový objekt dataset | Zdroj datové sady |
---|---|---|
Původní | James Wilson | James C. Wilson |
Aktuální | Jan Wilson | James C. Wilson |
Volání Merge metodu na výše uvedené tabulky s preserveChanges=false targetDataset.Merge(sourceDataset)
má za následek následující:
DataRowVersion | Cílový objekt dataset | Zdroj datové sady |
---|---|---|
Původní | James C. Wilson | James C. Wilson |
Aktuální | James C. Wilson | James C. Wilson |
Volání Merge metodu s preserveChanges = true targetDataset.Merge(sourceDataset, true)
má za následek následující:
DataRowVersion | Cílový objekt dataset | Zdroj datové sady |
---|---|---|
Původní | James C. Wilson | James C. Wilson |
Aktuální | Jan Wilson | James C. Wilson |
Upozornění
V preserveChanges = true
scénář, pokud RejectChanges Metoda je volána na záznam v datové sadě cíl, pak se vrátí k původní data z zdroj datové sady. To znamená, že pokud se pokusíte aktualizovat původní zdroj dat s datovou sadu cíl, ji nebudete moci najít původní řádek aktualizace. Po vyplnění jinou datovou sadu s aktualizované záznamy ze zdroje dat můžete zabránit narušení souběžného zpracování a následnému provedením sloučení brání narušení souběžného zpracování. (Pokud jiný uživatel upraví záznam ve zdroji dat poté, co bylo vyplněno datovou sadu dojde k porušení souběžnosti.)
Omezení aktualizací
Chcete-li provést změny stávající řádek dat, přidat nebo aktualizovat data v jednotlivých sloupcích. Obsahuje-li datovou sadu omezení (například cizí klíče nebo hodnotu Null omezení), je možné, že při aktualizaci záznamu – po dokončení aktualizace jeden sloupec, ale předtím, než se dostanete na další stránku – záznamu může být dočasně v chybovém stavu.
Chcete-li zabránit narušení předčasné omezení můžete dočasně pozastavit aktualizace omezení. To má dva účely:
Chyba brání hlášeny při aktualizaci jeden sloupec předtím, než se dostanete do jiného sloupce.
Ji pozastaví určité aktualizace vyvolány události od právě (události, které se často používají k ověření).
Po dokončení aktualizace můžete znovu povolit omezení kontroly, které také znovu povolí události aktualizace a jejich vyvolává.
Poznámka
Ve Windows Forms architektura datové vazby integrována do objektu datagrid pozastaví omezení kontrolu, dokud se aktivuje mimo řádek, a není nutné explicitně zavolat BeginEdit, EndEdit nebo CancelEdit metody.
Omezení jsou automaticky zakázáno, pokud Merge Metoda je volána na datové sady. Po dokončení sloučení v případě, že neexistují žádná omezení na datovou sadu, která nemůže být povolena, pak ConstraintException je vyvolána výjimka. V této situaci EnforceConstraints je vlastnost nastavena na false
a všechny narušení omezení musí být vyřešeny před obnovením EnforceConstraints vlastnost true
.
Po dokončení aktualizace můžete znovu povolit omezení kontroly, které také znovu povolí události aktualizace a jejich vyvolává.
Další informace o pozastavení událostí naleznete v tématu Vypnutí omezení při naplňování datové sady.
Chyby aktualizace datové sady
Při aktualizaci záznamu v datové sadě, je možné k chybě. Například může být omylem zapsat data do sloupce, který je chybný datového typu, nebo je příliš dlouhý, nebo má jiný problém integrity. Nebo můžete mít specifické pro aplikaci ověřovací kontroly, které může být spojeno vlastní chyby během jakékoli fázi událost aktualizace. Další informace naleznete v tématu Ověření dat v datových sadách.
Zachování informací o změnách
Informace o změnách v datové sadě jsou udržovány dvěma způsoby: označením řádek, který označuje, zda byl změněn (RowState) a udržováním více kopií záznamu (DataRowVersion). Pomocí těchto informací procesy můžete zjistit, co se změnilo v datové sadě a ke zdroji dat můžete odeslat příslušné aktualizace.
Vlastnost RowState
RowState Vlastnost DataRow objektu je hodnota, která poskytuje informace o stavu konkrétní řádek s daty.
Následující tabulka uvádí možné hodnoty DataRowState výčtu:
Hodnota DataRowState | Popis |
---|---|
Added | Řádek byl přidán jako položku, kterou chcete DataRowCollection. (Řádek v tomto stavu nemá odpovídající původní verze, protože neexistuje v době poslední AcceptChanges byla volána metoda). |
Deleted | Řádek byl odstraněn, pomocí Delete z DataRow objektu. |
Detached | Řádek byl vytvořen, ale není součástí žádné DataRowCollection. A DataRow objekt je v tomto stavu ihned po jeho vytvoření a předtím, než je přidána do kolekce, nebo pokud byla odebrána z kolekce. |
Modified | Hodnota sloupce v řádku byl změněn nějakým způsobem. |
Unchanged | Řádek nebyl změněn od AcceptChanges byla volána naposledy. |
DataRowVersion – výčet
Datové sady udržovat více verzí sady záznamů.DataRowVersion Výčet DataRow objektu je hodnota, která lze použít k vrácení konkrétní verze DataRow objektu.
Následující tabulka uvádí možné hodnoty DataRowVersion výčtu:
Hodnota DataRowVersion | Popis |
---|---|
Current | Aktuální verze záznam obsahuje všechny změny prováděné u záznamu od posledního AcceptChanges byla volána. Pokud byl odstraněn řádek není žádná aktuální verze. |
Default | Výchozí hodnota záznamu, podle definice v datové sadě schématu nebo datového zdroje. |
Original | Jak bylo, že byly potvrzeny poslední změny času v datové sadě, je původní verze záznamu kopii záznamu. V praxi obvykle se jedná verze záznamu pro čtení z datového zdroje. |
Proposed | Navrhovaná verze záznam, který je k dispozici, dočasně, zatímco jsou uprostřed aktualizace – tedy mezi čas jste volali metodu BeginEdit Metoda a EndEdit Metoda. Obvykle se navrhované verze záznamu v obslužné rutině události, jako RowChanging. Vyvolání CancelEdit Metoda vrátí zpět změny a odstraní navrhované verze datový řádek. |
Původní a aktuální verze jsou užitečné, pokud se ke zdroji dat přenášejí informace o aktualizaci. Při aktualizaci odeslání ke zdroji dat, nové informace pro databázi je obvykle v aktuální verzi záznamu. Informace z původní verze slouží k vyhledání záznam, který chcete aktualizovat. Například v případě, kde se změní primární klíče v záznamu, musí mít způsob, jak vyhledat správné záznam ve zdroji dat za účelem aktualizace změny. Pokud neexistovala žádná původní verze by být záznam s největší pravděpodobností připojen ke zdroji dat, výsledná pouze v extra nežádoucí záznamu, ale v jednom záznamu, který je nesprávné a je zastaralý. Dvě verze používají také v řízení souběžnosti; můžete porovnat původní verze proti záznam ve zdroji dat. Chcete-li zjistit, pokud záznam byl změněn, protože byla načtena do datové sady.
Navrhovaná verze je užitečné, když je potřeba provést ověření před skutečně provedení změn do datové sady.
I v případě, že došlo ke změně záznamy, existují není vždy původní nebo aktuální verze tohoto řádku. Při vložení nového řádku do tabulky není žádná původní verze, aktuální verze. Podobně pokud odstranit řádek v tabulce voláním Delete
Metoda, je původní verze, ale žádná aktuální verze.
Můžete otestovat, zda existuje záznam určité verze pomocí dotazu na řádek dat HasVersion Metoda. Buď verzi záznamu je možné otevřít předáním DataRowVersion Hodnota výčtu jako nepovinný argument při požadavku hodnota sloupce.
Získávání změněné záznamy
Je běžné aktualizaci každý záznam v datové sadě. Uživatel může například pracovat s použitím Windows Forms DataGridView ovládací prvek, který zobrazuje mnoho záznamů. Uživatel může však aktualizovat pouze několik položek, odstraníte jeden a vložit nový. Datové sady a data v tabulkách metodu (GetChanges
) pro vrácení pouze řádky, které byly změněny.
Můžete vytvořit podmnožiny změněné záznamy pomocí GetChanges
Metoda tabulky dat (GetChanges) nebo sady dataset (GetChanges) samotného. Pokud zavoláte metodu pro tabulku dat, vrátí kopii tabulky se pouze změněné záznamy. Podobně pokud zavoláte metodu datovou sadu, získáte novou datovou sadu s pouze změněné záznamy v něm.GetChanges
sám o sobě vrátí všechny změněné záznamy. Naopak předáním požadované množství DataRowState jako parametr GetChanges
metodu, můžete určit jaké podmnožinou změněné záznamy, které chcete, aby: nově přidané záznamů, záznamy, které jsou označené k odstranění, odpojit záznamy nebo změněné záznamy.
Získávání podmnožinu změněné záznamy je užitečné, pokud chcete odeslat záznamy do jiné komponenty ke zpracování. Místo odeslání celé sady dat, můžete snížit režijní komunikovat s jinou součástí získáním pouze záznamy, které potřebuje komponentu. Další informace naleznete v tématu Postupy: Načítání změněných řádků.
Potvrzení změn v datové sadě
Při provedení změn v datové sadě, RowState změněných řádků je nastavena. Původní a aktuální verze záznamy navázat a udržovat a zpřístupněny pomocí RowVersion vlastnost. Metadata uložená v těchto vlastnostech představující změny je nutný k odeslání správné aktualizací ke zdroji dat.
Pokud změny odráží aktuální stav zdroje dat, již nepotřebujete zachovat tyto informace. Obvykle jsou k dispozici dvakrát když jsou synchronizována datovou sadu a její zdroj:
Ihned po informace mají načtena do datové sady, například při čtení dat ze zdroje.
Po odeslání změn od objektu dataset ke zdroji dat (ale před, protože by dojít ke ztrátě informace o změně potřebné k odesílání změn databáze).
Můžete potvrdit čekající změny do datové sady pomocí volání AcceptChanges Metoda. Obvykle AcceptChanges by byla volána v následujících časech ve vaší aplikaci.
Poté, co jste načetli datovou sadu. Pokud načíst datové sady pomocí volání objektu TableAdapter
Fill
Metoda pak adaptér pro vás automaticky provede změny. Však Pokud načtete sloučením jiné datové sady do něj datové sady, pak budete muset ručně potvrdíte změny.Po jste odeslali změn datové sady na jiný proces, jako jsou webové služby XML.
Upozornění
Provádění změn tímto způsobem vymaže všechny informace o změně. Až poté, co jste provedli všechny operace, ve kterých vaše aplikace závisí na tom, jaké změny byly provedeny v datové sadě není potvrzení změn.
Tato metoda provede následující akce:
Zapíše Current verze záznamu do jeho Original verze přepsat původní verzi.
Odebere všechny řádek, jehož RowState je vlastnost nastavena na Deleted.
AcceptChanges Metoda je k dispozici tři úrovně. Můžete volat na DataRow objektu, který potvrdí změny právě daného řádku. Ji můžete také volat na DataTable objekt, který chcete potvrdit všechny řádky v tabulce, nebo na DataSet objekt, který chcete potvrdit všechny čekající změny v všechny záznamy všech tabulek datové sady.
Následující tabulka popisuje, které změny se potvrdí na co objekt že je zavolána metoda na základě.
Metoda | Výsledek |
---|---|
DataRow.AcceptChanges | Změny jsou potvrzené pouze na konkrétní řádek |
DataTable.AcceptChanges | Jsou potvrzené změny na všechny řádky v tabulce konkrétní |
DataSet.AcceptChanges | Jsou potvrzené změny na všechny řádky ve všech tabulkách datové sady |
Poznámka
Pokud načíst datové sady pomocí volání objektu TableAdapter Fill
Metoda, není nutné explicitně přijetí změn; ve výchozím nastavení Fill
volání metod AcceptChanges
Metoda při vyplňování tabulky dat byl dokončen.
Související metoda RejectChanges
, vrátí zpět změny zkopírováním Original verze zpět do Current verze záznamů a nastavení RowState z každého záznamu zpět a Unchanged.
Ověřování dat
Chcete-li ověřit, zda data v aplikaci splňuje požadavky na procesy, které je předána, máte často přidat ověřování. To může zahrnovat kontrolu, že vstup uživatele ve formuláři je správný, ověřování dat odeslaných do vaší aplikace jinou aplikací nebo dokonce kontrola informace počítá uvnitř komponent spadá do omezení data požadavky na zdroje a aplikace.
Je nutné ověřit data v několika způsoby:
V obchodní vrstvě, přidáním kódu do aplikace můžete ověřit data. Datová sada je jedno místo, můžete to provést. Datová sada obsahuje některé z výhod back-end ověření – například je lze využít pro ověření změn, jako jsou změna hodnoty řádků a sloupců. Další informace naleznete v tématu Ověření dat v datových sadách.
V prezentační vrstvě přidáním ověření do formulářů. Další informace naleznete v tématu Ověření uživatelského vstupu ve Windows Forms.
V datech back-endu odesílá data do zdroje dat – například databáze – a díky kterému jej přijmout nebo odmítnout data. Při práci s databází, která má sofistikované zařízení pro ověřování dat a poskytuje informace o chybě, může to být praktické přístup, protože můžete ověřit data bez ohledu na to, odkud pocházejí z. Je však nemusí pojmout požadavky na ověření specifické pro aplikaci. Kromě toho s ověření dat zdroje dat může způsobit mnoho zpátečních cest ke zdroji dat, v závislosti na tom, jak vaše aplikace usnadňuje řešení chyb při ověřování vyvolaných back-end.
Důležité
Při použití příkazů dat s CommandType vlastnost nastavena na hodnotu Text, pečlivě zkontrolujte informace, které se odesílá z klienta před jeho odesláním do databáze. Uživatelé se zlými úmysly se může pokusit o odesílání (Vložit) modified nebo další příkazy SQL ve snaze o získání neautorizovaného přístupu nebo poškození databáze. Před přenosem vstupu uživatele na databázi vždy ověřte, že informace jsou neplatné. je vhodné, vždy použijte parametrizované dotazy nebo uložené procedury, pokud je to možné. Další informace naleznete v tématu Script Exploits Overview.
Poté, co byly provedeny změny v datové sadě, mohou přenášet změny ke zdroji dat. Nejčastěji to provést pomocí volání Update
Metoda TableAdapter (nebo adaptér dat). Metoda projde každý záznam v tabulce dat, určuje, jaký typ aktualizace je vyžadováno (aktualizaci, vložení nebo odstranění), pokud existuje a potom spuštěn příslušný příkaz.
Jak je aktualizace přeneseno do zdroje dat
Jako ilustraci jak provedeny aktualizace Předpokládejme, že vaše aplikace používá obsahující do jedné tabulky datového datové sady. Aplikace načte dva řádky z databáze. Po načtení vypadá v tabulce dat v paměti takto:
(RowState) CustomerID Name Status
(Unchanged) c200 Robert Lyon Good
(Unchanged) c400 Nancy Buchanan Pending
Vaše aplikace Petr Stoklasa stav změní na "Upřednostňovaných." V důsledku této změny hodnotu RowState změny vlastností pro daný řádek z Unchanged do Modified. Hodnota RowState vlastnost pro první řádek zůstane Unchanged. Tabulka dat nyní vypadá takto:
(RowState) CustomerID Name Status
(Unchanged) c200 Robert Lyon Good
(Modified) c400 Nancy Buchanan Preferred
Aplikace nyní zavolat Update
Metoda předávat datové sady do databáze. Metoda zkontroluje, zda obsahuje každý řádek zase. Pro první řádek metody přenáší žádný příkaz SQL na databázi, protože daný řádek nebyl změněn od původně načtení z databáze.
Pro druhý řádek však Update
Metoda automaticky vyvolá příkaz správná data a odesílá do databáze. Specifické syntaxe příkazu SQL závisí na dialekt podporovaných základní úložiště dat. SQL. Ale následující obecné vlastnosti příkazu SQL přenášených zajímavosti:
Přenášených příkaz jazyka SQL je příkazu UPDATE. Adaptér ví používat příkaz UPDATE, protože hodnota RowState vlastnost je Modified.
Přenášených příkaz SQL obsahuje klauzuli WHERE označující, že cíl pro příkaz UPDATE je řádek jehož
CustomerID = 'c400'
. Cílový řádek tuto část příkazu SELECT odlišuje od všech ostatních, protožeCustomerID
je primární klíč cílové tabulky. Informace pro klauzuli WHERE je odvozen od původní verze záznamu (DataRowVersion.Original
), v případě, že byly změněny hodnoty požadované k identifikaci řádku.Přenášených příkaz SQL obsahuje klauzuli SET, a nastavte nové hodnoty upravené sloupců.
Poznámka
Pokud TableAdapter
UpdateCommand
vlastnost byla nastavena na název uložené procedury, adaptér není vytvoření příkazu SQL. Místo toho volá uloženou proceduru s příslušnými parametry předané.
Předávání parametrů
Hodnoty pro záznamy, které aktualizují v databázi se obvykle předávají pomocí parametrů. Když TableAdapter Update
Metoda spustí příkaz UPDATE, je nutné zadat hodnoty parametrů. Získává tyto hodnoty z Parameters
kolekce pro příkaz příslušná data – v takovém případě UpdateCommand
objektu v objektu TableAdapter.
Pokud jste použili nástroje sady Visual Studio ke generování datový adaptér UpdateCommand
objekt bude obsahovat kolekci parametrů, které odpovídají každý parametr zástupný symbol v příkazu.
SqlParameter.SourceColumn Vlastnost každý parametr odkazuje na sloupec v tabulce data. Například SourceColumn
vlastnost pro au_id
a Original_au_id
parametry je nastavena na libovolné sloupec v tabulce dat obsahuje kód autora. Pokud je adaptér Update
spuštěna metoda přečte Autor sloupec id z záznamu aktualizované a vyplní hodnoty do příkazu.
V příkazu UPDATE je třeba zadat obě nové hodnoty (ty, které budou zapsány do záznamu) stejně jako původní hodnoty (tak, aby záznam, který chcete aktualizovat, se může nacházet v databázi). Proto existují dva parametry pro každou hodnotu: jeden pro klauzuli SET a jinou pro klauzuli WHERE. Oba parametry čtení dat ze záznamu aktualizované, ale dostanou různé verze na základě parametru na hodnotu ve sloupci SqlParameter.SourceVersion vlastnost. Parametr pro klauzuli SET získá aktuální verzi a parametr klauzule WHERE získá původní verze.
Poznámka
Hodnoty lze také nastavit Parameters
kolekce sami v kódu, což by obvykle provést v obslužné rutině události pro adaptér dat RowChanging událostí.
Viz také
TableAdapter – přehled
Postupy: Aktualizace dat pomocí TableAdapter
Přehled datových aplikacích v sadě Visual Studio
Připojení k datům v sadě Visual Studio
Příprava vaší aplikace k příjmu dat
Načítání dat do aplikace
Vytvoření vazby ovládacích prvků k datům v sadě Visual Studio
Upravování dat ve vaší aplikaci
Ověřování dat
Ukládání dat