Sdílet prostřednictvím


Sada záznamů: Další informace o aktualizacích (ODBC)

Toto téma se vztahuje na třídy MFC ODBC.

Toto téma vysvětluje:

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, , EditDeletea 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 Editpráce, je důležité pochopit, jak BeginTransAddNew, CommitTransa 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, CommitTransnebo 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ím AddNew nebo Edit, nastavte hodnoty datových členů pole a pak znovu volejte Update . Po úspěšném Update 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ěny AddNew nebo Edit 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