Udostępnij za pośrednictwem


Zestaw rekordów: zbiorcze pobieranie rekordów (ODBC)

Ten temat dotyczy klas MFC ODBC.

Klasa CRecordset zapewnia obsługę zbiorczego pobierania wierszy, co oznacza, że wiele rekordów można pobrać jednocześnie podczas pojedynczego pobierania, zamiast pobierać jeden rekord jednocześnie ze źródła danych. Pobieranie wierszy zbiorczych można zaimplementować tylko w klasie pochodnej CRecordset . Proces przesyłania danych ze źródła danych do obiektu zestawu rekordów jest nazywany wymianą pól rekordów zbiorczych (Bulk RFX). Należy pamiętać, że jeśli nie używasz zbiorczego pobierania wierszy w klasie pochodnej CRecordset, dane są przesyłane za pośrednictwem wymiany pól rekordów (RFX). Aby uzyskać więcej informacji, zobacz Rekord Field Exchange (RFX).

W tym temacie opisano:

Jak zestaw CRecordset obsługuje pobieranie wierszy zbiorczych

Przed otwarciem obiektu zestawu rekordów można zdefiniować rozmiar zestawu wierszy z funkcją składową SetRowsetSize . Rozmiar zestawu wierszy określa, ile rekordów należy pobrać podczas pojedynczego pobierania. Po zaimplementowaniu zbiorczego pobierania wierszy domyślny rozmiar zestawu wierszy wynosi 25. Jeśli pobieranie wierszy zbiorczych nie jest implementowane, rozmiar zestawu wierszy pozostaje stały na 1.

Po zainicjowaniu rozmiaru zestawu wierszy wywołaj funkcję Otwórz składową. W tym miejscu należy określić CRecordset::useMultiRowFetch opcję parametru dwOptions , aby zaimplementować pobieranie wierszy zbiorczych. Możesz dodatkowo ustawić CRecordset::userAllocMultiRowBuffers opcję. Mechanizm wymiany pól rekordów zbiorczych używa tablic do przechowywania wielu wierszy danych pobranych podczas pobierania. Te bufory magazynu mogą być przydzielane automatycznie przez platformę lub można je przydzielić ręcznie. Określenie CRecordset::userAllocMultiRowBuffers opcji oznacza, że wykonasz alokację.

W poniższej tabeli wymieniono funkcje składowe udostępniane przez CRecordset program w celu obsługi pobierania wierszy zbiorczych.

Funkcja składowa opis
CheckRowsetError Funkcja wirtualna, która obsługuje wszelkie błędy występujące podczas pobierania.
Dobulkfieldexchange Implementuje wymianę pól rekordów zbiorczych. Wywoływana automatycznie w celu przeniesienia wielu wierszy danych ze źródła danych do obiektu zestawu rekordów.
GetRowsetSize Pobiera bieżące ustawienie dla rozmiaru zestawu wierszy.
GetRowsFetched Informuje, ile wierszy zostało faktycznie pobranych po danym pobraniu. W większości przypadków jest to rozmiar zestawu wierszy, chyba że pobrano niekompletny zestaw wierszy.
GetRowStatus Zwraca stan pobierania dla określonego wiersza w zestawie wierszy.
RefreshRowset Odświeża dane i stan określonego wiersza w zestawie wierszy.
SetRowsetCursorPosition Przenosi kursor do określonego wiersza w zestawie wierszy.
SetRowsetSize Funkcja wirtualna, która zmienia ustawienie rozmiaru zestawu wierszy na określoną wartość.

Kwestie szczególne

