Sada záznamů: Další informace o aktualizacích (ODBC)
Toto téma platí pro třídy knihovny MFC rozhraní ODBC.
Toto téma vysvětluje:
Jak jiné operace, například transakce, ovlivní příkaz UPDATE.
Váš příkaz UPDATE a ty jiných uživatelů.
Další informace o funkcích Update a Delete.
[!POZNÁMKA]
Toto téma se týká objektů odvozených z třídy CRecordset, ve které nebylo naimplementováno hromadné načítání řádku. Pokud máte naimplementováno hromadné načítání řádku, tak se nevztahuje na některé informace.Nemůžete volat členské funkce AddNew, Edit, Delete a Update; můžete však provádět transakce.Další informace o hromadném načítání řádku, naleznete v tématu Sada záznamů: Hromadné načítání záznamů (ODBC):
Jak jiné operace ovlivňují příkaz Update
Vaše aktualizace jsou ovlivněny transakcemi, které jsou platné v době aktualizace, ukončením sady záznamu před transakcí a jejím posunutím před dokončení transakce.
Jak transakce ovlivňují aktualizace (ODBC)
Nad rámec porozumění způsobu práce AddNew, Edit a Delete, je důležité pochopit, jak fungují členské funkce BeginTrans, CommitTrans a Rollback z CDatabase s funkcemi Update z CRecordset.
Ve výchozím nastavení, volání AddNew a Edit ovlivní zdroj dat ihned při zavolání UpdateVolání Delete se projeví okamžitě.Můžete však vytvořit transakci a provést dávku takových volání.Aktualizace nejsou trvalé, dokud je nepotvrdíte.Pokud změníte názor, můžete transakci odvolat namísto jejího potvrzení.
Další informace o transakčních naleznete v části Transakce (ODBC).
Jak uzavření sady záznamů ovlivňuje aktualizace
Pokud uzavřete sadu záznamů nebo její přidružené CDatabase objekty, s nedokončenými transakcemi (nezavolali jste CDatabase::CommitTrans nebo CDatabase::Rollback), je transakce vrácena zpět automaticky (neplatí to v případě, že používáte databázový stroj Microsoft Jet).
Upozornění |
---|
Používáte-li databázový stroj Microsoft Jet, uzavření sady záznamů uvnitř explicitní transakce nemá za následek uvolnění řádků, které byly změněny nebo zámků, které byly umístěny, dokud explicitní transakce není potvrzena nebo vrácena zpět.Je doporučeno vždy otevřít i zavřít sadu záznamů uvnitř nebo vně explicitní transakce Jet. |
Jak posun ovlivní aktualizace
Když použijete příkaz Sada záznamů: Posouvání (ODBC) na sadě záznamů, je vyrovnávací paměť vyplněna každým novým záznamem (předchozí záznam není uložen).Posouvání přeskakuje dříve odstraněné záznamy.Pokud použijete příkaz Scroll po volání AddNew nebo Edit bez volání Update, CommitTrans nebo Rollback, veškeré změny budou ztraceny (bez upozornění) a nové záznamy budou přeneseny do vyrovnávací paměti pro úpravy.Vyrovnávací paměť pro úpravu je vyplněna záznamy, na které jste se posunuli, uložené záznam jsou uvolněny a nedošlo k žádné změně ve zdroji dat.Tyto informace platí pro AddNew i pro Edit.
Vaše aktualizace a aktualizace jiných uživatelů
Když používáte sadu záznamů k aktualizaci dat, budou vaše aktualizace ovlivňovat jiné uživatele.Podobně aktualizace jiných uživatelů během platnosti vaší sady záznamů ovlivní vás.
Ve víceuživatelský prostředí mohou jiní uživatelé otevřít sadu záznamů, která obsahuje některé stejné záznamy, které jste vybrali v vaší sadě záznamů.Změny záznamů, před tím než je načtete, se projeví ve vaší sadě záznamů.Protože dynamické sety načítají záznam pokaždé, když se na něj posunete, dynamické sety reflektují změny pokaždé, kdy dochází k posunutí záznamu.Statické sety načítají záznam pří jeho prvním posunutí, statické sety tedy reflektují pouze ty změny, ke kterým dochází před původním posunutím k záznamu.
Záznamy přidané jinými uživateli po otevření vaší sady záznamů, se nezobrazí ve vaší sadě záznamů dokud o ně nepožádáte.Pokud je vaše sada záznamů dynamická sada, úpravy existující sady záznamů jiným uživatelem se zobrazí ve vaší dynamické sadě při posunutí na daný záznam.Pokud vaše sada záznamů je statická sada, úpravy se nezobrazí, dokud nejsou vyžádány statickou sadou.Pokud chcete zobrazit záznamy při přidání nebo odstranění jinými uživateli ve statické sadě nebo záznamy přidané jinými uživateli ve vaší dynamické sadě, zavolejte CRecordset::Requery k znovu vytvoření sady záznamů. (Všimněte si, že odstranění jiných uživatelů se zobrazí ve vaší dynamické sadě.) Může se také zavolat Requery, chcete-li zobrazit záznamy, ale nikoli zobrazit vaše odstranění.
Tip
Chcete-li vynutit uložení celé statické sady do mezipaměti, zavolejte MoveLast ihned po otevření statické sady.Potom voláním MoveFirst začněte zpracovávat záznamy.MoveLast je ekvivalentní posouvání přes všechny záznamy, ale získává je všechny najednou.Upozorňujeme však, že to může snížit výkon a nemusí být optimální u některých ovladačů.
Účinky aktualizace na jiné uživatele jsou podobné jako jejich účinky na vás.
Další informace o aktualizaci a odstranění
Tento oddíl poskytuje další informace, které usnadňují práci s Update a Delete.
Úspěšné a neúspěšné pokusy o aktualizaci
Pokud Update uspěje, režim AddNew nebo Edit se ukončí.Chcete-li začít režim AddNew nebo Edit znovu, zavolejte AddNew nebo Edit.
Pokud Update neuspěje (vrátí hodnotu FALSE nebo výjimka), zůstanete v režimu AddNew nebo Edit, v závislosti na tom, která funkce byla volána naposledy.Pak můžete provést jednu z následujících možností:
Upravit pole datových členů a a zkusit Update znovu.
Zavolejte AddNew k resetování datových členů pole na hodnotu NULL, nastavení hodnoty polí datových členů a potom zavolání Update znovu.
Zavolejte Edit znovu k načtení hodnot, které byly v sadě záznamů před prvním voláním AddNew nebo Edit, nastavte hodnoty polí datových členů a potom zavolejte Update znovu.Po úspěšném volaní Update(s výjimkou po volání AddNew), v polích datových členů zůstanou zachovány jejich nové hodnoty.
Volání Move (včetně Move s parametr AFX_MOVE_REFRESHnebo 0), které vyprázdní všechny změny a ukončí všechny režimy AddNew nebo Edit v platnost.
Aktualizace a odstranění
Tato část se týká jak Update tak Delete.
V Update nebo Delete operacích, by měl být vždy aktualizován pouze jeden záznam.Tento záznam je aktuální záznam, který odpovídá hodnotám dat v polích sady záznamů.Pokud z nějakého důvodu nejsou ovlivněny žádné záznamy nebo je ovlivněno více záznamů, je vyvolána výjimka obsahující některou z následujících RETCODE hodnot:
AFX_SQL_ERROR_NO_ROWS_AFFECTED
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED
V případě, že jsou vyvolány tyto výjimky, zůstanete ve stavu AddNew nebo Edit, ve kterém jste byli při volání Update nebo Delete.Zde jsou uvedeny obvyklé scénáře, v nichž můžete vidět tyto výjimky.Z největší pravděpodobností uvidíte:
AFX_SQL_ERROR_NO_ROWS_AFFECTED při použití režimu optimistického uzamčení a jiný uživatel změnil záznam způsobem, zabraňujícím rámci v identifikaci správného záznamu, který chcete aktualizovat nebo odstranit.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED při aktualizaci tabulky, která nemá žádný primární klíč nebo jedinečný index a nemáte dostatek sloupců v sadě záznamů k jednoznačné identifikaci řádku tabulky.
Viz také
Koncepty
Sada záznamů: Jak sady záznamů vybírají záznamy (ODBC)