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.
Niektóre specjalne zagadnienia dotyczące pobierania wierszy zbiorczych.
Jak zaimplementować wymianę pól rekordów zbiorczych.
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 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.AddNew
Wywołanie funkcji ,Edit
,Delete
lubUpdate
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 funkcjiSQLSetPos
interfejsu API ODBC . Aby uzyskać więcej informacji na tematSQLSetPos
programu , zobacz dokumentację programisty ODBC.Funkcje
IsDeleted
składowe , ,IsFieldNull
IsFieldDirty
,IsFieldNullable
SetFieldDirty
, iSetFieldNull
nie mogą być używane w zestawach rekordów, które implementują pobieranie wierszy zbiorczych. Można jednak wywołaćGetRowStatus
metodęIsDeleted
zamiast , aGetODBCFieldInfo
zamiastIsFieldNullable
.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 pobieraniaMoveNext
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ć, żeMoveNext
pobieranie wierszy zbiorczych iMove( 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łaniuMove( 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 magazynu można przydzielić ręcznie lub mieć strukturę do alokacji. Aby samodzielnie przydzielić, 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 Open
metody , 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 Close
CRecordset
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 Close
metody , 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