Sada záznamů: Další informace o aktualizacích (ODBC)
Toto téma se vztahuje na třídy MFC ODBC.
Toto téma vysvětluje:
Další informace o členských funkcích Update a Delete
Poznámka:
Toto téma se vztahuje na objekty odvozené z toho, ze CRecordset
kterých hromadné načítání řádků nebylo implementováno. Pokud jste implementovali hromadné načítání řádků, některé informace se nevztahují. Například nelze volat AddNew
, , Edit
Delete
a Update
členské funkce, ale můžete provádět transakce. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Vliv dalších operací na aktualizace
Aktualizace jsou ovlivněny transakcemi, které se projeví v době aktualizace, zavřením sady záznamů před dokončením transakce a posouváním před dokončením transakce.
Vliv transakcí na aktualizace
Kromě toho, jak , a Delete
Edit
práce, je důležité pochopit, jak BeginTrans
AddNew
, CommitTrans
a Rollback
členské funkce CDatabase pracují s aktualizačními funkcemi CRecordset.
Ve výchozím nastavení volání a vliv na AddNew
Edit
zdroj dat okamžitě při volání Update
. Delete
volání se projeví okamžitě. Můžete ale vytvořit transakci a provést dávku takových volání. Aktualizace nejsou trvalé, dokud je nezapíšete. Pokud změníte názor, můžete vrátit transakci zpět místo potvrzení.
Další informace o transakcích naleznete v tématu Transakce (ODBC).
Jak zavření sady záznamů ovlivňuje aktualizace
Pokud zavřete sadu záznamů nebo přidružený CDatabase
objekt s probíhající transakcí (nemáte název CDatabase::CommitTrans nebo CDatabase::Rollback), transakce se vrátí zpět automaticky (pokud váš databázový back-end není databázový stroj Microsoft Jet).
Upozornění
Pokud používáte databázový stroj Microsoft Jet, zavřením sady záznamů uvnitř explicitní transakce nedojde k uvolnění žádného z řádků, které byly změněny nebo uzamčeny, dokud explicitní transakce nebude potvrzena nebo vrácena zpět. Doporučujeme vždy otevřít i zavřít sady záznamů uvnitř nebo mimo explicitní transakci Jet.
Vliv posouvání na aktualizace
Když sadu záznamů: Posouvání (ODBC) v sadě záznamů, vyrovnávací paměť pro úpravy se vyplní každým novým aktuálním záznamem (předchozí záznam není uložen jako první). Posouvání přeskočí záznamy, které byly dříve odstraněny. Pokud se posunete po AddNew
volání nebo Edit
volání bez volání Update
, CommitTrans
nebo Rollback
nejprve dojde ke ztrátě jakýchkoli změn (bez upozornění) jako nový záznam se přenese do vyrovnávací paměti pro úpravy. Vyrovnávací paměť pro úpravy se vyplní posunem záznamu, uložený záznam se uvolní a ve zdroji dat nedojde k žádné změně. To platí pro obě AddNew
i Edit
.
Vaše aktualizace a aktualizace ostatních uživatelů
Když k aktualizaci dat použijete sadu záznamů, ovlivní aktualizace ostatní uživatele. Podobně vás ovlivní aktualizace ostatních uživatelů během životnosti sady záznamů.
V prostředí s více uživateli můžou ostatní uživatelé otevírat sady záznamů, které obsahují některé ze stejných záznamů, které jste vybrali v sadě záznamů. Změny záznamu před načtením se projeví v sadě záznamů. Vzhledem k tomu, že dynamické sady načítají záznam pokaždé, když se k němu posunete, dynamické sady se při každém posouvání na záznam projeví. Snímky načtou záznam při prvním posouvání, takže snímky odrážejí jenom ty změny, ke kterým došlo dříve, než se posunete na záznam.
Záznamy přidané jinými uživateli po otevření sady záznamů se v sadě záznamů nezobrazují, pokud dotaz nepředáte. Pokud je sada záznamů dynamická sada, při posouvání na ovlivněný záznam se v dynamické sadě zobrazí úpravy existujících záznamů jinými uživateli. Pokud je sada záznamů snímek, úpravy se nezobrazí, dokud se znovu nezobrazí dotaz na snímek. Pokud chcete zobrazit záznamy přidané nebo odstraněné jinými uživateli ve snímku nebo záznamy přidané jinými uživateli v dynamické sadě, zavolejte CRecordset::Requery, aby se sada záznamů znovu sestavil . (Všimněte si, že odstranění ostatních uživatelů se zobrazí v dynasetu.) Můžete také zavolat Requery
, aby se zobrazily záznamy, které přidáte, ale nezobrazují se vaše odstranění.
Tip
Pokud chcete vynutit ukládání celého snímku do mezipaměti najednou, zavolejte MoveLast
ihned po otevření snímku. Pak zavolejte MoveFirst
, abyste mohli začít pracovat se záznamy. MoveLast
je ekvivalentem posouvání všech záznamů, ale načte je všechny najednou. Mějte však na paměti, že to může snížit výkon a nemusí být vyžadováno pro některé ovladače.
Účinky vašich aktualizací na ostatní uživatele se podobají jejich účinkům na vás.
Další informace o aktualizaci a odstranění
Tato část obsahuje další informace, které vám pomůžou pracovat s Update
a Delete
.
Úspěch a selhání aktualizace
V případě Update
úspěchu AddNew
skončí režim nebo Edit
režim. Pokud chcete znovu zahájit AddNew
režim, Edit
zavolejte AddNew
nebo Edit
.
Pokud Update
selže (vrátí hodnotu FALSE nebo vyvolá výjimku), zůstanete v režimu nebo Edit
v AddNew
závislosti na funkci, kterou jste volali jako poslední. Pak můžete udělat jednu z těchto věcí:
Upravte datový člen pole a zkuste to
Update
znovu.Volání
AddNew
pro resetování datových členů pole na hodnotu Null, nastavení hodnot datových členů pole a opětovné voláníUpdate
.Volání
Edit
pro opětovné načtení hodnot, které byly v sadě záznamů před prvním volánímAddNew
neboEdit
, nastavte hodnoty datových členů pole a pak znovu volejteUpdate
. Po úspěšnémUpdate
volání (s výjimkou voláníAddNew
) si datové členy pole zachovají nové hodnoty.Volání
Move
(včetněMove
parametru AFX_MOVE_REFRESH nebo 0), které vyprázdní všechny změny a ukončí všechny změnyAddNew
neboEdit
režim.
Aktualizace a odstranění
Tato část se týká obou Update
a Delete
.
Update
U operace nebo operace Delete
by se měl aktualizovat jeden a jenom jeden záznam. Tento záznam je aktuální záznam, který odpovídá datovým hodnotám 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 než jeden záznam, vyvolá se výjimka obsahující jednu z následujících hodnot RETCODE :
AFX_SQL_ERROR_NO_ROWS_AFFECTED
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED
Když dojde k vyvolání těchto výjimek, zůstanete ve AddNew
Edit
stavu, ve které jste byli při zavolání Update
nebo Delete
. Tady jsou nejběžnější scénáře, ve kterých byste tyto výjimky viděli. Pravděpodobně uvidíte:
AFX_SQL_ERROR_NO_ROWS_AFFECTED, když používáte optimistický režim uzamčení a jiný uživatel záznam upravil způsobem, který rozhraní brání v identifikaci správného záznamu pro aktualizaci nebo odstranění.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED, když tabulka, kterou aktualizujete, nemá žádný primární klíč ani jedinečný index a nemáte dostatek sloupců v sadě záznamů k jednoznačné identifikaci řádku tabulky.
Viz také
Sada záznamů (ODBC)
Sada záznamů: Jak sady záznamů vybírají záznamy (ODBC)
Výměna polí záznamu (Record Field Exchange – RFX)
SQL
Výjimky: Výjimky databáze