Sdílet prostřednictvím


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 CRecordsetodvozené 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).</a0>

Toto téma vysvětluje:

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í funkce AddNew, Edit, Deletenebo Update členské funkce má za následek neúspěšné kontrolní výraz. Ačkoli CRecordset v současné době neposkytuje mechanismus pro aktualizaci hromadných řádků dat, můžete psát vlastní funkce pomocí funkce SQLSetPosrozhraní ODBC API . Další informace o SQLSetPosnástroji ODBC Programátor naleznete v tématu Referenční informace.

  • Členské funkce IsDeleted, , IsFieldDirtyIsFieldNull, IsFieldNullable, SetFieldDirtya SetFieldNull nelze použít u sad záznamů, které implementují hromadné načítání řádků. Můžete však volat GetRowStatus místo IsDeleted, a GetODBCFieldInfo místo IsFieldNullable.

  • 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í pro MoveNext 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, že MoveNext a Move( 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