Sada záznamů: Jak pracují funkce AddNew, Edit a Delete (rozhraní ODBC)
Toto téma platí pro třídy knihovny MFC rozhraní ODBC.
Toto téma vysvětluje, jak pracují členské funkce AddNew, Edit, a Delete třídy CRecordset. Témata pokrývají:
Princip přidávání záznamů
Viditelnost přidaných záznamů
Princip úpravy záznamů
Princip odstraňování záznamů
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. Používáte-li hromadné načítání řádku, viz Sada záznamů: Hromadné načítání záznamů (rozhraní ODBC).
Jako doplněk si můžete přečíst téma Výměna pole záznamu: Podstata práce RFX, které popisuje odpovídající roli RFX v operacích aktualizace.
Přidání záznamu
Přidání nového záznamu do sady záznamů zahrnuje volání členské funkce AddNew sady záznamů, nastavení hodnot pole datových členů nového záznamu a zavolání členské funkce Update, k zapsání záznamu do zdroje dat.
Podmínkou pro volání AddNew je to, že sada záznamů nesmí být otevřena jen pro čtení. Členské funkce CanUpdate a CanAppend Vám umožňují určit tyto podmínky.
Když zavoláte AddNew:
Je uložen záznam v upravené vyrovnávací paměti tak, aby mohl být jeho obsah obnoven, pokud by byla operace zrušena.
Jsou označeny pole datových členů, takže je možné v nich později rozpoznat změny. Pole datových členů jsou také označeny jako čisté (beze změny) a nastaveny na hodnotu Null.
Po volání AddNew, upravená vyrovnávací paměť představuje nový, prázdný záznam, připravený pro vyplnění hodnotami. Chcete-li to takto udělat, nastavte ručně hodnoty tak, že jim je přiřadíte. Namísto určení aktuální hodnoty dat pro pole, můžete pro určení hodnoty Null zavolat SetFieldNull.
Pro potvzení Vašich změn, zavolejte Update. Po zavolání Update pro nový záznam:
Jestliže Váš ovladač rozhraní ODBC podporuje funkci rozhraní ODBC API ::SQLSetPos, použije knihovna MFC funkci pro přidání nového záznamu do zdroje dat. S ::SQLSetPos může knihovna MFC přidat záznam efektivněji, protože nepotřebuje sestavit a vykonat SQL dotaz.
Pokud nelze ::SQLSetPos použít, provádí knihovna MFC následující:
Pokud nejsou nalezeny žádné změny, neprovede Update žádnou akci a vrátí hodnotu 0.
Pokud existují změny, sestaví Update SQL dotaz INSERT. Sloupce reprezentované všemi nevyřízenými poli datových členů jsou uvedeny v INSERT dotazu. Chcete-li vynutit zahrnutí sloupce, zavolejte členskou funkci SetFieldDirty:
SetFieldDirty( &m_dataMember, TRUE );
Update potvrdí nový záznam – INSERT dotaz je proveden a záznam je potvrzen do tabulky zdroje dat (a sada záznamů, není-li snímkem) není-li transakce v průběhu.
Uložený záznam je obnoven do upravené vyrovnávací paměti. Záznam, který byl aktuální před voláním AddNew je znovu aktuální, bez ohledu na to, zda byl INSERT dotaz úspěšně proveden.
Tip
Pro úplnou kontrolu nad novým záznamem proveďte následující postup: Nastavte hodnoty všech polí, které budou mít hodnoty a poté nastavte explicitně všechny pole, kterým zůstane hodnota Null voláním SetFieldNull s ukazatelem na pole a parametrem TRUE (výchozí). Pokud chcete zajistit, že nebude pole zapsáno do zdroje dat, zavolejte SetFieldDirty s ukazatelem na pole a parametrem FALSE a neměňte hodnotu pole. Chcete-li zjistit, zda může být pole prázdné, zavolejte IsFieldNullable.
Tip
Pro rozpoznání kdy změní sada záznamů členských dat hodnotu, používá knihovna MFC hodnotu PSEUDO_NULL pro přizpůsobení každého datového typu, který chcete uložit do sady záznamů. Pokud musíte explicitně nastavit pole na hodnotu PSEUDO_NULL a pole je stále označeno jako Null, musíte také zavolat SetFieldNull, předáním adresy pole v prvním parametru a hodnoty FALSE ve druhém parametru.
Viditelnost přidaných záznamů
Kdy je přidaný záznam viditelný ve Vaší sadě záznamů? Přidané záznamy se někdy zobrazují a někdy ne, v závislosti na dvou věcech:
Jak je schopný Váš ovladač.
Jaké výhody může využít architektura.
Jestliže Váš ovladač rozhraní ODBC podporuje funkci rozhraní ODBC API ::SQLSetPos, použije knihovna MFC funkci pro přidání nového záznamu. S ::SQLSetPos jsou přidané záznamy viditelné všem aktualizovatelným sadám záznamů knihovny MFC. Bez podpory funkce nejsou přidané záznamy viditelné a musíte k jejich zobrazení zvolat Requery. Použití ::SQLSetPos je také efektivnější.
Upravování existujícího záznamu
Upravování existujícího záznamu v sadě záznamů zahrnuje posunutí na záznam, zavolání členské funkce sady záznamů Edit, nastavení hodnot pole datových členů nového záznamu a zavolání členské funkce Update k zapsání změněného záznamu do zdroje dat.
Podmínkou pro volání Edit je to, že musí být sada záznamů aktualizovatelná a na záznamu. Členské funkce CanUpdate a IsDeleted Vám umožňují určit tyto podmínky. Aktuální záznam nesmí být smazaný a v sadě záznamů musí být záznamy (IsBOF a IsEOF vrátí 0).
Když zavoláte Edit, je záznam uložen v upravené vyrovnávací paměti (aktuální záznam). Hodnoty uloženého záznamu jsou později použity pro rozpoznání, které pole byly změněny.
Po zavolání Edit stále představuje upravená vyrovnávací paměť aktuální záznam, ale je nyní připravena k přijetí změny do pole datových členů. Chcete-li změnit záznam, nastavte ručně hodnoty všech polí datových členů, které chcete změnit. Namísto určení aktuální hodnoty dat pro pole, můžete pro určení hodnoty Null zavolat SetFieldNull. Pro potvzení Vašich změn, zavolejte Update.
Tip
Chcete-li se dostat z režimu AddNew nebo režimu Edit, zavolejte Move s parametrem AFX_MOVE_REFRESH.
Podmínkou pro volání Update je to, že sada záznamů nesmí být prázdná a aktuální záznam nesmí být odstraněn. IsBOF, IsEOF, a IsDeleted by měly všechny vrátit 0.
Po zavolání Update pro upravený záznam:
Jestliže Váš ovladač rozhraní ODBC podporuje funkci rozhraní ODBC API ::SQLSetPos, použije knihovna MFC funkci pro upravení záznamu do zdroje dat. S ::SQLSetPos porovná ovladač Vaši upravenou vyrovnávací paměť s odpovídajícím záznamem na serveru, upravením záznamu na server, pokud jsou ty dva odlišné. S ::SQLSetPos může knihovna MFC upravit záznam efektivněji, protože nepotřebuje sestavit a vykonat SQL dotaz.
-nebo-
Pokud nelze ::SQLSetPos použít, provádí knihovna MFC následující:
Pokud zde nejsou žádné změny, neprovede Update nic a vrátí hodnotu 0.
Pokud existují změny, sestaví Update SQL dotaz UPDATE. Sloupce, uvedené v dotazu UPDATE založeny na poli datových členů, které byly změněny.
Update potvrdí změny – spustí dotaz UPDATE – a záznam je změněn ve zdroji dat, není ale potvrzen pokud probíhá transakce (viz Transakce: Provádění transakcí v sadě záznamů (rozhraní ODBC) pro informace o tom, jak transakce ovlivňují aktualizace). Rozhraní ODBC uchovává kopii záznamu, který se také změnil.
Na rozdíl od procesu pro AddNew, neobnoví proces Edit uložený záznam. Upravený záznam zůstane v místě jako aktuální záznam.
Upozornění Když připravujete úpravu sady záznamů voláním Update, vezměte v potaz, že Vaše sada záznamů zahrnuje všechny sloupce, které představují primární klíč tabulky (nebo všechny sloupce libovolných jedinečných indexů tabulky, nebo dostatek sloupců k jednoznačné identifikaci řádku). V některých případech může architektura použít pouze vybrané sloupce ve Vaší sadě záznamů, k identifikaci který záznam ve Vaší tabulce má být aktualizován. Více záznamů v tabulce může být aktualizováno bez všech potřebných sloupců. V tomto případě vyvolá architektura výjimky při volání Update.
Tip
Pokud zavoláte AddNew nebo Edit po zavolání předchozí funkce, ale před voláním Update, je obnovena upravená vyrovnávací paměť s uloženým záznamem, v průběhu nahrazení nového nebo upraveného záznamu. Toto chování umožňuje přerušit AddNew nebo Edit a začít další: Pokud zjistíte, že je záznam-v-průběhu chybný, jednoduše znovu zavolejte Edit nebo AddNew.
Odstranění záznamu
Odstranění záznamu ze sady záznamů zahrnuje posunutí se na záznam a zavolání členské funkce Delete sady záznamů. Na rozdíl od AddNew a Edit, nevyžaduje Delete odpovídající volání Update.
Podmínkou pro volání Delete je to, že musí být sada záznamů aktualizovatelná a musí být na záznamu. Členské funkce CanUpdate, IsBOF, IsEOF a IsDeleted Vám umožňují určit tyto podmínky.
Když zavoláte Delete:
Jestliže Váš ovladač rozhraní ODBC podporuje funkci rozhraní ODBC API ::SQLSetPos, použije knihovna MFC funkci pro odstranění záznamu ze zdroje dat. Použití ::SQLSetPos je obvykle efektivnější než použití SQL.
-nebo-
Pokud nelze ::SQLSetPos použít, provádí knihovna MFC následující:
Aktuální záznam v upravené vyrovnávací paměti není zálohován jako při AddNew a Edit.
Delete sestaví SQL dotaz DELETE, který odstraní záznam.
Aktuální záznam v upravené vyrovnávací paměti není uložen jako při AddNew a Edit.
Delete potvrdí odstranění – spustí DELETE dotaz. Záznam je ve zdroji dat označen jako odstraněný a v případě, že je záznam snímkem v rozhraní ODBC.
Hodnoty odstraněných záznamů jsou stále v poli datových členů sady záznamů, ale pole datových členů jsou označeny jako Null členská funkce IsDeleted sady záznamů vratí nenulovou hodnotu.
Poznámka
Po odstranění záznamu byste měli přejít k jinému záznamu, pro nahrazení upravené vyrovnávací paměti daty nového záznamu. Je chyba znovu volat Delete nebo volat Edit.
Informace o SQL dotazech použitých při operacích aktualizace, naleznete v tématu SQL.