Zestaw rekordów: zbiorcze pobieranie rekordów (ODBC)
Ten temat dotyczy klas MFC ODBC.
Klasa CRecordset zapewnia obsługę luzem pobieranie wiersza, co oznacza, że wielu rekordów mogą być pobierane jednocześnie podczas pojedynczego pobierania, zamiast pobierania jednego rekordu w danej chwili ze źródła danych.Można zaimplementować luzem wiersza pobierania tylko w pochodnego CRecordset klasy.Proces przesyłania danych ze źródła danych do obiektu recordset jest nazywany wymiany pól rekordu luzem (RFX luzem).Należy zauważyć, że jeśli nie używasz luzem pobieranie wiersza w CRecordset-klasie pochodnej, dane są przesyłane poprzez wymianę pole rekordu (RFX).Aby uzyskać więcej informacji, zobacz Rekord pola programu Exchange (RFX).
Ten temat tłumaczy:
Jak CRecordset obsługuje pobieranie wiersza zbiorczego.
Niektóre szczególne zagadnienia podczas korzystania z luzem, pobieranie wiersza.
Jak wdrożyć luzem pole rekordu wymiany.
Jak CRecordset obsługuje pobieranie wiersza zbiorczego
Przed otwarciem obiektu recordset, można zdefiniować rozmiar zestawu wierszy z SetRowsetSize funkcji składowej.Rozmiar zestawu wierszy określa liczbę rekordów, jaka ma być pobrana podczas pojedynczego pobierania.Po zaimplementowaniu funkcji pobierania wierszy bulk, domyślny rozmiar zestawu wierszy wynosi 25.Jeśli pobieranie wiersza zbiorczego nie zostanie zaimplementowana, rozmiar zestawu wierszy nie zmienia się na 1.
Po zostały zainicjowane rozmiar zestawu wierszy, call Otwórz funkcji składowej.W tym miejscu należy określić CRecordset::useMultiRowFetch możliwość dwOptions parametru do wdrożenia pobieranie wiersza zbiorczego.Ponadto można ustawić CRecordset::userAllocMultiRowBuffers opcji.Mechanizm wymiany pole rekordu luzem używa tablic do przechowywania wielu wierszy danych pobieranych podczas pobierania.Bufory pamięci masowej można nadawany przez architekturę lub można je przydzielić ręcznie.Określanie CRecordset::userAllocMultiRowBuffers opcji oznacza, że zrobi alokacji.
W poniższej tabeli przedstawiono funkcje składowe dostarczonych przez CRecordset do obsługi pobierania wierszy zbiorczej.
Funkcji członka |
Opis |
---|---|
Funkcji wirtualnych, który obsługuje wszystkie błędy, które występują podczas pobierania. |
|
Implementuje zbiorczej wymiany pól rekordu.Wywoływana automatycznie do przeniesienia wielu wierszy danych ze źródła danych do obiektu recordset. |
|
Pobiera bieżące ustawienie rozmiaru wierszy. |
|
Informuje o tym, ile wierszy były faktycznie pobrane po danym fetch.W większości przypadków jest to rozmiar zestawu wierszy, chyba że niekompletne zestaw wierszy została pobrana. |
|
Zwraca stan pobierania dla konkretnego wiersza w obrębie zestawu wierszy. |
|
Odświeża dane i stan określonego wiersza w obrębie zestawu wierszy. |
|
Przenosi kursor do określonego wiersza w obrębie zestawu wierszy. |
|
Funkcji wirtualnych zmienia ustawienie rozmiaru wierszy na określoną wartość. |
Uwagi specjalne
Mimo że pobieranie wiersza zbiorczego jest wzrost wydajności, niektóre funkcje działają inaczej.Przed podjęciem decyzji o realizacji, pobieranie wiersza zbiorczego, należy rozważyć następujące kwestie:
Wywołuje automatycznie ramach DoBulkFieldExchange funkcji składowej do przenoszenia danych ze źródła danych do obiektu recordset.Jednak dane nie są przesyłane z zestawu rekordów do źródła danych.Wywołanie AddNew, edytować, usunąć, lub Aktualizacja Członkowskich funkcje skutkuje potwierdzenia nie powiodło się.Chociaż CRecordset aktualnie nie zapewnia mechanizm aktualizacji zbiorczej wierszy danych, można napisać własne funkcje za pomocą funkcji interfejsu API ODBC SQLSetPos.Aby uzyskać więcej informacji o SQLSetPos, zobacz SDK Podręcznik programisty ODBC w dokumentacji MSDN.
Funkcje składowe IsDeleted, IsFieldDirty, IsFieldNull, IsFieldNullable, SetFieldDirty, i SetFieldNull nie można używać na zestawy rekordów, które implementuje pobieranie wiersza zbiorczego.Jednak mogą wywoływać GetRowStatus zamiast IsDeleted, i GetODBCFieldInfo zamiast IsFieldNullable.
Przenieść operacji powoduje przeniesienie swój zestaw rekordów przez zestaw wierszy.Na przykład załóżmy, że Otwórz zestaw rekordów, który ma 100 rekordów z 10 rozmiar początkowy zestaw wierszy.Otwórz pobiera wiersze od 1 do 10, z bieżącym rekordem umieszczone w pierwszym wierszu.Wywołanie MoveNext pobiera następny zestaw wierszy nie następnego wiersza.Ten zestaw wierszy składa się z wierszach od 11 do 20 z bieżącym rekordem umieszczone na wiersz 11.Należy zauważyć, że MoveNext i (1) przenieść nie są równoważne, po zaimplementowaniu funkcji pobierania wierszy zbiorczej.Przenieść (1) pobiera zestaw wierszy, który rozpoczyna się 1 wiersz z bieżącego rekordu.W tym przykładzie wywołanie przenieść (1) po wywołaniu Otwórz pobiera zestaw wierszy, składająca się z wierszy od 2 do 11, z bieżącego rekordu, umieszczony w wierszu 2.Aby uzyskać więcej informacji, zobacz przenieść funkcji składowej.
W przeciwieństwie do wymiany pola rekordu kreatorów nie obsługują wymianę pól rekordu luzem.Oznacza to, że należy ręcznie zadeklarować członków swojego pola danych i ręcznie zastąpić DoBulkFieldExchange przez napisanie wywołania funkcji RFX luzem.Aby uzyskać więcej informacji, zobacz Funkcje wymiany pola rekordu w Informacje dotyczące biblioteki klas.
Jak wdrożyć wymiany pól rekordu luzem
Wymiany pól rekordu luzem przeniesie zestaw wierszy danych ze źródła danych do obiektu recordset.Funkcje RFX luzem używać tablic do przechowywania tych danych, jak również tablic do przechowywania długości każdego elementu danych w zestawie wierszy.W definicji klasy należy zdefiniować członków swojego pola danych jako wskaźniki do dostępu tablicami danych.Ponadto należy zdefiniować zestaw wskaźników do dostępu do tablic o długości.Każdy parametr danych członków nie powinien być zadeklarowany jako wskaźniki; deklarowanie elementów członkowskich danych parametru podczas korzystania z wymiany pól rekordu luzem jest taki sam, jak deklarująca je podczas korzystania z programu exchange pole rekordu.Następujący kod prezentuje 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;
.
.
.
}
Można ręcznie przydzielić bufory pamięci masowej lub RAM czy alokacja.Aby przydzielić bufory samodzielnie, należy określić CRecordset::userAllocMultiRowBuffers możliwość dwOptions parametr w Otwórz funkcji członka.Należy ustawić rozmiary tablic co najmniej równa rozmiar zestawu wierszy.Jeśli chcesz mieć framework czy przydział, należy zainicjować wskaźniki do NULL. Jest to zwykle robione konstruktora obiektu zestaw 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;
.
.
.
}
Wreszcie, należy zastąpić DoBulkFieldExchange funkcji składowej.Dla pola danych członków wywołania funkcji RFX luzem; dla dowolnych członków danych parametru wywołanie funkcji RFX.Jeśli zestaw rekordów jest otwarty przez przekazanie instrukcję SQL lub procedurę przechowywaną, aby Otwórz, kolejność wprowadzania wywołania RFX luzem musi odpowiadać kolejności kolumn w zestawie rekordów; Podobnie kolejność połączeń RFX dla parametrów musi odpowiadać kolejności parametrów w instrukcji SQL lub procedura przechowywana.
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]
Musisz wywołać Zamknij funkcji składowej przed swoimi pochodne CRecordset klasy wykracza poza zakres.Gwarantuje to, że wszystkie przydzielone przez architekturę pamięci są zwalniane.Dobrą praktyką jest zawsze jawnie wywołać programowania jest Zamknij, niezależnie od tego, czy zostało zaimplementowane, pobieranie wiersza zbiorczego.
Aby uzyskać więcej informacji dotyczących wymiany pól rekordu (RFX), zobacz wymiany pól rekordu: jak działa RFX.Aby uzyskać więcej informacji o używaniu parametrów, zobacz CFieldExchange::SetFieldType i zestaw rekordów: parametryzacja zestaw rekordów (ODBC).