Sdílet prostřednictvím


Sada záznamů: Hromadné načítání záznamů (ODBC)

Toto téma platí pro třídy knihovny MFC rozhraní ODBC.

Třída CRecordset poskytuje podporu pro hromadné načítání řádků, což znamená, že více záznamů lze načíst najednou během jednoho načtení, namísto načítání záznamů po jednom ze zdroje dat. Hromadné načítání řádků můžete implementovat pouze v odvozené třídě CRecordset. Proces přenosu dat ze zdroje dat do objektu sady záznamů se nazývá hromadná výměna pole záznamu (Bulk RFX). Všimněte si, že pokud nepoužíváte hromadné načítání řádků v odvozené třídě CRecordset, data jsou přenášena prostřednictvím výměny pole záznamu (RFX). Další informace naleznete v tématu Výměna pole záznamu (RFX).

Toto téma vysvětluje:

  • Jak podporuje CRecordset hromadné načítání řádků.

  • Některé zvláštní aspekty při použití hromadného načítání řádků.

  • Jak implementovat hromadnou výměnu pole záznamu.

Jak podporuje CRecordset hromadné načítání řádků

Před tím, než otevřete objekt sadu záznamů, můžete definovat velikost sady řádků pomocí členské funkce SetRowsetSize. Velikost sady řádků určuje, kolik záznamů by mělo být načteno během jednoho načtení. Pokud je hromadné načítání řádků implementováno, výchozí velikost sady řádků je 25. Pokud není hromadné načítání řádků implementováno, velikost sady řádků zůstane pevně 1.

Poté, co jste inicializovali velikost sady řádků, volejte členskou funkci Otevřít. Zde musíte specifikovat možnost CRecordset::useMultiRowFetch parametru dwOptions, chcete-li implementovat hromadné načítání řádků. Můžete také nastavit možnost CRecordset::userAllocMultiRowBuffers. Mechanismus hromadné výměny pole záznamu používá pole k uložení více řádků dat, které jsou načteny. Tyto vyrovnávací paměti úložiště mohou být automaticky přiděleny systémem nebo je můžete přidělit ručně. Určíte-li možnost CRecordset::userAllocMultiRowBuffers, provedete přidělení.

V následující tabulce jsou uvedeny členské funkce poskytované třídou CRecordset pro podporu hromadného načítání řádků.

Členská funkce

Popis

CheckRowsetError

Virtuální funkce, která zpracovává všechny chyby, ke kterým dojde během načítání.

DoBulkFieldExchange

Implementuje hromadnou výměnu pole záznamu. Je volána automaticky, aby zajistila přenos více řádků dat ze zdroje dat do objektu sady záznamů.

GetRowsetSize

Získá aktuální nastavení velikosti sady řádků.

GetRowsFetched

Sdělí nám informace o tom, kolik řádků bylo skutečně načteno po daném načtení. Ve většině případů je to velikost sady řádků, pokud nebyla načtena nekompletní sada řádků.

GetRowStatus

Vrátí stav načítání pro konkrétní řádek v rámci sady řádků.

RefreshRowset

Aktualizuje data a stav konkrétního řádku v rámci sady řádků.

SetRowsetCursorPosition

Přesune kurzor na konkrétní řádek v rámci sady řádků.

GetRowsetSize

Virtuální funkce, která změní nastavení velikosti sady řádků na zadanou hodnotu.

Zvláštní aspekty