Chociaż pobieranie wierszy zbiorczych jest wzrostem wydajności, niektóre funkcje działają inaczej. Przed podjęciem decyzji o zaimplementowaniu pobierania wierszy zbiorczych należy wziąć pod uwagę następujące kwestie:

  • Platforma automatycznie wywołuje funkcję składową DoBulkFieldExchange w celu transferu danych ze źródła danych do obiektu zestawu rekordów. Jednak dane nie są przesyłane z zestawu rekordów z powrotem do źródła danych. AddNewWywołanie funkcji , Edit, Deletelub Update elementu członkowskiego powoduje niepowodzenie asercji. Chociaż CRecordset obecnie nie zapewnia mechanizmu aktualizowania zbiorczych wierszy danych, można napisać własne funkcje przy użyciu funkcji SQLSetPosinterfejsu API ODBC . Aby uzyskać więcej informacji na temat SQLSetPosprogramu , zobacz dokumentację programisty ODBC.

  • Funkcje IsDeletedskładowe , , IsFieldNullIsFieldDirty, IsFieldNullableSetFieldDirty, i SetFieldNull nie mogą być używane w zestawach rekordów, które implementują pobieranie wierszy zbiorczych. Można jednak wywołać GetRowStatus metodę IsDeletedzamiast , a GetODBCFieldInfo zamiast IsFieldNullable.

  • Operacje Move zmieniają położenie zestawu rekordów według zestawu wierszy. Załóżmy na przykład, że otworzysz zestaw rekordów zawierający 100 rekordów o początkowym rozmiarze zestawu wierszy 10. Open pobiera wiersze od 1 do 10, z bieżącym rekordem umieszczonym w wierszu 1. Wywołanie pobierania MoveNext następnego zestawu wierszy, a nie następnego wiersza. Ten zestaw wierszy składa się z wierszy od 11 do 20 z bieżącym rekordem umieszczonym w wierszu 11. Należy pamiętać, że MoveNext pobieranie wierszy zbiorczych i Move( 1 ) nie jest równoważne. Move( 1 ) Pobiera zestaw wierszy rozpoczynający się od 1 wiersza z bieżącego rekordu. W tym przykładzie wywołanie wywołania po wywołaniu Move( 1 )Open pobiera zestaw wierszy składający się z wierszy od 2 do 11, przy użyciu bieżącego rekordu umieszczonego w wierszu 2. Aby uzyskać więcej informacji, zobacz funkcję elementu członkowskiego Move .

  • W przeciwieństwie do wymiany pól rekordów kreatorzy nie obsługują wymiany pól rekordów zbiorczych. Oznacza to, że należy ręcznie zadeklarować elementy członkowskie danych pól i ręcznie przesłonić DoBulkFieldExchange , zapisując wywołania funkcji Bulk RFX. Aby uzyskać więcej informacji, zobacz Funkcje wymiany pól rekordów w dokumentacji biblioteki klas.

Jak zaimplementować wymianę pól rekordów zbiorczych

Wymiana pól rekordów zbiorczych przesyła zestaw wierszy danych ze źródła danych do obiektu zestawu rekordów. Funkcje bulk RFX używają tablic do przechowywania tych danych, a także tablic do przechowywania długości każdego elementu danych w zestawie wierszy. W definicji klasy należy zdefiniować elementy członkowskie danych pól jako wskaźniki, aby uzyskać dostęp do tablic danych. Ponadto należy zdefiniować zestaw wskaźników, aby uzyskać dostęp do tablic długości. Żadne składowe danych parametrów nie powinny być deklarowane jako wskaźniki; deklarowanie składowych danych parametrów podczas korzystania z wymiany pól rekordów zbiorczych jest takie samo jak deklarowanie ich podczas korzystania z wymiany pól rekordów. Poniższy kod przedstawia prosty przykład:

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;

   .
   .
   .
}

Te bufory magazynu można przydzielić ręcznie lub mieć strukturę do alokacji. Aby samodzielnie przydzielić bufory, należy określić CRecordset::userAllocMultiRowBuffers opcję parametru dwOptions w funkcji składowej Open . Pamiętaj, aby ustawić rozmiary tablic co najmniej równe rozmiarowi zestawu wierszy. Jeśli chcesz, aby struktura mogła wykonać alokację, należy zainicjować wskaźniki na wartość NULL. Zazwyczaj odbywa się to w konstruktorze obiektu zestawu rekordów:

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;

   .
   .
   .
}

Na koniec należy zastąpić funkcję składową DoBulkFieldExchange . W przypadku składowych danych pól wywołaj funkcje Bulk RFX; dla wszystkich składowych danych parametrów wywołaj funkcje RFX. Jeśli zestaw rekordów został otwarty przez przekazanie instrukcji SQL lub procedury składowanej do Openmetody , kolejność, w której wywołania zbiorcze RFX muszą odpowiadać kolejności kolumn w zestawie rekordów. Podobnie kolejność wywołań RFX dla parametrów musi odpowiadać kolejności parametrów w instrukcji SQL lub procedurze składowanej.

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 );
}

Uwaga

Aby klasa pochodna CloseCRecordset wyszła poza zakres, należy wywołać funkcję składową. Gwarantuje to, że każda pamięć przydzielona przez platformę zostanie zwolniona. Dobrym rozwiązaniem programistycznym jest zawsze jawne wywołanie Closemetody , niezależnie od tego, czy zaimplementowano pobieranie wierszy zbiorczych.

Aby uzyskać więcej informacji na temat wymiany pól rekordów (RFX), zobacz Wymiana pól rekordów: Jak działa RFX. Aby uzyskać więcej informacji na temat używania parametrów, zobacz CFieldExchange::SetFieldType i Zestaw rekordów: Parametryzacja zestawu rekordów (ODBC).

Zobacz też

Zestaw rekordów (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams