Třída CRecordset
Představuje sadu záznamů vybraných ze zdroje dat.
Syntaxe
class CRecordset : public CObject
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CRecordset::CRecordset |
CRecordset Vytvoří objekt. Odvozená třída musí poskytovat konstruktor, který tuto třídu volá. |
Veřejné metody
Název | Popis |
---|---|
CRecordset::AddNew |
Připraví se na přidání nového záznamu. Volání Update pro dokončení přidání |
CRecordset::CanAppend |
Vrátí nenulové hodnoty, pokud je možné nové záznamy přidat do sady záznamů prostřednictvím AddNew členské funkce. |
CRecordset::CanBookmark |
Vrátí nenulové hodnoty, pokud sada záznamů podporuje záložky. |
CRecordset::Cancel |
Zruší asynchronní operaci nebo proces z druhého vlákna. |
CRecordset::CancelUpdate |
Zruší všechny čekající aktualizace z důvodu AddNew operace nebo operace Edit . |
CRecordset::CanRestart |
Vrátí nenulovou hodnotu, pokud Requery je možné volat, aby se dotaz sady záznamů spustil znovu. |
CRecordset::CanScroll |
Vrátí nenulové hodnoty, pokud můžete procházet záznamy. |
CRecordset::CanTransact |
Vrátí nenulové, pokud zdroj dat podporuje transakce. |
CRecordset::CanUpdate |
Vrátí nenulové hodnoty, pokud lze sadu záznamů aktualizovat (můžete přidat, aktualizovat nebo odstranit záznamy). |
CRecordset::CheckRowsetError |
Volané pro zpracování chyb generovaných během načítání záznamu. |
CRecordset::Close |
Zavře sadu záznamů a přidruženou rozhraní ODBC HSTMT . |
CRecordset::Delete |
Odstraní aktuální záznam ze sady záznamů. Po odstranění se musíte explicitně posunout na jiný záznam. |
CRecordset::DoBulkFieldExchange |
Volá se k výměně hromadných řádků dat ze zdroje dat do sady záznamů. Implementuje hromadnou výměnu polí záznamu (Bulk RFX). |
CRecordset::DoFieldExchange |
Volá se k výměně dat (v obou směrech) mezi datovými členy pole sady záznamů a odpovídajícím záznamem ve zdroji dat. Implementuje výměnu polí záznamů (RFX). |
CRecordset::Edit |
Připraví se na změny aktuálního záznamu. Volání Update pro dokončení úprav |
CRecordset::FlushResultSet |
Vrátí nenulovou hodnotu, pokud se při použití předdefinovaného dotazu načte jiná sada výsledků. |
CRecordset::GetBookmark |
Přiřadí hodnotu záložky záznamu objektu parametru. |
CRecordset::GetDefaultConnect |
Zavolá se pro získání výchozího připojovací řetězec. |
CRecordset::GetDefaultSQL |
Volá se k získání výchozího řetězce SQL, který se má spustit. |
CRecordset::GetFieldValue |
Vrátí hodnotu pole v sadě záznamů. |
CRecordset::GetODBCFieldCount |
Vrátí počet polí v sadě záznamů. |
CRecordset::GetODBCFieldInfo |
Vrátí konkrétní typy informací o polích v sadě záznamů. |
CRecordset::GetRecordCount |
Vrátí počet záznamů v sadě záznamů. |
CRecordset::GetRowsetSize |
Vrátí počet záznamů, které chcete načíst během jednoho načtení. |
CRecordset::GetRowsFetched |
Vrátí skutečný počet řádků načtených během načítání. |
CRecordset::GetRowStatus |
Vrátí stav řádku po načtení. |
CRecordset::GetSQL |
Získá řetězec SQL použitý k výběru záznamů pro sadu záznamů. |
CRecordset::GetStatus |
Získá stav sady záznamů: index aktuálního záznamu a zda byl získán konečný počet záznamů. |
CRecordset::GetTableName |
Získá název tabulky, na které je sada záznamů založena. |
CRecordset::IsBOF |
Vrátí nenulové hodnoty, pokud byla sada záznamů umístěna před prvním záznamem. Neexistuje žádný aktuální záznam. |
CRecordset::IsDeleted |
Vrátí nenulovou hodnotu, pokud je sada záznamů umístěna na odstraněný záznam. |
CRecordset::IsEOF |
Vrátí nenulové hodnoty, pokud byla sada záznamů umístěna za posledním záznamem. Neexistuje žádný aktuální záznam. |
CRecordset::IsFieldDirty |
Vrátí nenulové, pokud bylo změněno zadané pole v aktuálním záznamu. |
CRecordset::IsFieldNull |
Vrátí nenulové pole, pokud zadané pole v aktuálním záznamu má hodnotu null (nemá žádnou hodnotu). |
CRecordset::IsFieldNullable |
Vrátí nenulové, pokud zadané pole v aktuálním záznamu může být nastaveno na hodnotu null (bez hodnoty). |
CRecordset::IsOpen |
Vrátí nenulovou hodnotu, pokud Open byla dříve volána. |
CRecordset::Move |
Umístí sadu záznamů do zadaného počtu záznamů z aktuálního záznamu v libovolném směru. |
CRecordset::MoveFirst |
Umístí aktuální záznam na první záznam v sadě záznamů. IsBOF Nejprve otestujte. |
CRecordset::MoveLast |
Umístí aktuální záznam na poslední záznam nebo na poslední sadu řádků. IsEOF Nejprve otestujte. |
CRecordset::MoveNext |
Umístí aktuální záznam na další záznam nebo do další sady řádků. IsEOF Nejprve otestujte. |
CRecordset::MovePrev |
Umístí aktuální záznam na předchozí záznam nebo na předchozí sadu řádků. IsBOF Nejprve otestujte. |
CRecordset::OnSetOptions |
Volá se k nastavení možností (při výběru) pro zadaný příkaz ODBC. |
CRecordset::OnSetUpdateOptions |
Volá se k nastavení možností (používá se při aktualizaci) pro zadaný příkaz ODBC. |
CRecordset::Open |
Otevře sadu záznamů načtením tabulky nebo provedením dotazu, který sada záznamů představuje. |
CRecordset::RefreshRowset |
Aktualizuje data a stav zadaných řádků. |
CRecordset::Requery |
Spustí dotaz sady záznamů znovu a aktualizuje vybrané záznamy. |
CRecordset::SetAbsolutePosition |
Umístí sadu záznamů na záznam odpovídající zadanému číslu záznamu. |
CRecordset::SetBookmark |
Umístí sadu záznamů na záznam určený záložkou. |
CRecordset::SetFieldDirty |
Označí zadané pole v aktuálním záznamu jako změněné. |
CRecordset::SetFieldNull |
Nastaví hodnotu zadaného pole v aktuálním záznamu na hodnotu null (bez hodnoty). |
CRecordset::SetLockingMode |
Nastaví režim uzamčení na optimistické uzamčení (výchozí) nebo pesimistické uzamčení. Určuje, jak jsou záznamy uzamčeny pro aktualizace. |
CRecordset::SetParamNull |
Nastaví zadaný parametr na hodnotu null (bez hodnoty). |
CRecordset::SetRowsetCursorPosition |
Umístí kurzor na zadaný řádek v sadě řádků. |
CRecordset::SetRowsetSize |
Určuje počet záznamů, které chcete načíst během načítání. |
CRecordset::Update |
AddNew Dokončí operaci Edit uložením nových nebo upravených dat do zdroje dat. |
Veřejné datové členy
Název | Popis |
---|---|
CRecordset::m_hstmt |
Obsahuje popisovač příkazu ODBC pro sadu záznamů. Zadejte HSTMT . |
CRecordset::m_nFields |
Obsahuje počet datových členů pole v sadě záznamů. Zadejte UINT . |
CRecordset::m_nParams |
Obsahuje počet členů dat parametrů v sadě záznamů. Zadejte UINT . |
CRecordset::m_pDatabase |
Obsahuje ukazatel na CDatabase objekt, přes který je sada záznamů připojena ke zdroji dat. |
CRecordset::m_strFilter |
Obsahuje klauzuliCString , která určuje klauzuli jazyk SQL (Structured Query Language) (SQL). WHERE Slouží jako filtr k výběru pouze těch záznamů, které splňují určitá kritéria. |
CRecordset::m_strSort |
Obsahuje klauzuli CString , která určuje klauzuli SQL ORDER BY . Slouží k řízení způsobu řazení záznamů. |
Poznámky
Objekty označované jako "sady záznamů" CRecordset
se obvykle používají ve dvou formách: dynasety a snímky. Dynamická sada zůstane synchronizovaná s aktualizacemi dat provedenými jinými uživateli. Snímek je statické zobrazení dat. Každý formulář představuje sadu záznamů opravených při otevření sady záznamů. Když se posunete na záznam v dynasetu, odráží změny provedené v záznamu, a to buď jinými uživateli, nebo jinými sadami záznamů ve vaší aplikaci.
Poznámka:
Pokud pracujete s třídami DAO (Data Access Objects) místo tříd ODBC (Open Database Connectivity), použijte místo toho třídu CDaoRecordset
. Další informace naleznete v tématu Přehled: Programování databáze.
Chcete-li pracovat s některým druhem sady záznamů, obvykle odvození třídy sady záznamů specifické pro aplikaci z CRecordset
. Sady záznamů vyberou záznamy ze zdroje dat a pak můžete:
Procházejte záznamy.
Aktualizujte záznamy a zadejte režim uzamčení.
Vyfiltrujte sadu záznamů tak, aby omezila, které záznamy vybere z těch dostupných ve zdroji dat.
Seřaďte sadu záznamů.
Parametrizovat sadu záznamů tak, aby přizpůsobila svůj výběr s informacemi, které nejsou známé do doby běhu.
Chcete-li použít vaši třídu, otevřete databázi a vytvořte objekt sady záznamů a předejte konstruktor ukazatel na objekt CDatabase
. Potom zavolejte členskou Open
funkci sady záznamů, kde můžete určit, zda je objekt dynaset nebo snímek. Volání Open
vybere data ze zdroje dat. Po otevření objektu sady záznamů můžete pomocí jejích členských funkcí a datových členů procházet záznamy a pracovat s nimi. Dostupné operace závisí na tom, jestli je objekt dynaset nebo snímek, jestli je aktualizovatelný nebo jen pro čtení (to závisí na schopnosti zdroje dat ODBC (Open Database Connectivity) a jestli jste implementovali hromadné načítání řádků. Chcete-li aktualizovat záznamy, které mohly být změněny nebo přidány od Open
volání, zavolejte členskou funkci objektu Requery
. Volání členské funkce objektu Close
a zničení objektu po dokončení.
V odvozené CRecordset
třídě se pro podporu čtení a aktualizace polí záznamů používá výměna polí záznamu (RFX) nebo hromadná výměna polí záznamu (Bulk RFX).
Další informace o sadách záznamů a výměně polí záznamů najdete v článcích Přehled: Programování databáze, sada záznamů (ODBC), sada záznamů: Načítání záznamů hromadně (ODBC) a Výměna polí záznamů (RFX). Pokud se chcete zaměřit na dynamické sady a snímky, přečtěte si články Dynaset a Snapshot.
Hierarchie dědičnosti
CRecordset
Požadavky
Záhlaví: afxdb.h
CRecordset::AddNew
Připraví se na přidání nového záznamu do tabulky.
virtual void AddNew();
Poznámky
Pokud chcete zobrazit nově přidaný záznam, musíte volat Requery
členovu funkci. Pole záznamu jsou zpočátku null. (V terminologii databáze hodnota Null znamená, že hodnota nemá žádnou hodnotu a není stejná jako hodnota NULL v jazyce C++.) K dokončení operace je nutné volat členovu Update
funkci. Update
uloží změny ve zdroji dat.
Poznámka:
Pokud jste implementovali hromadné načítání řádků, nemůžete volat AddNew
. Výsledkem bude neúspěšný kontrolní výraz. I když třída CRecordset
neposkytuje mechanismus pro aktualizaci hromadných řádků dat, můžete psát vlastní funkce pomocí funkce SQLSetPos
rozhraní ODBC API . Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
AddNew
připraví nový prázdný záznam pomocí datových členů sady záznamů. Po volání AddNew
nastavte požadované hodnoty v datových členech sady záznamů. (Nemusíte volat Upravit členské funkce pro tento účel; použít Edit
pouze pro existující záznamy.) Při volání Update
se změněné hodnoty v datových členech polí ukládají do zdroje dat.
Upozornění
Pokud se před voláním Update
posunete na nový záznam, nový záznam se ztratí a nebude se zobrazovat žádné upozornění.
Pokud zdroj dat podporuje transakce, můžete provést AddNew
volání části transakce. Další informace o transakcích naleznete v tématu třída CDatabase
. Zavolejte CDatabase::BeginTrans
před voláním AddNew
.
Poznámka:
U dynamických sad se nové záznamy přidají do sady záznamů jako poslední záznam. Přidané záznamy nejsou přidány do snímků; musíte volat Requery
, aby se sada záznamů aktualizovala.
Volání AddNew
sady záznamů, jejíž Open
členská funkce nebyla volána. Vyvolá CDBException
se, pokud voláte AddNew
sadu záznamů, ke které není možné připojit. Můžete určit, zda je sada záznamů aktualizovatelná voláním CanAppend
.
Další informace najdete v následujících článcích: Sada záznamů: Jak sady záznamů aktualizují záznamy (ODBC),sada záznamů: Přidávání, aktualizace a odstraňování záznamů (ODBC) a transakce (ODBC).
Příklad
Viz Transakce: Provádění transakce v sadě záznamů (ODBC).
CRecordset::CanAppend
Určuje, zda dříve otevřená sada záznamů umožňuje přidat nové záznamy.
BOOL CanAppend() const;
Vrácená hodnota
Nenulové, pokud sada záznamů umožňuje přidávat nové záznamy; jinak 0. CanAppend
vrátí hodnotu 0, pokud jste otevřeli sadu záznamů jen pro čtení.
CRecordset::CanBookmark
Určuje, zda sada záznamů umožňuje označit záznamy pomocí záložek.
BOOL CanBookmark() const;
Vrácená hodnota
Nenulové, pokud sada záznamů podporuje záložky; jinak 0.
Poznámky
Tato funkce je nezávislá na CRecordset::useBookmarks
možnosti v dwOptions
parametru Open
členské funkce. CanBookmark
určuje, zda daný ovladač ODBC a typ kurzoru podporují záložky. CRecordset::useBookmarks
označuje, jestli budou záložky k dispozici, pokud jsou podporované.
Poznámka:
Záložky nejsou podporovány u sad záznamů jen pro předávání.
Další informace o záložkách a navigaci v sadě záznamů naleznete v článcích Sada záznamů: Záložky a Absolutní pozice (ODBC) a Sada záznamů: Posouvání (ODBC).
CRecordset::Cancel
Vyžaduje, aby zdroj dat zrušil probíhající asynchronní operaci nebo proces z druhého vlákna.
void Cancel();
Poznámky
Třídy MFC ODBC již nepoužívají asynchronní zpracování; k provedení asynchronní operace je nutné přímo volat funkci SQLSetConnectOption
rozhraní ODBC API . Další informace naleznete v tématu Spouštění funkcí asynchronně v průvodci programátorem sady ODBC SDK.
CRecordset::CancelUpdate
Zruší všechny čekající aktualizace způsobené nějakou Edit
operací AddNew
před Update
zavoláním.
void CancelUpdate();
Poznámky
Poznámka:
Tato členová funkce se nevztahuje na sady záznamů, které používají hromadné načítání řádků, protože tyto sady záznamů nemohou volat Edit
, AddNew
nebo Update
. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Pokud je povolena automatická kontrola nezašpiněných polí, CancelUpdate
obnoví členské proměnné na hodnoty, které předtím měly Edit
nebo AddNew
byly volány. Jinak všechny změny hodnoty zůstanou. Ve výchozím nastavení je automatická kontrola polí povolená při otevření sady záznamů. Chcete-li tuto funkci zakázat, je nutné zadat CRecordset::noDirtyFieldCheck
parametr dwOptions
funkce Open member.
Další informace o aktualizaci dat naleznete v tématu Sada záznamů: Přidání, aktualizace a odstranění záznamů (ODBC).
CRecordset::CanRestart
Určuje, zda sada záznamů umožňuje restartovat svůj dotaz (aktualizovat jeho záznamy) voláním Requery
členské funkce.
BOOL CanRestart() const;
Vrácená hodnota
Nenulové, pokud je povoleno opětovné dotazování; jinak 0.
CRecordset::CanScroll
Určuje, zda sada záznamů umožňuje posouvání.
BOOL CanScroll() const;
Vrácená hodnota
Nenulové, pokud sada záznamů umožňuje posouvání; jinak 0.
Poznámky
Další informace o posouvání naleznete v tématu Sada záznamů: Posouvání (ODBC).
CRecordset::CanTransact
Určuje, zda sada záznamů umožňuje transakce.
BOOL CanTransact() const;
Vrácená hodnota
Nenulové, pokud sada záznamů umožňuje transakce; jinak 0.
Poznámky
Další informace naleznete v tématu Transakce (ODBC).
CRecordset::CanUpdate
Určuje, zda lze sadu záznamů aktualizovat.
BOOL CanUpdate() const;
Vrácená hodnota
Nenulové, pokud lze sadu záznamů aktualizovat; jinak 0.
Poznámky
Sada záznamů může být jen pro čtení, pokud je podkladový zdroj dat jen pro čtení nebo pokud jste CRecordset::readOnly
zadali v parametru dwOptions
při otevření sady záznamů.
CRecordset::CheckRowsetError
Volané pro zpracování chyb generovaných během načítání záznamu.
virtual void CheckRowsetError(RETCODE nRetCode);
Parametry
nRetCode
Návratový kód funkce rozhraní ODBC API Podrobnosti najdete v části Poznámky.
Poznámky
Tato virtuální členová funkce zpracovává chyby, ke kterým dochází při načítání záznamů, a je užitečná při hromadném načítání řádků. Možná budete chtít zvážit přepsání CheckRowsetError
, abyste implementovali vlastní zpracování chyb.
CheckRowsetError
je volána automaticky v navigační operaci kurzoru, například Open
, Requery
nebo jakoukoli Move
operaci. Předá se návratová hodnota funkce SQLExtendedFetch
rozhraní ODBC API . Následující tabulka uvádí možné hodnoty parametru nRetCode
.
nRetCode | Popis |
---|---|
SQL_SUCCESS |
Funkce byla úspěšně dokončena; nejsou k dispozici žádné další informace. |
SQL_SUCCESS_WITH_INFO |
Funkce byla úspěšně dokončena, pravděpodobně s méně závažnou chybou. Další informace lze získat voláním SQLError . |
SQL_NO_DATA_FOUND |
Všechny řádky ze sady výsledků byly načteny. |
SQL_ERROR |
Funkce se nezdařila. Další informace lze získat voláním SQLError . |
SQL_INVALID_HANDLE |
Funkce selhala kvůli neplatnému popisovači prostředí, popisovači připojení nebo popisovači příkazu. To značí chybu programování. Žádné další informace nejsou k dispozici od SQLError společnosti . |
SQL_STILL_EXECUTING |
Funkce, která byla spuštěna asynchronně, se stále spouští. Mfc ve výchozím nastavení nikdy nepředá tuto hodnotu CheckRowsetError ; MFC bude pokračovat v volání SQLExtendedFetch , dokud se už nevrátí SQL_STILL_EXECUTING . |
Další informace naleznete v SQLError
sadě Windows SDK. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
CRecordset::Close
Zavře sadu záznamů.
virtual void Close();
Poznámky
Rozhraní ODBC HSTMT
a veškerá paměť přidělená sadě záznamů jsou uvolněny. Obvykle po volání Close
, odstraníte C++ objekt sady záznamů, pokud byl přidělen new
.
Po volání můžete volat Open
Close
znovu . To vám umožní znovu použít objekt sady záznamů. Alternativou je volání Requery
.
Příklad
// Construct a snapshot object
CCustomer rsCustSet(NULL);
if (!rsCustSet.Open())
return;
// Use the snapshot ...
// Close the snapshot
rsCustSet.Close();
// Destructor is called when the function exits
CRecordset::CRecordset
CRecordset
Vytvoří objekt.
CRecordset(CDatabase* pDatabase = NULL);
Parametry
pDatabase
Obsahuje ukazatel na CDatabase
objekt nebo hodnotu NULL
. Pokud ne NULL
a členská Open
funkce objektu nebyla volána pro připojení ke zdroji dat, sada záznamů se pokusí otevřít pro vás během vlastního Open
volání.CDatabase
Pokud předáte NULL
, CDatabase
objekt je vytvořen a připojen za vás pomocí informací o zdroji dat, které jste zadali při odvození třídy sady záznamů pomocí ClassWizard.
Poznámky
Můžete buď použít CRecordset
přímo nebo odvodit třídu specifickou pro aplikaci z CRecordset
. Třídy ClassWizard můžete použít k odvození tříd sady záznamů.
Poznámka:
Odvozená třída musí zadat vlastní konstruktor. V konstruktoru odvozené třídy zavolejte konstruktor CRecordset::CRecordset
, předat příslušné parametry spolu s ním.
Předejte NULL
konstruktoru sady záznamů, aby byl CDatabase
objekt vytvořen a připojen automaticky. Jedná se o užitečnou zkratku, která nevyžaduje vytvoření a připojení objektu CDatabase
před vytvořením sady záznamů.
Příklad
Další informace naleznete v tématu Sada záznamů: Deklarování třídy pro tabulku (ODBC).
CRecordset::Delete
Odstraní aktuální záznam.
virtual void Delete();
Poznámky
Po úspěšném odstranění jsou datové členy sady záznamů nastaveny na hodnotu Null a pokud chcete přesunout odstraněný záznam, musíte explicitně volat jednu z Move
funkcí. Jakmile přesunete odstraněný záznam, není možné se k němu vrátit. Pokud zdroj dat podporuje transakce, můžete provést Delete
volání části transakce. Další informace naleznete v tématu Transakce (ODBC).
Poznámka:
Pokud jste implementovali hromadné načítání řádků, nemůžete volat Delete
. Výsledkem bude neúspěšný kontrolní výraz. I když třída CRecordset
neposkytuje mechanismus pro aktualizaci hromadných řádků dat, můžete psát vlastní funkce pomocí funkce SQLSetPos
rozhraní ODBC API . Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Upozornění
Sada záznamů musí být aktualizovatelná a při volání Delete
musí existovat platný záznam aktuální v sadě záznamů. V opačném případě dojde k chybě. Pokud například odstraníte záznam, ale nepřesouvejte se před dalším voláním Delete
na nový záznam, Delete
vyvolá výjimku CDBException.
Na rozdíl od AddNew
volání a Edit
volání Delete
není následované voláním Update
. Delete
Pokud volání selže, datové členy pole zůstanou beze změny.
Příklad
Tento příklad ukazuje sadu záznamů vytvořenou v rámci funkce. Příklad předpokládá existenci m_dbCust
členské proměnné typu CDatabase
, která je již připojena ke zdroji dat.
// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
!rsCustSet.CanTransact())
{
return;
}
m_dbCust.BeginTrans();
// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();
// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();
CRecordset::DoBulkFieldExchange
Volá se k výměně hromadných řádků dat ze zdroje dat do sady záznamů. Implementuje hromadnou výměnu polí záznamu (Bulk RFX).
virtual void DoBulkFieldExchange(CFieldExchange* pFX);
Parametry
pFX
Ukazatel na CFieldExchange
objekt. Architektura již bude mít nastaven tento objekt k určení kontextu pro operaci výměny polí.
Poznámky
Při hromadném načítání řádků je implementováno rozhraní volá tuto členovu funkci, aby automaticky přenášela data ze zdroje dat do objektu sady záznamů. DoBulkFieldExchange
také vytvoří vazbu datových členů parametru(pokud existuje) na zástupné symboly parametrů v řetězci příkazu SQL pro výběr sady záznamů.
Pokud hromadné načítání řádků není implementováno, volá DoFieldExchange
rozhraní . Chcete-li implementovat hromadné načítání řádků, je nutné zadat CRecordset::useMultiRowFetch
možnost parametru dwOptions v Open
členské funkci.
Poznámka:
DoBulkFieldExchange
je k dispozici pouze v případě, že používáte třídu odvozenou z CRecordset
. Pokud jste vytvořili objekt sady záznamů přímo z CRecordset
, je nutné volat členovou GetFieldValue
funkci pro načtení dat.
Výměna polí hromadného záznamu (Bulk RFX) se podobá výměně polí záznamu (RFX). Data se automaticky přenášejí ze zdroje dat do objektu sady záznamů. Nemůžete ale volat AddNew
, Edit
, Delete
nebo Update
přenést změny zpět do zdroje dat. Třída CRecordset
v současné době neposkytuje mechanismus pro aktualizaci hromadných řádků dat. Vlastní funkce ale můžete napsat pomocí funkce SQLSetPos
rozhraní ODBC API .
TřídaWizard nepodporuje hromadnou výměnu polí záznamu; proto je nutné přepsat DoBulkFieldExchange
ručně zápisem volání funkcí Bulk RFX. Další informace o těchto funkcích naleznete v tématu Funkce výměny polí záznamu.
Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC). Související informace najdete v tématu Výměna polí záznamu (RFX).
CRecordset::DoFieldExchange
Volá se k výměně dat (v obou směrech) mezi datovými členy pole sady záznamů a odpovídajícím záznamem ve zdroji dat. Implementuje výměnu polí záznamů (RFX).
virtual void DoFieldExchange(CFieldExchange* pFX);
Parametry
pFX
Ukazatel na CFieldExchange
objekt. Architektura již bude mít nastaven tento objekt k určení kontextu pro operaci výměny polí.
Poznámky
Pokud není implementováno hromadné načítání řádků, architektura volá tuto členkou funkci, aby automaticky vyměňovala data mezi datovými členy pole objektu sady záznamů a odpovídajícími sloupci aktuálního záznamu ve zdroji dat. DoFieldExchange
také vytvoří vazbu datových členů parametru(pokud existuje) na zástupné symboly parametrů v řetězci příkazu SQL pro výběr sady záznamů.
Pokud je implementováno hromadné načítání řádků, architektura volá DoBulkFieldExchange
. Chcete-li implementovat hromadné načítání řádků, je nutné zadat CRecordset::useMultiRowFetch
možnost dwOptions
parametru Open
ve členské funkci.
Poznámka:
DoFieldExchange
je k dispozici pouze v případě, že používáte třídu odvozenou z CRecordset
. Pokud jste vytvořili objekt sady záznamů přímo z CRecordset
, je nutné volat GetFieldValue členské funkce pro načtení dat.
Výměna dat polí, označovaná jako výměna polí záznamu (RFX), funguje v obou směrech: od datových členů objektu sady záznamů k polím záznamu ve zdroji dat a ze záznamu ve zdroji dat do objektu sady záznamů.
Jedinou akcí, kterou je nutné provést k implementaci DoFieldExchange
pro odvozenou třídu sady záznamů, je vytvořit třídu pomocí TřídyWizard a zadat názvy a datové typy datových členů pole. Můžete také přidat kód k tomu, co ClassWizard zapisuje za účelem určení datových členů parametrů nebo zpracování jakýchkoli sloupců, které svážete dynamicky. Další informace naleznete v tématu Sada záznamů: Dynamické vazby datových sloupců (ODBC).
Když deklarujete odvozenou třídu sady záznamů pomocí TřídyWizard, průvodce zapíše přepsání DoFieldExchange
za vás, které se podobá následujícímu příkladu:
void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
RFX_Long(pFX, _T("[BillingID]"), m_BillingID);
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param"), m_strParam);
}
Další informace o funkcích RFX naleznete v tématu Funkce výměny polí záznamu.
Další příklady a podrobnosti o DoFieldExchange
nástroji Record Field Exchange: How RFX Works. Obecné informace o dokumentu RFX naleznete v tématu Výměna polí záznamu.
CRecordset::Edit
Umožňuje změny aktuálního záznamu.
virtual void Edit();
Poznámky
Po volání Edit
můžete datové členy pole změnit přímo resetováním jejich hodnot. Operace se dokončí při volání Update
členské funkce, aby se změny uložily do zdroje dat.
Poznámka:
Pokud jste implementovali hromadné načítání řádků, nemůžete volat Edit
. Výsledkem bude neúspěšný kontrolní výraz. I když třída CRecordset
neposkytuje mechanismus pro aktualizaci hromadných řádků dat, můžete psát vlastní funkce pomocí funkce SQLSetPos
rozhraní ODBC API . Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Edit
uloží hodnoty datových členů sady záznamů. Pokud voláte Edit
, proveďte změny a pak znovu volejte Edit
, hodnoty záznamu se obnoví do toho, co byly před prvním Edit
voláním.
V některých případech můžete chtít sloupec aktualizovat tak, že ho vytvoříte null (obsahující žádná data). Uděláte to tak, že zavoláte SetFieldNull
s parametrem TRUE, který označí pole Null. To také způsobí aktualizaci sloupce. Pokud chcete, aby se pole zapisovalo do zdroje dat, i když se jeho hodnota nezměnila, zavolejte SetFieldDirty
s parametrem PRAVDA. To funguje i v případě, že pole mělo hodnotu Null.
Pokud zdroj dat podporuje transakce, můžete provést Edit
volání části transakce. Hovor CDatabase::BeginTrans
před voláním Edit
a po otevření sady záznamů CDatabase::CommitTrans
Volání také není náhradou za volání Update
k Edit
dokončení operace. Další informace o transakcích naleznete v tématu třída CDatabase
.
V závislosti na aktuálním režimu uzamčení může být záznam, který se aktualizuje, uzamčen, Edit
dokud nezavoláte Update
nebo se posunete na jiný záznam, nebo může být uzamčen pouze během Edit
hovoru. Režim uzamčení můžete změnit pomocí SetLockingMode
funkce .
Předchozí hodnota aktuálního záznamu se obnoví, pokud se před voláním Update
posunete na nový záznam . Vyvolá CDBException
se, pokud voláte Edit
sadu záznamů, která se nedá aktualizovat nebo pokud neexistuje žádný aktuální záznam.
Další informace naleznete v článcích Transakce (ODBC) a Sada záznamů: Uzamčení záznamů (ODBC).
Příklad
// To edit a record, first set up the edit buffer
rsCustSet.Edit();
// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");
// Finally, complete the operation
if (!rsCustSet.Update())
{
// Handle the failure to update
AfxMessageBox(_T("Couldn't update record!"));
}
CRecordset::FlushResultSet
Načte další sadu výsledků předdefinovaného dotazu (uložená procedura), pokud existuje více sad výsledků.
BOOL FlushResultSet();
Vrácená hodnota
Nenulové, pokud je potřeba načíst více sad výsledků; jinak 0.
Poznámky
Volání byste měli volat FlushResultSet
pouze v případě, že jste hotovi s kurzorem na aktuální sadě výsledků. Při načtení další sady výsledků voláním FlushResultSet
není kurzor v této sadě výsledků platný. Po volání byste měli zavolat MoveNext
FlushResultSet
členovu funkci .
Pokud předdefinovaný dotaz používá výstupní parametr nebo vstupní/výstupní parametry, musíte volat FlushResultSet
, dokud se nevrátí FALSE
(hodnota 0), aby se tyto hodnoty parametrů získaly.
FlushResultSet
volá funkci SQLMoreResults
rozhraní ODBC API . Pokud SQLMoreResults
se vrátí SQL_ERROR
nebo SQL_INVALID_HANDLE
, vyvolá FlushResultSet
výjimku. Další informace naleznete v SQLMoreResults
sadě Windows SDK.
Uložená procedura musí mít svázaná pole, pokud chcete volat FlushResultSet
.
Příklad
Následující kód předpokládá, že COutParamRecordset
je odvozený CRecordset
objekt založený na předdefinovaném dotazu se vstupním parametrem a výstupním parametrem a má více sad výsledků. Poznamenejte si strukturu přepsání DoFieldExchange
.
// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputParam);
RFX_Long(pFX, _T("Param1"), m_nCountParam);
// The "Param1" name here is a dummy name
// that is never used
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param2"), m_strNameParam);
// The "Param2" name here is a dummy name
// that is never used
}
// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");
// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor
// type for multiple rowset returning stored
// procedures
rs.Open(CRecordset::forwardOnly,
_T("{? = CALL GetCourses( ? )}"),
CRecordset::readOnly);
// Loop through all the data in the first result set
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
// Retrieve other result sets...
while (rs.FlushResultSet())
{
// must call MoveNext because cursor is invalid
rs.MoveNext();
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
}
// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.
// TO DO: Use m_nCountParam
// Cleanup
rs.Close();
CRecordset::GetBookmark
Získá hodnotu záložky pro aktuální záznam.
void GetBookmark(CDBVariant& varBookmark);
Parametry
varBookmark
Odkaz na CDBVariant
objekt představující záložku aktuálního záznamu.
Poznámky
Chcete-li zjistit, zda jsou záložky podporovány v sadě záznamů, zavolejte CanBookmark
. Pokud chcete, aby byly záložky dostupné, pokud jsou podporované, musíte nastavit CRecordset::useBookmarks
možnost v dwOptions
parametru Open
členské funkce.
Poznámka:
Pokud záložky nejsou podporované nebo nedostupné, volání GetBookmark
způsobí vyvolání výjimky. Záložky nejsou podporovány u sad záznamů jen pro předávání.
GetBookmark
přiřadí hodnotu záložky pro aktuální záznam objektu CDBVariant
. Pokud se chcete k danému záznamu kdykoli vrátit po přesunutí na jiný záznam, zavolejte SetBookmark
s odpovídajícím CDBVariant
objektem.
Poznámka:
Po určitých operacích sady záznamů už záložky nemusí být platné. Pokud například zavoláte GetBookmark
, Requery
pak se pravděpodobně nebudete moct vrátit k záznamu pomocí SetBookmark
příkazu . Zavolejte CDatabase::GetBookmarkPersistence
a zkontrolujte, jestli můžete bezpečně volat SetBookmark
.
Další informace o záložkách a navigaci v sadě záznamů naleznete v článcích Sada záznamů: Záložky a Absolutní pozice (ODBC) a Sada záznamů: Posouvání (ODBC).
CRecordset::GetDefaultConnect
Zavolá se pro získání výchozího připojovací řetězec.
virtual CString GetDefaultConnect();
Vrácená hodnota
A CString
obsahující výchozí připojovací řetězec.
Poznámky
Architektura volá tuto členovou funkci, aby získala výchozí připojovací řetězec pro zdroj dat, na kterém je sada záznamů založena. ClassWizard
implementuje tuto funkci za vás identifikací stejného zdroje dat, který ClassWizard
používáte k získání informací o tabulkách a sloupcích. Pravděpodobně zjistíte, že je vhodné při vývoji aplikace spoléhat na toto výchozí připojení. Výchozí připojení ale nemusí být vhodné pro uživatele vaší aplikace. V takovém případě byste měli tuto funkci znovu zkompilovat a zahodit ClassWizard
verzi. Další informace o připojovací řetězec naleznete v tématu Zdroj dat (ODBC).
CRecordset::GetDefaultSQL
Volá se k získání výchozího řetězce SQL, který se má spustit.
virtual CString GetDefaultSQL();
Vrácená hodnota
A CString
, který obsahuje výchozí příkaz SQL.
Poznámky
Architektura volá tuto členovou funkci k získání výchozího příkazu SQL, na kterém je sada záznamů založena. Může se jednat o název tabulky nebo příkaz SQL SELECT
.
Implicitně definujete výchozí příkaz SQL deklarováním třídy sady záznamů a ClassWizard
ClassWizard
provedete tuto úlohu za vás.
Pokud potřebujete řetězec příkazu SQL pro vlastní použití, volání GetSQL
, které vrátí příkaz SQL použitý k výběru záznamů sady záznamů při jeho otevření. Výchozí řetězec SQL můžete upravit v přepsání GetDefaultSQL
třídy . Můžete například zadat volání předdefinovaného dotazu pomocí CALL
příkazu. (Všimněte si však, že pokud upravujete GetDefaultSQL
, musíte také upravit m_nFields
tak, aby odpovídaly počtu sloupců ve zdroji dat.)
Další informace naleznete v tématu Sada záznamů: Deklarování třídy pro tabulku (ODBC).
Upozornění
Název tabulky bude prázdný, pokud architektura nemohla identifikovat název tabulky, pokud bylo zadáno více názvů tabulek nebo nelze CALL
interpretovat příkaz. Při použití CALL
příkazu nevkládejte prázdné znaky mezi složenou závorku a CALL
klíčové slovo ani před složenou závorku nebo před SELECT
klíčové slovo v SELECT
příkazu.
CRecordset::GetFieldValue
Načte data polí v aktuálním záznamu.
void GetFieldValue(
LPCTSTR lpszName,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
LPCTSTR lpszName,
CStringA& strValue
);
void GetFieldValue(
LPCTSTR lpszName,
CStringW& strValue
);
void GetFieldValue(
short nIndex,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
short nIndex,
CStringA& strValue);
void GetFieldValue(
short nIndex,
CStringW& strValue);
Parametry
lpszName
Název pole.
varValue
Odkaz na CDBVariant
objekt, který bude ukládat hodnotu pole.
nFieldType
Datový typ ODBC C pole. Pomocí výchozí hodnoty DEFAULT_FIELD_TYPE
vynutí GetFieldValue
určit datový typ jazyka C z datového typu SQL na základě následující tabulky. V opačném případě můžete datový typ zadat přímo nebo zvolit kompatibilní datový typ; Můžete například uložit libovolný datový typ do SQL_C_CHAR
.
Datový typ jazyka C | Datový typ SQL |
---|---|
SQL_C_BIT |
SQL_BIT |
SQL_C_UTINYINT |
SQL_TINYINT |
SQL_C_SSHORT |
SQL_SMALLINT |
SQL_C_SLONG |
SQL_INTEGER |
SQL_C_FLOAT |
SQL_REAL |
SQL_C_DOUBLE |
SQL_FLOATSQL_DOUBLE |
SQL_C_TIMESTAMP |
SQL_DATESQL_TIMESQL_TIMESTAMP |
SQL_C_CHAR |
SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR |
SQL_C_BINARY |
SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY |
Další informace o datových typech ODBC naleznete v tématech "Datové typy SQL" a "Datové typy jazyka C" v dodatku D sady Windows SDK.
nIndex
Index pole založený na nule.
strValue
Odkaz na CString
objekt, který uloží hodnotu pole převedenou na text bez ohledu na datový typ pole.
Poznámky
Pole můžete vyhledat podle názvu nebo podle indexu. Hodnotu pole můžete uložit do objektu CDBVariant
nebo objektu CString
.
Pokud jste implementovali hromadné načítání řádků, aktuální záznam se vždy umístí na první záznam v sadě řádků. Chcete-li použít GetFieldValue
záznam v rámci dané sady řádků, musíte nejprve zavolat SetRowsetCursorPosition
členovou funkci, aby se kurzor přesunul na požadovaný řádek v této sadě řádků. Pak zavolejte GetFieldValue
na tento řádek. Chcete-li implementovat hromadné načítání řádků, je nutné zadat CRecordset::useMultiRowFetch
možnost dwOptions
parametru Open
ve členské funkci.
Pole můžete použít GetFieldValue
k dynamickému načítání polí za běhu místo statické vazby v době návrhu. Pokud jste například deklarovali objekt sady záznamů přímo z CRecordset
, musíte použít GetFieldValue
k načtení dat pole, výměnu polí záznamů (RFX) nebo hromadnou výměnu polí záznamů (Bulk RFX), není implementována.
Poznámka:
Pokud deklarujete objekt sady záznamů bez odvození , CRecordset
nemá načtenou knihovnu KURZOR ODBC. Knihovna kurzorů vyžaduje, aby sada záznamů měla alespoň jeden vázaný sloupec; Pokud však použijete CRecordset
přímo, žádný ze sloupců není vázán. Členské funkce CDatabase::OpenEx
a CDatabase::Open
řídí, zda bude načtena knihovna kurzorů.
GetFieldValue
volá funkci SQLGetData
rozhraní ODBC API . Pokud ovladač vypíše hodnotu SQL_NO_TOTAL pro skutečnou délku hodnoty pole, GetFieldValue
vyvolá výjimku. Další informace naleznete v SQLGetData
sadě Windows SDK.
Příklad
Následující ukázkový kód znázorňuje volání GetFieldValue
objektu sady záznamů deklarovaného přímo z CRecordset
.
// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));
// Create a CDBVariant object to
// store field data
CDBVariant varValue;
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
for (short index = 0; index < nFields; index++)
{
rs.GetFieldValue(index, varValue);
// do something with varValue
}
rs.MoveNext();
}
rs.Close();
db.Close();
Poznámka:
Na rozdíl od třídy CDaoRecordset
CRecordset
DAO nemá členovou SetFieldValue
funkci. Pokud vytváříte objekt přímo z CRecordset
, je to efektivně jen pro čtení.
Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
CRecordset::GetODBCFieldCount
Načte celkový počet polí v objektu sady záznamů.
short GetODBCFieldCount() const;
Vrácená hodnota
Počet polí v sadě záznamů.
Poznámky
Další informace o vytváření sad záznamů naleznete v tématu Sada záznamů: Vytváření a zavírání sad záznamů (ODBC).
CRecordset::GetODBCFieldInfo
Získá informace o polích v sadě záznamů.
void GetODBCFieldInfo(
LPCTSTR lpszName,
CODBCFieldInfo& fieldinfo);
void GetODBCFieldInfo(
short nIndex,
CODBCFieldInfo& fieldinfo);
Parametry
lpszName
Název pole.
fieldinfo
Odkaz na CODBCFieldInfo
strukturu.
nIndex
Index pole založený na nule.
Poznámky
Jedna verze funkce umožňuje vyhledat pole podle názvu. Druhá verze umožňuje vyhledat pole podle indexu.
Popis vrácených informací naleznete ve struktuře CODBCFieldInfo
.
Další informace o vytváření sad záznamů naleznete v tématu Sada záznamů: Vytváření a zavírání sad záznamů (ODBC).
CRecordset::GetRecordCount
Určuje velikost sady záznamů.
long GetRecordCount() const;
Vrácená hodnota
Počet záznamů v sadě záznamů; 0, pokud sada záznamů neobsahuje žádné záznamy; nebo -1, pokud se počet záznamů nedá určit.
Poznámky
Upozornění
Počet záznamů se udržuje jako "horní značka", záznam s nejvyšším číslem, který se zatím považuje za uživatele, který prochází záznamy. Celkový počet záznamů je znám až po přesunutí uživatele za poslední záznam. Z důvodů výkonu se počet při volání MoveLast
neaktualizuje. Pokud chcete spočítat záznamy sami, zavolejte MoveNext
opakovaně, dokud IsEOF
nenulově nevrátíte. Přidání záznamu prostřednictvím CRecordset:AddNew
a Update
zvýšení počtu; odstranění záznamu snížením CRecordset::Delete
počtu.
CRecordset::GetRowsetSize
Získá aktuální nastavení počtu řádků, které chcete načíst během daného načtení.
DWORD GetRowsetSize() const;
Vrácená hodnota
Početřádkůch
Poznámky
Pokud používáte hromadné načítání řádků, výchozí velikost sady řádků při otevření sady záznamů je 25; jinak je to 1.
Chcete-li implementovat hromadné načítání řádků, je nutné zadat CRecordset::useMultiRowFetch
možnost v dwOptions
parametru Open
členské funkce. Pokud chcete změnit nastavení velikosti sady řádků, zavolejte SetRowsetSize
.
Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
CRecordset::GetRowsFetched
Určuje, kolik záznamů bylo načteno po načtení.
DWORD GetRowsFetched() const;
Vrácená hodnota
Počet řádků načtených ze zdroje dat po daném načtení
Poznámky
To je užitečné, když jste implementovali hromadné načítání řádků. Velikost sady řádků obvykle označuje, kolik řádků se načte z načtení. Celkový počet řádků v sadě záznamů ale ovlivňuje také počet řádků, které se načtou v sadě řádků. Pokud má například sada záznamů 10 záznamů s nastavením velikosti sady řádků 4, bude smyčka procházet sadou záznamů voláním MoveNext
, aby konečná sada řádků měla pouze dva záznamy.
Chcete-li implementovat hromadné načítání řádků, je nutné zadat CRecordset::useMultiRowFetch
možnost v parametru Open
dwOptions členské funkce. Chcete-li zadat velikost sady řádků, zavolejte SetRowsetSize.
Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Příklad
CMultiCustomer rs(&m_dbCust);
// Set the rowset size
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// loop through the recordset by rowsets
while (!rs.IsEOF())
{
for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
{
// do something
}
rs.MoveNext();
}
rs.Close();
CRecordset::GetRowStatus
Získá stav řádku v aktuální sadě řádků.
WORD GetRowStatus(WORD wRow) const;
Parametry
wRow
Jednostranná pozice řádku v aktuální sadě řádků. Tato hodnota může být v rozsahu od 1 do velikosti sady řádků.
Vrácená hodnota
Hodnota stavu pro řádek. Podrobnosti najdete v části Poznámky.
Poznámky
GetRowStatus
vrátí hodnotu, která označuje buď jakoukoli změnu stavu řádku od posledního načtení ze zdroje dat, nebo že nebyl načten žádný řádek odpovídající wRow
řádku. Následující tabulka uvádí možné návratové hodnoty.
Hodnota stavu | Popis |
---|---|
SQL_ROW_SUCCESS |
Řádek se nezmění. |
SQL_ROW_UPDATED |
Řádek byl aktualizován. |
SQL_ROW_DELETED |
Řádek byl odstraněn. |
SQL_ROW_ADDED |
Řádek byl přidán. |
SQL_ROW_ERROR |
Řádek je kvůli chybě nedostupný. |
SQL_ROW_NOROW |
Žádný řádek neodpovídá wRow . |
Další informace naleznete v rozhraní ODBC API funkce SQLExtendedFetch
v sadě Windows SDK.
CRecordset::GetStatus
Určuje index aktuálního záznamu v sadě záznamů a určuje, jestli byl poslední záznam zobrazen.
void GetStatus(CRecordsetStatus& rStatus) const;
Parametry
rStatus
Odkaz na CRecordsetStatus
objekt. Další informace naleznete v tématu Poznámky.
Poznámky
CRecordset
pokusy o sledování indexu, ale za určitých okolností to nemusí být možné. Podívejte se GetRecordCount
na vysvětlení.
Struktura CRecordsetStatus
má následující tvar:
struct CRecordsetStatus
{
long m_lCurrentRecord;
BOOL m_bRecordCountFinal;
};
Dva členové CRecordsetStatus
mají následující významy:
m_lCurrentRecord
Obsahuje index založený na nule aktuálního záznamu v sadě záznamů, pokud je znám. Pokud index nelze určit, obsahujeAFX_CURRENT_RECORD_UNDEFINED
tento člen (-2). PokudIsBOF
je true (prázdná sada záznamů nebo pokus o posouvání před prvním záznamem),m_lCurrentRecord
je nastavena naAFX_CURRENT_RECORD_BOF
hodnotu (-1). Pokud je na prvním záznamu, nastaví se na 0, druhý záznam 1 atd.m_bRecordCountFinal
Nenulové, pokud byl zjištěn celkový počet záznamů v sadě záznamů. Obecně to musí být dosaženo tak, že začíná na začátku sady záznamů a voláníMoveNext
, dokudIsEOF
nenulové. Pokud je tento člen nula, počítá se záznam jako vrácenýGetRecordCount
hodnotou -1 pouze počet záznamů "horní mez".
CRecordset::GetSQL
Voláním této členské funkce získáte příkaz SQL, který se použil k výběru záznamů sady záznamů při jeho otevření.
const CString& GetSQL() const;
Vrácená hodnota
const
Odkaz na CString
příkaz SQL.
Poznámky
Obvykle se jedná o příkaz SQL SELECT
. Řetězec vrácený GetSQL
jen pro čtení.
Řetězec vrácený obvykle se liší od jakéhokoli řetězce, který GetSQL
jste mohli předat do sady záznamů v lpszSQL
parametru Open
členské funkci. Důvodem je to, že sada záznamů vytváří úplný příkaz SQL na základě toho, co jste předali Open
, co jste zadali pomocí ClassWizard
, co jste mohli zadat v m_strFilter
datových členech a m_strSort
všechny parametry, které jste zadali. Podrobnosti o tom, jak sada záznamů vytváří tento příkaz SQL, naleznete v tématu Recordset: How Recordsets Select Records (ODBC).
Poznámka:
Volání této členské funkce pouze po volání Open
.
CRecordset::GetTableName
Získá název tabulky SQL, na které je založen dotaz sady záznamů.
const CString& GetTableName() const;
Vrácená hodnota
const
Odkaz na CString
název tabulky, pokud je sada záznamů založena na tabulce, jinak prázdný řetězec.
Poznámky
GetTableName
je platná pouze v případě, že sada záznamů je založena na tabulce, nikoli spojení více tabulek nebo předdefinovaného dotazu (uložená procedura). Název je jen pro čtení.
Poznámka:
Volání této členské funkce pouze po volání Open
.
CRecordset::IsBOF
Vrátí nenulové hodnoty, pokud byla sada záznamů umístěna před prvním záznamem. Neexistuje žádný aktuální záznam.
BOOL IsBOF() const;
Vrácená hodnota
Nenulové, pokud sada záznamů neobsahuje žádné záznamy nebo pokud jste se před prvním záznamem posouvali dozadu; jinak 0.
Poznámky
Volejte tuto členovu funkci, než se posunete ze záznamu na záznam, abyste se dozvěděli, jestli jste přešli před prvním záznamem sady záznamů. Můžete také použít IsBOF
spolu s IsEOF
určením, jestli sada záznamů obsahuje nějaké záznamy nebo je prázdná. Okamžitě po volání Open
, pokud sada záznamů neobsahuje žádné záznamy, IsBOF
vrátí nenulové. Když otevřete sadu záznamů, která má aspoň jeden záznam, první záznam je aktuální záznam a IsBOF
vrátí hodnotu 0.
Pokud je prvním záznamem aktuální záznam a zavoláte MovePrev
, IsBOF
vrátí se nenulová hodnota. Pokud IsBOF
vrátí nenulovou hodnotu a zavoláte MovePrev
, dojde k chybě. Pokud IsBOF
vrátí nenulovou hodnotu, aktuální záznam není definován a jakákoli akce, která vyžaduje aktuální záznam, způsobí chybu.
Příklad
Tento příklad používá IsBOF
a IsEOF
rozpozná omezení sady záznamů, protože kód prochází sadou záznamů v obou směrech.
// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if(rsCustSet.IsBOF())
return;
// The recordset is empty
// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
rsCustSet.MoveNext();
// Move to the last record
rsCustSet.MoveLast();
// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
rsCustSet.MovePrev();
// First record is current again
rsCustSet.MoveFirst();
CRecordset::IsDeleted
Určuje, zda byl aktuální záznam odstraněn.
BOOL IsDeleted() const;
Vrácená hodnota
Nenulové, pokud je sada záznamů umístěna na odstraněný záznam; jinak 0.
Poznámky
Pokud se posunete na záznam a IsDeleted
vrátíte TRUE
(nenulové), musíte se před provedením jiných operací sady záznamů posunout k jinému záznamu.
Výsledek IsDeleted
závisí na mnoha faktorech, jako je například typ sady záznamů, jestli je sada záznamů aktualizovatelná, jestli jste při otevření sady záznamů zadali CRecordset::skipDeletedRecords
možnost, jestli vaše sady ovladačů odstranily záznamy a jestli existuje více uživatelů.
Další informace o CRecordset::skipDeletedRecords
balení ovladačů naleznete v části Open member function.
Poznámka:
Pokud jste implementovali hromadné načítání řádků, neměli byste volat IsDeleted
. Místo toho volejte funkci GetRowStatus member function. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
CRecordset::IsEOF
Vrátí nenulové hodnoty, pokud byla sada záznamů umístěna za posledním záznamem. Neexistuje žádný aktuální záznam.
BOOL IsEOF() const;
Vrácená hodnota
Nenulové, pokud sada záznamů neobsahuje žádné záznamy nebo pokud jste se posunovali za poslední záznam; jinak 0.
Poznámky
Volání této členské funkce při posouvání ze záznamu do záznamu, abyste se dozvěděli, jestli jste překročili poslední záznam sady záznamů. Můžete také použít IsEOF
k určení, jestli sada záznamů obsahuje nějaké záznamy nebo je prázdná. Okamžitě po volání Open
, pokud sada záznamů neobsahuje žádné záznamy, IsEOF
vrátí nenulové. Když otevřete sadu záznamů, která má aspoň jeden záznam, první záznam je aktuální záznam a IsEOF
vrátí hodnotu 0.
Pokud je posledním záznamem aktuální záznam při volání MoveNext
, IsEOF
vrátí nenulový záznam. Pokud IsEOF
vrátí nenulovou hodnotu a zavoláte MoveNext
, dojde k chybě. Pokud IsEOF
vrátí nenulovou hodnotu, aktuální záznam není definován a jakákoli akce, která vyžaduje aktuální záznam, způsobí chybu.
Příklad
Podívejte se na příklad pro IsBOF
.
CRecordset::IsFieldDirty
Určuje, zda byl zadaný datový člen pole změněn od nebo Edit
AddNew
byl volána.
BOOL IsFieldDirty(void* pv);
Parametry
pv
Ukazatel na datový člen pole, jehož stav chcete zkontrolovat, nebo NULL
určit, jestli některá z polí nejsou zašpiněná.
Vrácená hodnota
Nenulové, pokud se od volání AddNew
změnil datový člen zadaného pole nebo Edit
jinak 0.
Poznámky
Data ve všech datových členech nezašpiněného pole budou přenesena do záznamu ve zdroji dat při aktualizaci aktuálního záznamu Update
voláním členské funkce CRecordset
(po volání Edit
nebo AddNew
).
Poznámka:
Tato členová funkce se nevztahuje na sady záznamů, které používají hromadné načítání řádků. Pokud jste implementovali hromadné načítání řádků, IsFieldDirty
vrátí vždy hodnotu FALSE a výsledkem bude neúspěšný kontrolní výraz. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Volání IsFieldDirty
obnoví účinky předchozích volání na SetFieldDirty , protože stav pole je znovu zhodnocený. AddNew
V případě, že se aktuální hodnota pole liší od pseudonulové hodnoty, je stav pole nastaven zašpiněný. Edit
V případě, že se hodnota pole liší od hodnoty uložené v mezipaměti, je stav pole nastaven zašpiněný.
IsFieldDirty
se implementuje prostřednictvím DoFieldExchange
.
Další informace o zašpiněného příznaku naleznete v tématu Sada záznamů: Jak sady záznamů vyberou záznamy (ODBC).
CRecordset::IsFieldNull
Vrátí nenulové pole, pokud zadané pole v aktuálním záznamu je Null (nemá žádnou hodnotu).
BOOL IsFieldNull(void* pv);
Parametry
pv
Ukazatel na datový člen pole, jehož stav chcete zkontrolovat, nebo NULL
určit, jestli některá z polí má hodnotu Null.
Vrácená hodnota
Nenulové, pokud je zadaný datový člen pole označen jako Null; jinak 0.
Poznámky
Voláním této členské funkce určíte, zda byl datový člen zadaného pole sady záznamů označen jako Null. (V terminologii databáze znamená hodnota Null "bez hodnoty" a není stejná jako NULL
v jazyce C++.) Pokud je datový člen pole označený příznakem Null, interpretuje se jako sloupec aktuálního záznamu, pro který neexistuje žádná hodnota.
Poznámka:
Tato členová funkce se nevztahuje na sady záznamů, které používají hromadné načítání řádků. Pokud jste implementovali hromadné načítání řádků, IsFieldNull
vrátí se vždy FALSE
a výsledkem bude neúspěšný kontrolní výraz. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
IsFieldNull
se implementuje prostřednictvím DoFieldExchange
.
CRecordset::IsFieldNullable
Vrátí nenulové, pokud zadané pole v aktuálním záznamu lze nastavit na Hodnotu Null (bez hodnoty).
BOOL IsFieldNullable(void* pv);
Parametry
pv
Ukazatel na datový člen pole, jehož stav chcete zkontrolovat, nebo NULL
určit, jestli některá z polí může být nastavena na hodnotu Null.
Poznámky
Voláním této členské funkce určíte, zda je datový člen zadaného pole nullable (lze nastavit na hodnotu Null; C++ NULL
není totéž jako null, což v terminologii databáze znamená "bez hodnoty").
Poznámka:
Pokud jste implementovali hromadné načítání řádků, nemůžete volat IsFieldNullable
. Místo toho zavolejte GetODBCFieldInfo
členovou funkci a určete, zda lze pole nastavit na hodnotu Null. Vždy můžete volat GetODBCFieldInfo
bez ohledu na to, jestli jste implementovali hromadné načítání řádků. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Pole, které nemůže mít hodnotu Null, musí mít hodnotu. Pokud se pokusíte nastavit takové pole na hodnotu Null při přidávání nebo aktualizaci záznamu, zdroj dat odmítne přidání nebo aktualizaci a Update
vyvolá výjimku. K výjimce dojde při volání Update
, ne při volání SetFieldNull
.
Použití NULL
pro první argument funkce použije funkci pouze u outputColumn
polí, nikoli param
polí. Například volání
SetFieldNull(NULL);
nastaví pouze outputColumn
pole NULL
na ; param
pole nebudou ovlivněna.
Pokud chcete pracovat na param
polích, musíte zadat skutečnou adresu jednotlivce param
, na který chcete pracovat, například:
SetFieldNull(&m_strParam);
To znamená, že nemůžete nastavit všechna param
pole tak NULL
, jak je to možné s outputColumn
poli.
IsFieldNullable
je implementována prostřednictvím DoFieldExchange.
CRecordset::IsOpen
Určuje, jestli je sada záznamů již otevřená.
BOOL IsOpen() const;
Vrácená hodnota
Nenulové, pokud byla dříve volána nebo členská funkce objektu Open
Requery
sady záznamů a sada záznamů nebyla uzavřena, jinak 0.
CRecordset::m_hstmt
Obsahuje popisovač datové struktury příkazu ODBC, typu HSTMT
, přidružené k sadě záznamů.
Poznámky
Každý dotaz na zdroj dat ODBC je přidružen k objektu HSTMT
.
Upozornění
Nepoužívat m_hstmt
dřív Open
, než byl volána.
Obvykle nemusíte přistupovat HSTMT
přímo, ale možná ho budete potřebovat pro přímé spuštění příkazů SQL. Členová ExecuteSQL
funkce třídy CDatabase
poskytuje příklad použití m_hstmt
.
CRecordset::m_nFields
Obsahuje počet datových členů pole ve třídě sady záznamů; to znamená počet sloupců vybraných sadou záznamů ze zdroje dat.
Poznámky
Konstruktor třídy sady záznamů musí inicializovat m_nFields
se správným číslem. Pokud jste neimplementovali hromadné načítání řádků, ClassWizard
zapíše tato inicializace za vás, když ji použijete k deklaraci třídy sady záznamů. Můžete ho také napsat ručně.
Architektura používá toto číslo ke správě interakce mezi datovými členy pole a odpovídajícími sloupci aktuálního záznamu ve zdroji dat.
Upozornění
Toto číslo musí odpovídat počtu "výstupních sloupců" registrovaných v DoFieldExchange
nebo po volání SetFieldType
s parametrem CFieldExchange::outputColumn
DoBulkFieldExchange
.
Sloupce můžete svázat dynamicky, jak je vysvětleno v článku Sada záznamů: Dynamicky svázání datových sloupců. Pokud to uděláte, musíte počet zvýšit m_nFields
, aby odrážel počet volání funkce RFX nebo Bulk RFX ve vaší DoFieldExchange
nebo DoBulkFieldExchange
členské funkci pro dynamicky vázané sloupce.
Další informace najdete v článcích Sada záznamů: Dynamické vazby datových sloupců (ODBC) a sady záznamů: Hromadné načítání záznamů (ODBC).
Příklad
viz Výměna polí záznamu: Použití RFX.
CRecordset::m_nParams
Obsahuje počet datových členů parametrů ve třídě sady záznamů; to znamená počet parametrů předaných dotazem sady záznamů.
Poznámky
Pokud má vaše třída sady záznamů datové členy parametrů, konstruktor třídy musí inicializovat m_nParams
se správným číslem. Výchozí hodnota m_nParams
je 0. Pokud přidáte datové členy parametrů (které musíte provést ručně), musíte do konstruktoru třídy přidat inicializaci, která bude odrážet počet parametrů (které musí být alespoň tak velké jako počet zástupných symbolů '' v řetězci m_strFilter
m_strSort
).
Rozhraní používá toto číslo při parametrizaci dotazu sady záznamů.
Upozornění
Toto číslo musí odpovídat počtu parametrů registrovaných v DoFieldExchange
nebo po volání SetFieldType
s hodnotou parametru CFieldExchange::inputParam
, , CFieldExchange::outputParam
CFieldExchange::param
nebo CFieldExchange::inoutParam
.DoBulkFieldExchange
Příklad
Projděte si články Sada záznamů: Parametrizace sady záznamů (ODBC) a Výměny polí záznamů: Použití RFX.
CRecordset::m_pDatabase
Obsahuje ukazatel na CDatabase
objekt, přes který je sada záznamů připojena ke zdroji dat.
Poznámky
Tato proměnná se nastavuje dvěma způsoby. Obvykle při vytváření objektu sady záznamů předáte ukazatel na již připojený CDatabase
objekt. Pokud místo toho předáte NULL
objekt, CRecordset
vytvoří objekt CDatabase
a připojí ho. V obou případech CRecordset
uloží ukazatel do této proměnné.
Za normálních okolností nebudete muset přímo použít ukazatel uložený v m_pDatabase
souboru . Pokud ale napíšete vlastní rozšíření CRecordset
, budete možná muset použít ukazatel. Pokud například vyvoláte vlastní CDBException
, budete potřebovat ukazatel. Nebo ho možná budete potřebovat, pokud potřebujete něco udělat pomocí stejného CDatabase
objektu, jako je spouštění transakcí, nastavení časových limitů nebo volání ExecuteSQL
členské funkce třídy CDatabase
k přímému spuštění příkazů SQL.
CRecordset::m_strFilter
Po vytvoření objektu sady záznamů, ale před voláním jeho Open
členské funkce použijte tento datový člen k uložení CString
obsahující klauzuli SQL WHERE
.
Poznámky
Sada záznamů používá tento řetězec k omezení (nebo filtrování) záznamů, které vybere během Open
volání.Requery
To je užitečné při výběru podmnožina záznamů, například "všichni prodejci v Kalifornii" ("state = CA"). Syntaxe ODBC SQL pro WHERE
klauzuli je
WHERE search-condition
Nezahrnujte WHERE
do řetězce klíčové slovo. Architektura ji poskytuje.
Řetězec filtru můžete také parametrizovat tak, že do něj umístíte zástupné symboly '' a deklarujete do třídy datový člen parametru pro každý zástupný symbol a předáte parametry sadě záznamů za běhu. To vám umožní vytvořit filtr za běhu. Další informace naleznete v tématu Sada záznamů: Parametrizace sady záznamů (ODBC).
Další informace o klauzulích SQL WHERE
najdete v tématu SQL. Další informace o výběru a filtrování záznamů naleznete v tématu Sada záznamů: Filtrování záznamů (ODBC).
Příklad
CCustomer rsCustSet(&m_dbCust);
// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");
// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::m_strSort
Po vytvoření objektu sady záznamů, ale před voláním jeho Open
členské funkce použijte tento datový člen k uložení CString
obsahující klauzuli SQL ORDER BY
.
Poznámky
Sada záznamů používá tento řetězec k seřazení záznamů, které vybere během Open
volání.Requery
Pomocí této funkce můžete sadu záznamů seřadit podle jednoho nebo více sloupců. Syntaxe ODBC SQL pro ORDER BY
klauzuli je
ORDER BY sort-specification [, sort-specification]...
kde specifikace řazení je celé číslo nebo název sloupce. Můžete také zadat vzestupné nebo sestupné pořadí (pořadí je ve výchozím nastavení vzestupné) tak, že do seznamu sloupců v řetězci řazení připojíte "ASC" nebo "DESC". Vybrané záznamy se nejprve seřadí podle prvního sloupce uvedeného, pak podle druhého atd. Sadu záznamů "Zákazníci" můžete například objednat podle příjmení a potom křestní jméno. Počet sloupců, které můžete vypsat, závisí na zdroji dat. Další informace najdete v sadě Windows SDK.
Nezahrnujte ORDER BY
do řetězce klíčové slovo. Architektura ji poskytuje.
Další informace o klauzulích SQL najdete v tématu SQL. Další informace o řazení záznamů naleznete v tématu Sada záznamů: Řazení záznamů (ODBC).
Příklad
CCustomer rsCustSet(&m_dbCust);
// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::Move
Přesune aktuální ukazatel záznamu v sadě záznamů dopředu nebo dozadu.
virtual void Move(
long nRows,
WORD wFetchType = SQL_FETCH_RELATIVE);
Parametry
nRows
Početřádkůch Kladné hodnoty se posunují dopředu směrem ke konci sady záznamů. Záporné hodnoty se posunují zpět směrem k začátku.
wFetchType
Určuje sadu řádků, která Move
se načte. Podrobnosti najdete v části Poznámky.
Poznámky
Pokud předáte hodnotu 0 pro nRows
, Move
aktualizuje aktuální záznam; Move
ukončí jakýkoli aktuální AddNew
nebo Edit
režim a obnoví hodnotu aktuálního záznamu před AddNew
nebo Edit
byla volána.
Poznámka:
Když procházíte sadou záznamů, nemůžete vynechat odstraněné záznamy. Další informace naleznete v tématu CRecordset::IsDeleted
. Když otevřete sadu CRecordset
možností s skipDeletedRecords
možností, Move
použije se příkaz, pokud nRows
je parametr 0. Toto chování zabraňuje aktualizaci řádků odstraněných jinými klientskými aplikacemi pomocí stejných dat. Popis parametru dwOption
naleznete v Open
parametru skipDeletedRecords
.
Move
přemísťuje sadu záznamů podle sad řádků. Na základě hodnot pro nRows
a wFetchType
načte Move
příslušnou sadu řádků a pak vytvoří první záznam v sadě řádků aktuální záznam. Pokud jste neimplementovali hromadné načítání řádků, je velikost sady řádků vždy 1. Při načítání sady řádků přímo volá CheckRowsetError
členovou funkci, Move
aby zpracovávala všechny chyby způsobené načtením.
V závislosti na hodnotách, které předáte, Move
odpovídá ostatním CRecordset
členským funkcím. Konkrétně může hodnota znamenat členovou funkci, která je intuitivnější a často upřednostňovaná metoda pro přesunutí aktuálního wFetchType
záznamu.
Následující tabulka uvádí možné hodnoty pro wFetchType
sadu řádků, která Move
bude načtena na wFetchType
základě a nRows
, a všechny ekvivalentní členské funkce odpovídající wFetchType
.
wFetchType | Načtená sada řádků | Ekvivalentní členová funkce |
---|---|---|
SQL_FETCH_RELATIVE (výchozí hodnota) |
Počáteční řádky sady nRows řádků z prvního řádku v aktuální sadě řádků. |
|
SQL_FETCH_NEXT |
Další sada řádků; nRows se ignoruje. |
MoveNext |
SQL_FETCH_PRIOR |
Předchozí sada řádků; nRows se ignoruje. |
MovePrev |
SQL_FETCH_FIRST |
První sada řádků v sadě záznamů; nRows se ignoruje. |
MoveFirst |
SQL_FETCH_LAST |
Poslední úplná sada řádků v sadě záznamů; nRows se ignoruje. |
MoveLast |
SQL_FETCH_ABSOLUTE |
Pokud nRows > 0, počáteční nRows řádky sady řádků od začátku sady záznamů. Pokud nRows < 0, počáteční nRows řádky sady řádků od konce sady záznamů. Pokud nRows = 0, vrátí se podmínka BOF (začátek souboru). |
SetAbsolutePosition |
SQL_FETCH_BOOKMARK |
Sada řádků začínající na řádku, jehož hodnota záložky odpovídá nRows . |
SetBookmark |
Poznámka:
Pro sady záznamů pouze pro předávání je Move
platná pouze s hodnotou SQL_FETCH_NEXT
pro wFetchType
.
Upozornění
Volání Move
vyvolá výjimku, pokud sada záznamů neobsahuje žádné záznamy. Chcete-li určit, zda sada záznamů obsahuje nějaké záznamy, volání IsBOF
a IsEOF
.
Poznámka:
Pokud jste se posunuli za začátek nebo konec sady záznamů (IsBOF
nebo IsEOF
vrátí nenulovou hodnotu), volání Move
funkce pravděpodobně vyvolá CDBException
chybu . Pokud například IsEOF
vrátí nenulovou hodnotu a IsBOF
ne, MoveNext
vyvolá výjimku, ale MovePrev
ne.
Poznámka:
Pokud voláte Move
při aktualizaci nebo přidání aktuálního záznamu, aktualizace se ztratí bez upozornění.
Další informace o navigaci v sadě záznamů naleznete v článcích Sada záznamů: Posouvání (ODBC) a Sada záznamů: Záložky a Absolutní pozice (ODBC). Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC). Související informace naleznete v rozhraní ODBC API funkce SQLExtendedFetch
v sadě Windows SDK.
Příklad
// rs is a CRecordset or a CRecordset-derived object
// Change the rowset size to 5
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// Move to the first record in the recordset
rs.MoveFirst();
// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);
rs.MoveFirst();
rs.MoveNext();
CRecordset::MoveFirst
Vytvoří první záznam v první sadě řádků jako aktuální záznam.
void MoveFirst();
Poznámky
Bez ohledu na to, jestli bylo implementováno hromadné načítání řádků, bude to vždy první záznam v sadě záznamů.
Nemusíte volat MoveFirst
hned po otevření sady záznamů. V té době je prvním záznamem (pokud existuje) automaticky aktuální záznam.
Poznámka:
Tato členová funkce není platná pro sady záznamů jen pro předávání.
Poznámka:
Když procházíte sadou záznamů, nemůžete vynechat odstraněné záznamy. Podrobnosti najdete v IsDeleted
členské funkci.
Upozornění
Volání některé z Move
funkcí vyvolá výjimku, pokud sada záznamů neobsahuje žádné záznamy. Chcete-li určit, zda sada záznamů obsahuje nějaké záznamy, volání IsBOF
a IsEOF
.
Poznámka:
Pokud při aktualizaci nebo přidání aktuálního záznamu Move
zavoláte některou z funkcí, aktualizace se ztratí bez upozornění.
Další informace o navigaci v sadě záznamů naleznete v článcích Sada záznamů: Posouvání (ODBC) a Sada záznamů: Záložky a Absolutní pozice (ODBC). Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Příklad
Podívejte se na příklad pro IsBOF
.
CRecordset::MoveLast
Nastaví první záznam v poslední úplné sadě řádků na aktuální záznam.
void MoveLast();
Poznámky
Pokud jste neimplementovali hromadné načítání řádků, sada záznamů má velikost sady řádků 1, takže MoveLast
se přesune na poslední záznam v sadě záznamů.
Poznámka:
Tato členová funkce není platná pro sady záznamů jen pro předávání.
Poznámka:
Když procházíte sadou záznamů, nemůžete vynechat odstraněné záznamy. Podrobnosti najdete v IsDeleted
členské funkci.
Upozornění
Volání některé z Move
funkcí vyvolá výjimku, pokud sada záznamů neobsahuje žádné záznamy. Chcete-li určit, zda sada záznamů obsahuje nějaké záznamy, volání IsBOF
a IsEOF
.
Poznámka:
Pokud při aktualizaci nebo přidání aktuálního záznamu Move
zavoláte některou z funkcí, aktualizace se ztratí bez upozornění.
Další informace o navigaci v sadě záznamů naleznete v článcích Sada záznamů: Posouvání (ODBC) a Sada záznamů: Záložky a Absolutní pozice (ODBC). Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Příklad
Podívejte se na příklad pro IsBOF
.
CRecordset::MoveNext
Vytvoří první záznam v další sadě řádků jako aktuální záznam.
void MoveNext();
Poznámky
Pokud jste neimplementovali hromadné načítání řádků, sada záznamů má velikost sady řádků 1, takže MoveNext
se přesune na další záznam.
Poznámka:
Když procházíte sadou záznamů, nemůžete vynechat odstraněné záznamy. Podrobnosti najdete v IsDeleted
členské funkci.
Upozornění
Volání některé z Move
funkcí vyvolá výjimku, pokud sada záznamů neobsahuje žádné záznamy. Chcete-li určit, zda sada záznamů obsahuje nějaké záznamy, volání IsBOF
a IsEOF
.
Poznámka:
Před voláním se také doporučuje volat IsEOF
MoveNext
. Pokud jste například posunovali za konec sady záznamů, IsEOF
vrátí se nenulové; následné volání MoveNext
vyvolá výjimku.
Poznámka:
Pokud při aktualizaci nebo přidání aktuálního záznamu Move
zavoláte některou z funkcí, aktualizace se ztratí bez upozornění.
Další informace o navigaci v sadě záznamů naleznete v článcích Sada záznamů: Posouvání (ODBC) a Sada záznamů: Záložky a Absolutní pozice (ODBC). Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Příklad
Podívejte se na příklad pro IsBOF
.
CRecordset::MovePrev
Nastaví první záznam v předchozí sadě řádků na aktuální záznam.
void MovePrev();
Poznámky
Pokud jste neimplementovali hromadné načítání řádků, má sada záznamů velikost sady řádků 1, takže MovePrev
se přesune na předchozí záznam.
Poznámka:
Tato členová funkce není platná pro sady záznamů jen pro předávání.
Poznámka:
Když procházíte sadou záznamů, nemůžete vynechat odstraněné záznamy. Podrobnosti najdete v IsDeleted
členské funkci.
Upozornění
Volání některé z Move
funkcí vyvolá výjimku, pokud sada záznamů neobsahuje žádné záznamy. Chcete-li určit, zda sada záznamů obsahuje nějaké záznamy, volání IsBOF
a IsEOF
.
Poznámka:
Před voláním se také doporučuje volat IsBOF
MovePrev
. Pokud jste například posunuli před začátek sady záznamů, IsBOF
vrátí se nenulové; následné volání MovePrev
vyvolá výjimku.
Poznámka:
Pokud při aktualizaci nebo přidání aktuálního záznamu Move
zavoláte některou z funkcí, aktualizace se ztratí bez upozornění.
Další informace o navigaci v sadě záznamů naleznete v článcích Sada záznamů: Posouvání (ODBC) a Sada záznamů: Záložky a Absolutní pozice (ODBC). Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Příklad
Podívejte se na příklad pro IsBOF
.
CRecordset::OnSetOptions
Volá se k nastavení možností (při výběru) pro zadaný příkaz ODBC.
virtual void OnSetOptions(HSTMT hstmt);
Parametry
hstmt
Příkaz HSTMT
ODBC, jehož možnosti mají být nastaveny.
Poznámky
Volání OnSetOptions
pro nastavení možností (při výběru) pro zadaný příkaz ODBC. Architektura volá tuto členovu funkci k nastavení počátečních možností sady záznamů. OnSetOptions
určuje podporu zdroje dat pro posouvání kurzorů a pro souběžnost kurzoru a nastaví možnosti sady záznamů odpovídajícím způsobem. (vzhledem k tomu, že OnSetOptions
se používá pro operace výběru, OnSetUpdateOptions
slouží k operacím aktualizace.)
Přepsáním nastavíte OnSetOptions
možnosti specifické pro ovladač nebo zdroj dat. Pokud například váš zdroj dat podporuje otevírání výhradního přístupu, můžete tuto možnost přepsat OnSetOptions
.
Další informace o kurzorech naleznete v tématu ODBC.
CRecordset::OnSetUpdateOptions
Volá se k nastavení možností (používá se při aktualizaci) pro zadaný příkaz ODBC.
virtual void OnSetUpdateOptions(HSTMT hstmt);
Parametry
hstmt
Příkaz HSTMT
ODBC, jehož možnosti mají být nastaveny.
Poznámky
Volání OnSetUpdateOptions
pro nastavení možností (použité při aktualizaci) pro zadaný příkaz ODBC. Architektura volá tuto členovou funkci poté, co vytvoří HSTMT
aktualizaci záznamů v sadě záznamů. (Zatímco OnSetOptions
se používá pro operace výběru, OnSetUpdateOptions
používá se pro aktualizační operace.) OnSetUpdateOptions
určuje podporu zdroje dat pro posouvání kurzorů a pro souběžnost kurzorů a odpovídajícím způsobem nastaví možnosti sady záznamů.
Přepište OnSetUpdateOptions
nastavení možností příkazu ODBC před tímto příkazem pro přístup k databázi.
Další informace o kurzorech naleznete v tématu ODBC.
CRecordset::Open
Otevře sadu záznamů načtením tabulky nebo provedením dotazu, který sada záznamů představuje.
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none);
Parametry
nOpenType
Přijměte výchozí hodnotu AFX_DB_USE_DEFAULT_TYPE
nebo použijte jednu z následujících hodnot z enum OpenType
:
CRecordset::dynaset
Sada záznamů s obousměrným posouváním. Otevření sady záznamů určuje členství a řazení záznamů, ale změny provedené jinými uživateli datových hodnot jsou viditelné po operaci načtení. Dynamické sady jsou známy také jako sady záznamů řízené sadou klíčů.CRecordset::snapshot
Statická sada záznamů s obousměrným posouváním. Otevření sady záznamů určuje členství a řazení záznamů. Načtení záznamu určuje hodnoty dat. Změny provedené jinými uživateli nejsou viditelné, dokud se sada záznamů nezavře a pak znovu neotevře.CRecordset::dynamic
Sada záznamů s obousměrným posouváním. Změny členství, pořadí a datových hodnot provedené jinými uživateli jsou viditelné po operaci načtení. Mnoho ovladačů ODBC nepodporuje tento typ sady záznamů.CRecordset::forwardOnly
Sada záznamů jen pro čtení s posouváním vpřed.Pro
CRecordset
, výchozí hodnota jeCRecordset::snapshot
. Mechanismus výchozích hodnot umožňuje interakci průvodců aplikace Visual C++ s třídouCRecordset
pro rozhraní ODBC i třídouCDaoRecordset
pro rozhraní DAO, které používají různé výchozí hodnoty.
Další informace otěchtoch Související informace najdete v tématu Použití blokových a posuvných kurzorů v sadě Windows SDK.
Upozornění
Pokud požadovaný typ není podporovaný, architektura vyvolá výjimku.
lpszSQL
Ukazatel řetězce obsahující jedno z následujících:
Ukazatel
NULL
.Název tabulky.
Příkaz SQL
SELECT
(volitelně s klauzulí SQLWHERE
ORDER BY
).Příkaz
CALL
určující název předdefinovaného dotazu (uložená procedura). Dávejte pozor, abyste mezi složenou závorku aCALL
klíčové slovo nevkládejte prázdné znaky.
Další informace o tomto řetězci najdete v tabulce a diskuzi o roli TřídyWizard v části Poznámky .
Poznámka:
Pořadí sloupců v sadě výsledků musí odpovídat pořadí volání funkce RFX nebo Bulk RFX v přepsání funkce DoFieldExchange
nebo DoBulkFieldExchange
funkce.
dwOptions
Bitová maska, která může určit kombinaci níže uvedených hodnot. Některé se vzájemně vylučují. Výchozí hodnota je none
.
CRecordset::none
Nejsou nastaveny žádné možnosti. Tato hodnota parametru se vzájemně vylučuje se všemi ostatními hodnotami. Ve výchozím nastavení lze sadu záznamů aktualizovatEdit
neboDelete
umožňuje přidávat nové záznamy pomocíAddNew
. Aktualizovatelnost závisí na zdroji dat a možnostinOpenType
, kterou zadáte. Optimalizace pro hromadné přidávání není k dispozici. Hromadné načítání řádků se neimplementuje. Během navigace v sadě záznamů se odstraněné záznamy nepřeskočí. Záložky nejsou k dispozici. Automatická kontrola nečistých polí je implementována.CRecordset::appendOnly
NepovolujteEdit
aniDelete
na sadě záznamů. Povolit pouze funkciAddNew
. Tato možnost se vzájemně vylučuje s možnostíCRecordset::readOnly
.CRecordset::readOnly
Otevřete sadu záznamů jen pro čtení. Tato možnost se vzájemně vylučuje s možnostíCRecordset::appendOnly
.CRecordset::optimizeBulkAdd
Pomocí připraveného příkazu SQL můžete optimalizovat přidávání mnoha záznamů najednou. Platí jenom v případě, že k aktualizaci sady záznamů nepoužíváte funkciSQLSetPos
rozhraní ODBC API. První aktualizace určuje, která pole jsou označena za nečistá. Tato možnost se vzájemně vylučuje s možnostíCRecordset::useMultiRowFetch
.CRecordset::useMultiRowFetch
Implementujte hromadné načítání řádků, aby bylo možné načíst více řádků v rámci jedné operace načtení. Jedná se o pokročilou funkci navrženou tak, aby zlepšila výkon; Výměna polí hromadného záznamu však není podporovánaClassWizard
. Tato možnost se vzájemně vylučuje s možnostíCRecordset::optimizeBulkAdd
. Pokud zadáteCRecordset::useMultiRowFetch
, bude tato možnostCRecordset::noDirtyFieldCheck
zapnutá automaticky (dvojité ukládání do vyrovnávací paměti nebude k dispozici); u sad záznamů pouze pro předávání dál se tato možnostCRecordset::useExtendedFetch
automaticky zapne. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).CRecordset::skipDeletedRecords
Při procházení sady záznamů přeskočte všechny odstraněné záznamy. V určitých relativních načteních tato možnost sníží výkon. Tato možnost není platná u sad záznamů jen pro předávání. Pokud zavoláteMove
s parametrem nRows nastaveným na 0 aCRecordset::skipDeletedRecords
sada možností,Move
bude assert.CRecordset::skipDeletedRecords
se podobá balení ovladačů, což znamená, že odstraněné řádky jsou ze sady záznamů odebrány. Pokud však ovladač zabalí záznamy, přeskočí pouze ty záznamy, které odstraníte; nepřeskočí záznamy odstraněné jinými uživateli, když je sada záznamů otevřená.CRecordset::skipDeletedRecords
přeskočí řádky odstraněné jinými uživateli.CRecordset::useBookmarks
V případě podpory může sada záznamů používat záložky. Záložky zpomalují načítání dat, ale zvyšují výkon navigace v nich. Nelze je použít v sadách záznamů s posouváním pouze vpřed. Další informace naleznete v tématu Sada záznamů: Záložky a Absolutní pozice (ODBC).CRecordset::noDirtyFieldCheck
Vypněte automatickou kontrolu nezašpiněného pole (dvojité ukládání do vyrovnávací paměti). Tím se zlepší výkon; Pole však musíte ručně označit jako nezašpiněná volánímSetFieldDirty
funkcí aSetFieldNull
členských funkcí. Dvojité ukládání do vyrovnávací paměti ve tříděCRecordset
je podobné dvojité vyrovnávací paměti ve tříděCDaoRecordset
. UCRecordset
jednotlivých polí ale nemůžete povolit dvojité ukládání do vyrovnávací paměti. Můžete ho povolit pro všechna pole nebo zakázat pro všechna pole. Pokud zadáte možnostCRecordset::useMultiRowFetch
, pakCRecordset::noDirtyFieldCheck
je zapnuta automaticky, aleSetFieldNull
nelze ji použít u sad záznamů,SetFieldDirty
které implementují hromadné načítání řádků.CRecordset::executeDirect
Nepoužívejte připravený příkaz SQL. Pokud chcete zvýšit výkon, určete tuto možnost, pokudRequery
se členová funkce nikdy nevolá.CRecordset::useExtendedFetch
ImplementujteSQLExtendedFetch
místoSQLFetch
. Navrženo pro implementaci hromadného načítání řádků pro sady záznamů s posouváním pouze vpřed. Pokud zadáte možnostCRecordset::useMultiRowFetch
v sadě záznamů jen pro předávání,CRecordset::useExtendedFetch
automaticky se zapne.CRecordset::userAllocMultiRowBuffers
Uživatel přidělí pro data vyrovnávací paměti úložiště. Tuto možnost použijte,CRecordset::useMultiRowFetch
pokud chcete přidělit vlastní úložiště. Jinak architektura automaticky přidělí potřebné úložiště. Další informace naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC). ZadáníCRecordset::userAllocMultiRowBuffers
bez zadáníCRecordset::useMultiRowFetch
výsledků v neúspěšném kontrolním výrazu
Vrácená hodnota
Nenulové, pokud CRecordset
byl objekt úspěšně otevřen; jinak 0, pokud CDatabase::Open
je volána, vrátí hodnotu 0.
Poznámky
Chcete-li spustit dotaz definovaný sadou záznamů, je zapotřebí zavolat tuto členskou funkci. Před voláním Open
je nutné sestavit objekt sady záznamů.
Připojení této sady záznamů ke zdroji dat závisí na tom, jak před voláním Open
sestavíte sadu záznamů . Pokud předáte CDatabase
objekt konstruktoru sady záznamů, který nebyl připojen ke zdroji dat, použije GetDefaultConnect
tato členská funkce pokus o otevření databázového objektu. Pokud předáte hodnotu NULL konstruktoru sady záznamů, konstruktor za vás vytvoří CDatabase
objekt a Open
pokusí se připojit databázový objekt. Podrobnosti o uzavření sady záznamů a připojení za těchto různých okolností naleznete v tématu Close
.
Poznámka:
Přístup ke zdroji dat pomocí objektu CRecordset
je vždy sdílen. CDaoRecordset
Na rozdíl od třídy nemůžete objekt použít CRecordset
k otevření zdroje dat s výhradním přístupem.
Při volání Open
dotazu, obvykle příkazu SQL SELECT
, vybere záznamy na základě kritérií zobrazených v následující tabulce.
Hodnota parametru lpszSQL |
Zvolené záznamy jsou určeny | Příklad |
---|---|---|
NULL |
Řetězec vrácený funkcí GetDefaultSQL . |
|
Název tabulky SQL | Všechny sloupce tabulkového seznamu ve funkci DoFieldExchange nebo DoBulkFieldExchange . |
"Customer" |
Název předdefinovaného dotazu (uložené procedury) | Sloupce, k jejichž vrácení je dotaz definován. | "{call OverDueAccts}" |
SELECT column-list FROM table-list |
Zadané sloupce ze zadané tabulky nebo tabulek. | "SELECT CustId, CustName FROM Customer" |
Upozornění
Nevkládejte do řetězce SQL nadbytečné prázdné znaky. Pokud například vložíte prázdné znaky mezi složenou závorku a CALL
klíčové slovo, mfc chybně interpretuje řetězec SQL jako název tabulky a začlení ho do SELECT
příkazu, což způsobí vyvolání výjimky. Podobně platí, že pokud předdefinovaný dotaz používá výstupní parametr, nevkládejte mezi složenou závorku a symbol '' prázdné znaky. Nakonec nesmíte vložit prázdné znaky před složenou závorku v CALL
příkazu nebo před SELECT
klíčové slovo v SELECT
příkazu.
Obvyklým postupem je předání NULL
Open
; v tomto případě Open
volá GetDefaultSQL. Pokud používáte odvozenou CRecordset
třídu, zadejte názvy tabulek, GetDefaultSQL
které jste zadali v ClassWizard
. Místo toho lze zadat jiné informace v parametru lpszSQL
.
Bez ohledu na to, co předáte, Open
sestaví konečný řetězec SQL pro dotaz (řetězec může mít k předanému lpszSQL
řetězci připojeny klauzule SQL WHERE
ORDER BY
) a pak dotaz spustí. Vytvořený řetězec můžete prozkoumat voláním GetSQL
po volání Open
. Další podrobnosti o tom, jak sada záznamů vytváří příkaz SQL a vybírá záznamy, naleznete v tématu Sada záznamů: Jak sady záznamů výběr záznamů (ODBC).
Datové členy polí třídy sady záznamů jsou svázány se sloupci zvolených dat. Jsou-li vráceny jakékoli záznamy, první záznam se stává aktuálním záznamem.
Chcete-li nastavit možnosti pro sadu záznamů, například filtr nebo řazení, zadejte je po vytvoření objektu sady záznamů, ale před voláním Open
. Pokud chcete aktualizovat záznamy v sadě záznamů po otevření sady záznamů, zavolejte Requery
.
Další informace, včetně dalších příkladů, naleznete v tématu Sada záznamů (ODBC), Sada záznamů: Jak sady záznamů vybrat záznamy (ODBC) a Sada záznamů: Vytváření a uzavření sad záznamů (ODBC).
Příklad
Následující příklady kódu ukazují různé formy Open
volání.
// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived
// objects
// Open rs using the default SQL statement, implement bookmarks, and turn
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
CRecordset::noDirtyFieldCheck);
// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));
// Accept all defaults
rsDefault.Open();
CRecordset::RefreshRowset
Aktualizuje data a stav řádku v aktuální sadě řádků.
void RefreshRowset(
WORD wRow,
WORD wLockType = SQL_LOCK_NO_CHANGE);
Parametry
wRow
Jednostranná pozice řádku v aktuální sadě řádků. Tato hodnota může být v rozsahu od nuly až po velikost sady řádků.
wLockType
Hodnota označující, jak po aktualizaci uzamknout řádek. Podrobnosti najdete v části Poznámky.
Poznámky
Pokud předáte hodnotu nula pro wRow
, bude každý řádek v sadě řádků aktualizován.
Chcete-li použít RefreshRowset
, je nutné implementovat hromadné načítání řádků zadáním CRecordset::useMulitRowFetch
možnosti v Open
členské funkci.
RefreshRowset
volá funkci SQLSetPos
rozhraní ODBC API . Parametr wLockType
určuje stav zámku řádku po SQLSetPos
provedení. Následující tabulka popisuje možné hodnoty pro wLockType
.
wLockType | Popis |
---|---|
SQL_LOCK_NO_CHANGE (výchozí hodnota) |
Ovladač nebo zdroj dat zajistí, že je řádek ve stejném uzamčeném nebo odemknutém stavu jako předtím RefreshRowset , než byl volána. |
SQL_LOCK_EXCLUSIVE |
Ovladač nebo zdroj dat uzamkne řádek výhradně. Tento typ zámku nepodporují všechny zdroje dat. |
SQL_LOCK_UNLOCK |
Ovladač nebo zdroj dat odemkne řádek. Tento typ zámku nepodporují všechny zdroje dat. |
Další informace naleznete v SQLSetPos
sadě Windows SDK. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
CRecordset::Requery
Znovu sestaví (aktualizuje) sadu záznamů.
virtual BOOL Requery();
Vrácená hodnota
Nenulové, pokud byla sada záznamů úspěšně znovu sestavena; jinak 0.
Poznámky
Jsou-li vráceny jakékoli záznamy, první záznam se stává aktuálním záznamem.
Aby sada záznamů odrážela přidání a odstranění, které vy nebo jiní uživatelé provádíte ve zdroji dat, musíte sadu záznamů znovu sestavit voláním Requery
. Pokud je sada záznamů dynamickou sadou, automaticky odráží aktualizace, které vy nebo jiní uživatelé provádíte v existujících záznamech (ale ne přidávání). Pokud je sada záznamů snímek, musíte volat Requery
, aby odrážely úpravy jinými uživateli a přidáváním a odstraňováním.
Pro dynamickou sadu nebo snímek volejte Requery
pokaždé, když chcete sadu záznamů znovu sestavit pomocí nového filtru nebo řazení nebo nových hodnot parametrů. Nastavte nový filtr nebo vlastnost řazení přiřazením nových hodnot a m_strFilter
m_strSort
před voláním Requery
. Nastavte nové parametry přiřazením nových hodnot datovým členům parametrů před voláním Requery
. Pokud se filtry a řetězce řazení nezmění, můžete dotaz znovu použít, což zlepšuje výkon.
Pokud pokus o opětovné sestavení sady záznamů selže, sada záznamů se zavře. Před voláním Requery
můžete určit, jestli se sada záznamů dá znovu dotazovat voláním CanRestart
členské funkce. CanRestart
nezaručuje, že Requery
to bude úspěšné.
Upozornění
Zavolejte Requery
až po zavolání Open
.
Příklad
Tento příklad znovu sestaví sadu záznamů, aby se použilo jiné pořadí řazení.
CCustomer rsCustSet(&m_dbCust);
// Open the recordset
rsCustSet.Open();
// Use the recordset ...
// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return; // Unable to requery
if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));
CRecordset::SetAbsolutePosition
Umístí sadu záznamů na záznam odpovídající zadanému číslu záznamu.
void SetAbsolutePosition(long nRows);
Parametry
nRows
Jednoúrovňová pořadová pozice aktuálního záznamu v sadě záznamů.
Poznámky
SetAbsolutePosition
přesune aktuální ukazatel záznamu na základě této pořadové pozice.
Poznámka:
Tato členová funkce není platná pro sady záznamů jen pro předávání.
U sad záznamů ODBC odkazuje absolutní nastavení pozice 1 na první záznam v sadě záznamů; nastavení 0 odkazuje na pozici začátku souboru (BOF).
Můžete také předat záporné hodnoty do SetAbsolutePosition
. V tomto případě se pozice sady záznamů vyhodnocuje z konce sady záznamů. Například SetAbsolutePosition( -1 )
přesune aktuální ukazatel záznamu na poslední záznam v sadě záznamů.
Poznámka:
Absolutní pozice není určená k použití jako náhradní číslo záznamu. Záložky jsou stále doporučeným způsobem uchování a návratu na danou pozici, protože se pozice záznamu změní při odstranění předchozích záznamů. Kromě toho si nemůžete být jisti, že daný záznam bude mít stejnou absolutní pozici, pokud se sada záznamů znovu vytvoří, protože pořadí jednotlivých záznamů v sadě záznamů není zaručeno, pokud se nevytvořil pomocí příkazu SQL pomocí ORDER BY
klauzule.
Další informace o navigaci sady záznamů a záložkách naleznete v článcích Sada záznamů: Posouvání (ODBC) a Sada záznamů: Záložky a Absolutní pozice (ODBC).
CRecordset::SetBookmark
Umístí sadu záznamů na záznam obsahující zadanou záložku.
void SetBookmark(const CDBVariant& varBookmark);
Parametry
varBookmark
Odkaz na CDBVariant
objekt obsahující hodnotu záložky pro určitý záznam.
Poznámky
Chcete-li zjistit, zda jsou záložky podporovány v sadě záznamů, zavolejte CanBookmark
. Pokud chcete, aby byly záložky dostupné, pokud jsou podporované, musíte nastavit CRecordset::useBookmarks
možnost v dwOptions
parametru Open
členské funkce.
Poznámka:
Pokud záložky nejsou podporované nebo nedostupné, volání SetBookmark
způsobí vyvolání výjimky. Záložky nejsou podporovány u sad záznamů jen pro předávání.
Chcete-li nejprve načíst záložku pro aktuální záznam, volání GetBookmark
, který uloží hodnotu záložky do objektu CDBVariant
. Později se k danému záznamu můžete vrátit voláním SetBookmark
pomocí uložené hodnoty záložky.
Poznámka:
Po určitých operacích sady záznamů byste měli před voláním SetBookmark
zkontrolovat trvalost záložky . Pokud například načtete záložku s voláním GetBookmark
a zavoláte Requery
, záložka už nemusí být platná. Zavolejte CDatabase::GetBookmarkPersistence
a zkontrolujte, jestli můžete bezpečně volat SetBookmark
.
Další informace o záložkách a navigaci v sadě záznamů naleznete v článcích Sada záznamů: Záložky a Absolutní pozice (ODBC) a Sada záznamů: Posouvání (ODBC).
CRecordset::SetFieldDirty
Označí datový člen sady záznamů jako změněný nebo nezměněný datový člen pole.
void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
Parametry
pv
Obsahuje adresu datového člena pole v sadě záznamů nebo NULL
. Pokud NULL
jsou všechny datové členy pole v sadě záznamů označeny příznakem. (Jazyk C++ NULL
není stejný jako hodnota Null v terminologii databáze, což znamená "bez hodnoty".)
bDirty
TRUE
pokud má být datový člen pole označen příznakem "dirty" (změněno). Jinak FALSE
pokud se datový člen pole označí příznakem "clean" (beze změny).
Poznámky
Označení polí jako nezměněné zajišťuje, že se pole neaktualizuje a vede k menšímu provozu SQL.
Poznámka:
Tato členová funkce se nevztahuje na sady záznamů, které používají hromadné načítání řádků. Pokud jste implementovali hromadné načítání řádků, výsledkem SetFieldDirty
bude neúspěšný kontrolní výraz. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Architektura označuje změněné datové členy polí, aby se zajistilo, že budou zapsány do záznamu ve zdroji dat mechanismem výměny polí záznamu (RFX). Když změníte hodnotu pole, obvykle se pole automaticky zašpiní, takže se budete muset volat SetFieldDirty
jen zřídka, ale někdy budete chtít zajistit, aby se sloupce explicitně aktualizovaly nebo vložili bez ohledu na hodnotu datového člena pole.
Použití NULL
pro první argument funkce použije funkci pouze u outputColumn
polí, nikoli param
polí. Například volání
SetFieldNull(NULL);
nastaví pouze outputColumn
pole NULL
na ; param
pole nebudou ovlivněna.
Pokud chcete pracovat na param
polích, musíte zadat skutečnou adresu jednotlivce param
, na který chcete pracovat, například:
SetFieldNull(&m_strParam);
To znamená, že nemůžete nastavit všechna param
pole tak NULL
, jak je to možné s outputColumn
poli.
CRecordset::SetFieldNull
Označí datový člen sady záznamů jako datový člen pole null (konkrétně nemá žádnou hodnotu) nebo jako nenulový.
void SetFieldNull(void* pv, BOOL bNull = TRUE);
Parametry
pv
Obsahuje adresu datového člena pole v sadě záznamů nebo NULL
. Pokud NULL
jsou všechny datové členy pole v sadě záznamů označeny příznakem. (Jazyk C++ NULL
není stejný jako hodnota Null v terminologii databáze, což znamená "bez hodnoty".)
bNull
Nenulové, pokud se datový člen pole označí příznakem, že nemá žádnou hodnotu (Null). Jinak hodnota 0, pokud má být datový člen pole označen jako nenulový.
Poznámky
Když do sady záznamů přidáte nový záznam, všechny datové členy polí se zpočátku nastaví na hodnotu Null a označí se jako "dirty" (změněno). Když načtete záznam ze zdroje dat, jeho sloupce už mají hodnoty nebo mají hodnotu Null.
Poznámka:
Tuto členovou funkci nevolejte u sad záznamů, které používají hromadné načítání řádků. Pokud jste implementovali hromadné načítání řádků, výsledkem volání SetFieldNull
je neúspěšný kontrolní výraz. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
Pokud chcete konkrétně určit pole aktuálního záznamu, že nemá hodnotu, volání SetFieldNull
s bNull
nastaveným příznakem TRUE
příznaku Null. Pokud bylo pole dříve označené hodnotou Null a teď chcete dát hodnotu, nastavte její novou hodnotu. Příznak Null nemusíte odebírat s příznakem SetFieldNull
. Chcete-li zjistit, zda pole může být Null, volání IsFieldNullable
.
Použití NULL
pro první argument funkce použije funkci pouze u outputColumn
polí, nikoli param
polí. Například volání
SetFieldNull(NULL);
nastaví pouze outputColumn
pole NULL
na ; param
pole nebudou ovlivněna.
Pokud chcete pracovat na param
polích, musíte zadat skutečnou adresu jednotlivce param
, na který chcete pracovat, například:
SetFieldNull(&m_strParam);
To znamená, že nemůžete nastavit všechna param
pole tak NULL
, jak je to možné s outputColumn
poli.
Poznámka:
Při nastavování parametrů na hodnotu Null je výsledkem volání SetFieldNull
před otevřením sady záznamů kontrolní výraz. V tomto případě zavolejte SetParamNull
.
SetFieldNull
se implementuje prostřednictvím DoFieldExchange
.
CRecordset::SetLockingMode
Nastaví režim uzamčení na optimistické uzamčení (výchozí) nebo pesimistické uzamčení. Určuje, jak jsou záznamy uzamčeny pro aktualizace.
void SetLockingMode(UINT nMode);
Parametry
nMode
Obsahuje jednu z následujících hodnot:enum LockMode
optimistic
Optimistické uzamčení uzamkne aktualizovaný záznam pouze během voláníUpdate
.pessimistic
Pesimistické uzamčení zamkne záznam, jakmileEdit
bude voláno, a zachová ho zamknuté, dokudUpdate
se volání neskončí nebo se přesunete na nový záznam.
Poznámky
Tuto členovou funkci zavolejte, pokud potřebujete určit, které ze dvou strategií uzamykání záznamů sada záznamů používá pro aktualizace. Ve výchozím nastavení je optimistic
režim uzamčení sady záznamů . Můžete to změnit na opatrnější pessimistic
strategii uzamykání. Volání SetLockingMode
po vytvoření a otevření objektu sady záznamů, ale před voláním Edit
.
CRecordset::SetParamNull
Označí parametr jako Null (konkrétně nemá žádnou hodnotu) nebo jako hodnotu non-Null.
void SetParamNull(
int nIndex,
BOOL bNull = TRUE);
Parametry
nIndex
Index parametru založený na nule.
bNull
Pokud TRUE
(výchozí hodnota), parametr má příznak Null. V opačném případě se parametr označí jako nenulový.
Poznámky
Na rozdíl od SetFieldNull
toho můžete volat SetParamNull
před otevřením sady záznamů.
SetParamNull
se obvykle používá s předdefinovanými dotazy (uložené procedury).
CRecordset::SetRowsetCursorPosition
Přesune kurzor na řádek v aktuální sadě řádků.
void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
Parametry
wRow
Jednostranná pozice řádku v aktuální sadě řádků. Tato hodnota může být v rozsahu od 1 do velikosti sady řádků.
wLockType
Hodnota označující, jak po aktualizaci uzamknout řádek. Podrobnosti najdete v části Poznámky.
Poznámky
Při implementaci hromadného načítání řádků se záznamy načítají sadami řádků, kde první záznam v sadě načtených řádků je aktuální záznam. Chcete-li vytvořit jiný záznam v sadě řádků aktuální záznam, zavolejte SetRowsetCursorPosition
. Pomocí členské funkce můžete SetRowsetCursorPosition
GetFieldValue
například dynamicky načítat data z libovolného záznamu sady záznamů.
Chcete-li použít SetRowsetCursorPosition
, je nutné implementovat hromadné načítání řádků zadáním CRecordset::useMultiRowFetch
možnosti dwOptions
parametru Open
v členské funkci.
SetRowsetCursorPosition
volá funkci SQLSetPos
rozhraní ODBC API . Parametr wLockType
určuje stav zámku řádku po SQLSetPos
provedení. Následující tabulka popisuje možné hodnoty pro wLockType
.
wLockType |
Popis |
---|---|
SQL_LOCK_NO_CHANGE (výchozí hodnota) |
Ovladač nebo zdroj dat zajistí, že je řádek ve stejném uzamčeném nebo odemknutém stavu jako předtím SetRowsetCursorPosition , než byl volána. |
SQL_LOCK_EXCLUSIVE |
Ovladač nebo zdroj dat uzamkne řádek výhradně. Tento typ zámku nepodporují všechny zdroje dat. |
SQL_LOCK_UNLOCK |
Ovladač nebo zdroj dat odemkne řádek. Tento typ zámku nepodporují všechny zdroje dat. |
Další informace naleznete v SQLSetPos
sadě Windows SDK. Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
CRecordset::SetRowsetSize
Určuje počet záznamů, které chcete načíst během načítání.
virtual void SetRowsetSize(DWORD dwNewRowsetSize);
Parametry
dwNewRowsetSize
Početřádkůch
Poznámky
Tato virtuální členová funkce určuje, kolik řádků chcete načíst během jednoho načtení při použití hromadného načítání řádků. Pokud chcete implementovat hromadné načítání řádků, musíte nastavit CRecordset::useMultiRowFetch
možnost v dwOptions
parametru Open
členské funkce.
Poznámka:
Volání SetRowsetSize
bez implementace hromadného načítání řádků způsobí neúspěšné kontrolní výrazy.
Před SetRowsetSize
voláním Open
nejprve nastavte velikost sady řádků pro sadu záznamů. Výchozí velikost sady řádků při implementaci hromadného načítání řádků je 25.
Poznámka:
Při volání SetRowsetSize
používejte upozornění . Pokud ručně alokujete úložiště pro data (podle CRecordset::userAllocMultiRowBuffers
možnosti parametru dwOptions v Open
), měli byste zkontrolovat, jestli po volání SetRowsetSize
potřebujete tyto vyrovnávací paměti úložiště znovu přidělit , ale před provedením jakékoli operace navigace kurzorem.
Chcete-li získat aktuální nastavení pro velikost sady řádků, volání GetRowsetSize
.
Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
CRecordset::Update
AddNew
Dokončí operaci Edit
uložením nových nebo upravených dat do zdroje dat.
virtual BOOL Update();
Vrácená hodnota
Nenulové, pokud byl jeden záznam úspěšně aktualizován; jinak 0, pokud se nezměnily žádné sloupce. Pokud nebyly aktualizovány žádné záznamy nebo pokud byl aktualizován více než jeden záznam, vyvolá se výjimka. Výjimku vyvolá také případná jiná chyba ve zdroji dat.
Poznámky
Volání této členské funkce po volání funkce nebo Edit
členaAddNew
. Toto volání je nutné k dokončení AddNew
operace.Edit
Poznámka:
Pokud jste implementovali hromadné načítání řádků, nemůžete volat Update
. Výsledkem bude neúspěšný kontrolní výraz. I když třída CRecordset
neposkytuje mechanismus pro aktualizaci hromadných řádků dat, můžete psát vlastní funkce pomocí funkce SQLSetPos
rozhraní ODBC API . Další informace o hromadném načítání řádků naleznete v tématu Sada záznamů: Načítání záznamů hromadně (ODBC).
A AddNew
Edit
připravte vyrovnávací paměť pro úpravy, ve které jsou přidaná nebo upravená data umístěna pro uložení do zdroje dat. Update
uloží data. Aktualizují se jenom tato pole označená nebo zjištěná jako změněná.
Pokud zdroj dat podporuje transakce, můžete provést Update
volání (a jeho odpovídající AddNew
nebo Edit
volat) část transakce. Další informace o transakcích naleznete v tématu Transakce (ODBC).
Upozornění
Pokud zavoláte Update
bez prvního volání nebo AddNew
Edit
, Update
vyvolá chybu CDBException
. Pokud voláte AddNew
nebo Edit
, musíte volat Update
před voláním Move
operace nebo před zavření sady záznamů nebo připojení zdroje dat. V opačném případě dojde ke ztrátě změn bez oznámení.
Podrobnosti o zpracování Update
selhání najdete v tématu Sada záznamů: Jak sady záznamů aktualizují záznamy (ODBC).
Příklad
Viz Transakce: Provádění transakce v sadě záznamů (ODBC).
Viz také
Třída CObject
Hierarchy chart
Třída CDatabase
Třída CRecordView