Udostępnij za pośrednictwem


Zestaw rekordów: Pobieranie rekordów luzem (ODBC)

Ten temat dotyczy klas MFC ODBC.

Klasa CRecordset zapewnia obsługę dla pobierania wierszy luzem, co oznacza, że wielu rekordów można pobrać na raz podczas pojedynczego pobrania zamiast pobierania jeden rekord w czasie ze źródła danych.Można zaimplementować luzem wiersz pobieranie tylko w pochodnych CRecordset klasy.Proces przesyłania danych ze źródła danych do obiektu recordset nazywa się wymiany pola rekordu luzem (luzem RFX).Należy zauważyć, że jeśli nie używasz luzem wiersz pobieranie w CRecordset-klasie pochodnej danych jest przenoszona za pomocą pola rekordu wymiany (RFX).Aby uzyskać więcej informacji, zobacz Exchange pole rekordu (RFX).

W tym temacie wyjaśniono:

  • Jak CRecordset obsługuje pobieranie wiersza luzem.

  • Niektóre zagadnienia specjalne za pomocą luzem, pobieranie wiersza.

  • Jak zaimplementować luzem pola rekordu wymiany.

Jak CRecordset obsługuje zbiorowe, pobieranie wiersza

Przed otwarciem obiektu recordset, można zdefiniować rozmiar zestawu wierszy z SetRowsetSize funkcji składowej.Określa rozmiar zestawu wierszy, ile rekordów ma być pobrana podczas pojedynczego pobrania.Po zaimplementowaniu pobieranie wiersza luzem domyślny rozmiar zestawu wierszy jest 25.Jeśli pobieranie wiersza luzem nie jest zaimplementowana, 1 pozostaje stały rozmiar zestawu wierszy.

Po zostały zainicjowane rozmiar zestawu wierszy, call Otwórz funkcji składowej.W tym miejscu należy określić CRecordset::useMultiRowFetch opcji dwOptions parametru do realizacji, pobieranie wiersza luzem.Ponadto można ustawić CRecordset::userAllocMultiRowBuffers opcji.Mechanizm wymiany pola rekordu luzem używa tablic do przechowywania wielu wierszy danych pobranych podczas pobierania.Bufory magazynu można automatycznie przydzielane w ramach lub je ręcznie przydzielić.Określanie CRecordset::userAllocMultiRowBuffers opcji oznacza wykona alokacji.

W poniższej tabeli przedstawiono funkcje składowe dostarczonych przez CRecordset do obsługi pobieranie wiersza luzem.

Funkcja Członkowskie

Opis

CheckRowsetError

Wirtualny funkcja obsługi błędów, które wystąpiły podczas pobierania.

DoBulkFieldExchange

Implementuje luzem wymiany pola rekordu.Wywoływana automatycznie do przeniesienia wielu wierszy danych ze źródła danych do obiektu recordset.

GetRowsetSize

Pobiera bieżący ustawienie rozmiaru zestawu wierszy.

GetRowsFetched

Informuje o liczbę wierszy były faktycznie pobrane po danym pobrania.W większości przypadków jest rozmiar zestawu wierszy, chyba że została pobrana niekompletne wierszy.

GetRowStatus

Zwraca stan pobrania dla konkretnego wiersza w obrębie zestawu wierszy.

RefreshRowset

Odświeża dane i stanu określonego wiersza w obrębie zestawu wierszy.

SetRowsetCursorPosition

Przenosi kursor do określonego wiersza w obrębie zestawu wierszy.

SetRowsetSize

Funkcję wirtualną zmienia ustawienie rozmiaru wierszy określona wartość.

Uwagi specjalne

Mimo że pobieranie wiersza zbiorczego jest zysk wydajności, niektóre funkcje działają inaczej.Przed podjęciem decyzji o realizacji, pobieranie wiersza luzem, należy rozważyć następujące kwestie:

  • Ramy automatycznie wywołuje DoBulkFieldExchange Członkowskich funkcji do transferu danych ze źródła danych do obiektu recordset.Jednakże dane nie są przesyłane z zestawu rekordów do źródła danych.Wywołanie AddNew, Edytuj, 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óry implementuje pobieranie wiersza luzem.Jednakże można wywołać GetRowStatus zamiast IsDeleted, i GetODBCFieldInfo zamiast IsFieldNullable.

  • Przenieść operacji zmiana swój zestaw rekordów według wierszy.Załóżmy na przykład, Otwórz zestaw rekordów, który ma 100 rekordów o wielkości 10 początkowego zestawu wierszy.Otwórz pobiera wiersze od 1 do 10, z bieżącego rekordu, umieszczone w wierszu 1.Wywołanie MoveNext pobiera następny zestaw wierszy nie następny wiersz.Ten zestaw wierszy składa się z wierszy 11 do 20 z bieżącego rekordu, umieszczone w wierszu 11.Należy zauważyć, że MoveNext i (1) przenieść nie są równoważne, podczas pobierania wierszy zbiorczej jest zaimplementowana.Przenieś (1) pobiera zestawu wierszy, która rozpoczyna się 1 wiersz z bieżącego rekordu.W tym przykładzie wywołanie Przenieś (1) po wywołaniu Otwórz pobiera zestawu wierszy, składająca się z wierszy od 2 do 11, z bieżącego rekordu, umieszczone w wierszu 2.Aby uzyskać więcej informacji, zobacz przenieść funkcji składowej.

  • W przeciwieństwie do wymiany pola rekordu kreatorzy nie obsługują wymianę pól rekordu luzem.Oznacza to, że musi ręcznie zadeklarować członkom pola danych i ręcznie zastąpić DoBulkFieldExchange pisząc wywołania funkcji RFX luzem.Aby uzyskać więcej informacji, zobacz Funkcje wymiany pola rekordu w Odwołanie do biblioteki klas.

Sposób wymiany pola rekordu luzem wdrożenie

Luzem w polu rekordu wymiany przenosi wierszy danych ze źródła danych do obiektu recordset.Funkcje RFX luzem używać tablic do przechowywania danych, jak również tablic do przechowywania długości każdego elementu danych w zestawie wierszy.W Państwa definicji klasy należy zdefiniować członkom dane pole jako wskaźniki do dostępu tablicami danych.Ponadto należy zdefiniować zestaw wskaźników do dostępu tablice długości.Parametr danych członków nie powinien być zadeklarowany jako wskaźniki; Deklarowanie parametrów danych członków podczas korzystania z wymiany pola rekordu luzem jest taki sam, jak ich zgłaszania podczas korzystania z programu exchange w polu rekordu.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;

   .
   .
   .
}

Można ręcznie przydzielić bufory składowania lub RAM, czy przydział.Aby przydzielić bufory samodzielnie, należy określić CRecordset::userAllocMultiRowBuffers opcji dwOptions parametr w Otwórz funkcji składowej.Należy ustawić rozmiary tablic co najmniej równa rozmiar zestawu wierszy.Jeśli chcesz RAM, czy przydział, należy zainicjować wskaźniki do NULL. Zazwyczaj jest to wykonywane w konstruktora obiektu recordset:

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łanie funkcji RFX luzem; dla dowolnych członków danych parametru wywołania funkcji RFX.Jeśli zestaw rekordów jest otwarty przez przekazanie instrukcji SQL lub procedurę przechowywaną, aby Otwórz, kolejność, w której są wykonywanie wywołań RFX luzem musi odpowiadać do celu kolumn w zestawie rekordów; Podobnie kolejność parametrów wywołania RFX musi odpowiadać do celu 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 Twoje pochodne CRecordset klasy wykracza poza zakres.Gwarantuje to, że wszelkie pamięć przydzielona w ramach są zwalniane.Dobrą praktyką jest zawsze jawnie wywołać programowania jest Zamknij, niezależnie od tego, czy został zaimplementowany pobieranie wiersza luzem.

Aby uzyskać więcej informacji dotyczących wymiany pól rekordu (RFX), zobacz wymiany pola rekordu: jak działa RFX.Aby uzyskać więcej informacji na temat parametrów, zobacz CFieldExchange::SetFieldType i zestaw rekordów: parametryzacja zestaw rekordów (ODBC).

Zobacz też

Informacje

CRecordset::m_nFields

CRecordset::m_nParams

Koncepcje

Zestaw rekordów (ODBC)