Ačkoliv hromadné načítání řádků zvýší výkon, určité funkce fungují odlišně. Před tím, než se rozhodnete implementovat hromadné načítání řádků, zvažte následující skutečnosti:

  • Systém automaticky volá členskou funkci DoBulkFieldExchange k přenosu dat ze zdroje dat do objektu sady záznamů. Nicméně data nejsou přenesena ze sady záznamů zpět do zdroje dat. Volání členských funkcí AddNew, Edit, Delete nebo Update má za následek selhání výrazu. Ačkoliv CRecordset aktuálně neposkytuje mechanismus pro hromadnou aktualizaci řádků dat, můžete napsat vlastní funkce pomocí funkce rozhraní ODBC API SQLSetPos. Další informace o SQLSetPos naleznete v Programátorská reference rozhraní ODBC sada SDK v dokumentaci MSDN.

  • Členské funkce IsDeleted, IsFieldDirty, IsFieldNull, IsFieldNullable, SetFieldDirty a SetFieldNull nelze použít u sady záznamů, která implementuje hromadné načítání řádků. Nicméně můžete volat GetRowStatus místo IsDeleted a GetODBCFieldInfo místo IsFieldNullable.

  • Operace Přesunutí přemístí sadu záznamů po sadě řádků. Předpokládejme například, že otevřete sadu záznamů, která obsahuje 100 záznamů s počáteční velikostí sady řádků 10. Open načte řádky 1 až 10 s tím, že je aktuální záznam umístěn na řádek 1. Volání MoveNext načte další sadu řádků, ne další řádek. Tato další sada řádků se skládá z řádků 11 až 20 s tím, že je aktuální záznam umístěn na řádek 11. Všimněte si, že MoveNext a Move( 1 ) nejsou ekvivalentní, pokud je hromadné načítání řádků implementováno. Move( 1 ) načte sadu řádků, která začíná 1 řádkem od aktuálního záznamu. V tomto příkladu volání Move( 1 ) po volání Open načte sadu řádků, která se skládá z řádků 2 až 11 s tím, že je aktuální záznam umístěn na řádek 2. Další informace naleznete v členské funkci Move.

  • Na rozdíl od výměny pole záznamů, průvodci nepodporují hromadnou výměnu pole záznamů. To znamená, že musíte ručně deklarovat pole datových členů a ručně přepsat DoBulkFieldExchange tím, že napíšete volání funkcí hromadné výměny pole záznamů. Další informace naleznete v tématu Funkce výměny pole záznamů v Referenci knihovny třídy.

Jak implementovat hromadnou výměnu pole záznamů.

Hromadná výměna pole záznamu přenese sadu řádků dat ze zdroje dat do objektu sady záznamů. Funkce hromadné výměny pole záznamů používají pole pro ukládání těchto dat právě tak, jako pole ukládají délku každé datové položky do sady řádků. V definici vaší třídy musíte definovat pole datových členů jako ukazatele pro přístup k polím dat. Kromě toho je nutné definovat sadu ukazatelů pro přístup k polím délek. Žadné parametry datových členů by neměly být deklarovány jako ukazatele; deklarování parametrů datových členů při použití hromadné výměny pole záznamu je stejné jako jejich deklarování při použití výměny pole 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;

   .
   .
   .
}

Vyrovnávací paměti úložiště můžete přidělit ručně nebo to systém provede za Vás. Chcete-li přidělit vyrovnávací paměťi sami, je nutné zadat možnost CRecordset::userAllocMultiRowBuffers parametru dwOptions v členské funkci Open. Nezapomeňte nastavit velikosti polí tak, aby byla alespoň rovna velikosti sady řádků. Pokud chcete, aby systém provedl přidělení za Vás, měli byste inicializovat ukazatele na hodnotu NULL. To se obvykle provede 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 členskou funkci DoBulkFieldExchange. Pro pole datových členů volejte funkce hromadné výměny pole záznamů; pro všechny parametry datových členů volejte funkce výměny pole záznamů. Jestliže jste otevřeli sadu záznamů předáním příkazu SQL nebo uložené procedury funkci Open, pořadí, ve kterém provedete volání hromadné výměny pole záznamů musí odpovídat pořadí sloupců v sadě záznamů; podobně pořadí volání parametrů RFX 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

Musíte zavolat členskou funkci Close před tím, než se vaše odvozená třída CRecordset dostane mimo rozsah platnosti. Tím zajistíte, že jakákoli paměť přidělená systémem bude uvolněna. Je dobrým programovacím postupem vždy explicitně volat funkci Close bez ohledu na to, zda jste implementovali hromadné načítání řádků.

Další informace o výměně pole záznamu (RFX) naleznete v tématu Výměna pole záznamu: Podstata práce RFX. Další informace o použití parametrů naleznete v tématu CFieldExchange::SetFieldType a Sada záznamů: Parametrizování a sada záznamů (rozhraní ODBC).

Viz také

Odkaz

CRecordset::m_nFields

CRecordset::m_nParams

Koncepty

Sada záznamů (ODBC)