Sada záznamů: Hromadné načítání záznamů (ODBC)
Toto téma se vztahuje na třídy MFC ODBC.
Třída CRecordset
poskytuje podporu hromadného načítání řádků, což znamená, že více záznamů lze najednou načíst během jednoho načtení, a ne načíst jeden záznam najednou ze zdroje dat. Hromadné načítání řádků lze implementovat pouze v odvozené CRecordset
třídě. Proces přenosu dat ze zdroje dat do objektu sady záznamů se nazývá hromadná výměna polí záznamu (Bulk RFX). Všimněte si, že pokud nepoužíváte hromadné načítání řádků v CRecordset
odvozené třídě, data se přenášejí prostřednictvím výměny polí záznamu (RFX). Další informace najdete v tématu Výměna polí záznamu (RFX).<
Toto téma vysvětluje:
Při použití hromadného načítání řádků je potřeba vzít v úvahu některé zvláštní aspekty.
Implementace výměny polí hromadného záznamu
Jak CRecordset podporuje hromadné načítání řádků
Před otevřením objektu SetRowsetSize
sady záznamů můžete definovat velikost sady řádků pomocí členské funkce. Velikost sady řádků určuje, kolik záznamů se má načíst během jednoho načtení. Při hromadném načítání řádků je implementována výchozí velikost sady řádků 25. Pokud se neimplementuje hromadné načítání řádků, zůstane velikost sady řádků pevná na 1.
Po inicializaci velikosti sady řádků volejte funkci Člen Open . Tady musíte zadat CRecordset::useMultiRowFetch
možnost parametru dwOptions pro implementaci hromadného načítání řádků. Můžete také nastavit CRecordset::userAllocMultiRowBuffers
možnost. Mechanismus výměny polí hromadného záznamu používá pole k uložení více řádků dat načtených během načítání. Tyto vyrovnávací paměti úložiště je možné přidělit automaticky rozhraním nebo je můžete přidělit ručně. Když CRecordset::userAllocMultiRowBuffers
zadáte možnost, znamená to, že přidělení provedete.
Následující tabulka uvádí členské funkce poskytované CRecordset
pro podporu hromadného načítání řádků.
Členová funkce | Popis |
---|---|
CheckRowsetError | Virtuální funkce, která zpracovává všechny chyby, ke kterým dochází při načítání. |
DoBulkFieldExchange | Implementuje hromadnou výměnu polí záznamu. Volá se automaticky pro přenos více řádků dat ze zdroje dat do objektu sady záznamů. |
GetRowsetSize | Načte aktuální nastavení velikosti sady řádků. |
GetRowsFetched | Udává, kolik řádků bylo skutečně načteno po daném načtení. Ve většině případů se jedná o velikost sady řádků, pokud nebyla načtena neúplná sada řádků. |
GetRowStatus | Vrátí stav načtení konkrétního řádku v sadě řádků. |
RefreshRowset | Aktualizuje data a stav konkrétního řádku v sadě řádků. |
SetRowsetCursorPosition | Přesune kurzor na konkrétní řádek v sadě řádků. |
SetRowsetSize | Virtuální funkce, která změní nastavení velikosti sady řádků na zadanou hodnotu. |
Zvláštní aspekty
I když je načtení hromadného řádku zvýšením výkonu, některé funkce fungují jinak. Než se rozhodnete implementovat hromadné načítání řádků, zvažte následující:
Architektura automaticky volá členovu
DoBulkFieldExchange
funkci pro přenos dat ze zdroje dat do objektu sady záznamů. Data se ale ze sady záznamů nepřenesou zpět do zdroje dat. Volání funkceAddNew
,Edit
,Delete
neboUpdate
členské funkce má za následek neúspěšné kontrolní výraz. AčkoliCRecordset
v současné době neposkytuje mechanismus pro aktualizaci hromadných řádků dat, můžete psát vlastní funkce pomocí funkceSQLSetPos
rozhraní ODBC API . Další informace oSQLSetPos
nástroji ODBC Programátor naleznete v tématu Referenční informace.Členské funkce
IsDeleted
, ,IsFieldDirty
IsFieldNull
,IsFieldNullable
,SetFieldDirty
aSetFieldNull
nelze použít u sad záznamů, které implementují hromadné načítání řádků. Můžete však volatGetRowStatus
místoIsDeleted
, aGetODBCFieldInfo
místoIsFieldNullable
.Operace
Move
přemísťují sadu záznamů podle sady řádků. Předpokládejme například, že otevřete sadu záznamů, která má 100 záznamů s počáteční velikostí sady řádků 10.Open
načte řádky 1 až 10 s aktuálním záznamem umístěným na řádku 1. Volání proMoveNext
načtení další sady řádků, nikoli dalšího řádku. Tato sada řádků se skládá z řádků 11 až 20 s aktuálním záznamem umístěným na řádku 11. Mějte na paměti, žeMoveNext
aMove( 1 )
nejsou ekvivalentní, pokud je implementováno hromadné načítání řádků.Move( 1 )
Načte sadu řádků, která začíná 1 řádek z aktuálního záznamu. V tomto příkladu voláníMove( 1 )
po voláníOpen
načte sadu řádků skládající se z řádků 2 až 11 s aktuálním záznamem umístěným na řádku 2. Další informace naleznete v části Přesunout člen funkce.Na rozdíl od výměny polí záznamů průvodce nepodporuje hromadnou výměnu polí záznamů. To znamená, že musíte ručně deklarovat datové členy pole a ručně přepsat
DoBulkFieldExchange
zápisem volání funkcí Bulk RFX. Další informace naleznete v tématu Záznam Pole Exchange Funkce v knihovně tříd reference.
Implementace výměny polí hromadného záznamu
Hromadná výměna polí záznamu přenáší sadu řádků dat ze zdroje dat do objektu sady záznamů. Funkce Bulk RFX používají pole k ukládání těchto dat a také pole k uložení délky jednotlivých datových položek v sadě řádků. V definici třídy musíte definovat datové členy pole jako ukazatele pro přístup k polím dat. Kromě toho musíte definovat sadu ukazatelů pro přístup k polím délek. Žádné datové členy parametrů by neměly být deklarovány jako ukazatele; deklarování datových členů parametrů při použití hromadné výměny polí záznamů je stejné jako deklarování při použití výměny polí záznamu. Následující kód ukazuje jednoduchý příklad:
class MultiRowSet : public CRecordset
{
public:
// Field/Param Data
// field data members
long* m_rgID;
LPSTR m_rgName;
// pointers for the lengths
// of the field data
long* m_rgIDLengths;
long* m_rgNameLengths;
// input parameter data member
CString m_strNameParam;
.
.
.
}
Tyto vyrovnávací paměti úložiště můžete přidělit ručně, nebo můžete mít architekturu přidělenou. Pokud chcete přidělit vyrovnávací paměti sami, musíte zadat CRecordset::userAllocMultiRowBuffers
možnost parametru dwOptions v Open
členské funkci. Nezapomeňte nastavit velikosti polí alespoň stejné jako velikost sady řádků. Pokud chcete architekturu přidělit, měli byste inicializovat ukazatele na hodnotu NULL. To se obvykle provádí v konstruktoru objektu sady záznamů:
MultiRowSet::MultiRowSet( CDatabase* pDB )
: CRecordset( pDB )
{
m_rgID = NULL;
m_rgName = NULL;
m_rgIDLengths = NULL;
m_rgNameLengths = NULL;
m_strNameParam = "";
m_nFields = 2;
m_nParams = 1;
.
.
.
}
Nakonec musíte přepsat členovu DoBulkFieldExchange
funkci. U datových členů pole volejte funkce Bulk RFX; pro všechny členy dat parametrů volejte funkce RFX. Pokud jste otevřeli sadu záznamů předáním příkazu SQL nebo uložené procedury Open
, pořadí, ve kterém provedete hromadné volání RFX, musí odpovídat pořadí sloupců v sadě záznamů. Podobně pořadí volání RFX pro parametry musí odpovídat pořadí parametrů v příkazu SQL nebo uložené proceduře.
void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
// call the Bulk RFX functions
// for field data members
pFX->SetFieldType( CFieldExchange::outputColumn );
RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
&m_rgID, &m_rgIDLengths );
RFX_Text_Bulk( pFX, _T( "[colName]" ),
&m_rgName, &m_rgNameLengths, 30 );
// call the RFX functions for
// for parameter data members
pFX->SetFieldType( CFieldExchange::inputParam );
RFX_Text( pFX, "NameParam", m_strNameParam );
}
Poznámka:
Před tím, Close
než odvozená CRecordset
třída přejde mimo rozsah, je nutné volat členovu funkci. Tím se zajistí, že se uvolní veškerá paměť přidělená architekturou. Je vhodné vždy explicitně volat Close
, bez ohledu na to, zda jste implementovali hromadné načítání řádků.
Další informace o výměně polí záznamu (RFX) naleznete v tématu Výměna polí záznamu: Jak RFX funguje. Další informace o použití parametrů naleznete v tématu CFieldExchange::SetFieldType a Recordset: Parametrizace sady záznamů (ODBC).
Viz také
Sada záznamů (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams