Recordset: Abrufen von Datensätzen in einer Sammeloperation (ODBC)

Dieses Thema bezieht sich auf die MFC-ODBC-Klassen.

Klasse CRecordset bietet Unterstützung für massenweises Abrufen von Zeilen. Dies bedeutet, dass mehrere Datensätze während eines einzelnen Abrufs gleichzeitig abgerufen werden können, anstatt jeweils einen Datensatz aus der Datenquelle abzurufen. Sie können massenweise Zeilenabrufe nur in einer abgeleiteten CRecordset Klasse implementieren. Der Vorgang zum Übertragen von Daten aus der Datenquelle in das Recordset-Objekt wird als Massendatensatzfeldaustausch (Bulk RFX) bezeichnet. Beachten Sie, dass Daten über Datensatzfeldaustausch (RFX) übertragen werden, wenn Sie keine Massenzeilenabrufe in einer CRecordsetabgeleiteten Klasse verwenden. Weitere Informationen finden Sie unter Record Field Exchange (RFX).

In diesem Thema wird Folgendes erläutert:

Wie CRecordset Das Abrufen von Massenzeilen unterstützt

Vor dem Öffnen des Recordset-Objekts können Sie eine Rowsetgröße mit der SetRowsetSize Memberfunktion definieren. Die Rowsetgröße gibt an, wie viele Datensätze während eines einzelnen Abrufs abgerufen werden sollen. Wenn massenweise Zeilenabrufe implementiert werden, beträgt die Standardzeilengröße 25. Wenn das Abrufen von Massenzeilen nicht implementiert ist, werden die Zeilensatzgröße erneut auf 1 festgelegt Standard.

Nachdem Sie die Rowsetgröße initialisiert haben, rufen Sie die Open-Memberfunktion auf. Hier müssen Sie die CRecordset::useMultiRowFetch Option des dwOptions-Parameters angeben, um massenweises Abrufen von Zeilen zu implementieren. Sie können die CRecordset::userAllocMultiRowBuffers Option zusätzlich festlegen. Der Massendatensatzfeldaustauschmechanismus verwendet Arrays, um die mehrere Datenzeilen zu speichern, die während eines Abrufs abgerufen wurden. Diese Speicherpuffer können automatisch vom Framework zugewiesen werden, oder Sie können sie manuell zuordnen. Wenn Sie die CRecordset::userAllocMultiRowBuffers Option angeben, bedeutet dies, dass Sie die Zuordnung ausführen.

In der folgenden Tabelle sind die Memberfunktionen aufgeführt, die bereitgestellt werden CRecordset , um das Abrufen von Massenzeilen zu unterstützen.

Memberfunktion Beschreibung
CheckRowsetError Virtuelle Funktion, die alle Fehler behandelt, die beim Abrufen auftreten.
DoBulkFieldExchange Implementiert massenweise Datensatzfeldaustausch. Wird automatisch aufgerufen, um mehrere Datenzeilen aus der Datenquelle an das Recordset-Objekt zu übertragen.
GetRowsetSize Ruft die aktuelle Einstellung für die Rowsetgröße ab.
GetRowsFetched Gibt an, wie viele Zeilen nach einem bestimmten Abruf tatsächlich abgerufen wurden. In den meisten Fällen ist dies die Rowsetgröße, es sei denn, ein unvollständiges Rowset wurde abgerufen.
GetRowStatus Gibt einen Abrufstatus für eine bestimmte Zeile innerhalb eines Rowsets zurück.
RefreshRowset Aktualisiert die Daten und den Status einer bestimmten Zeile innerhalb eines Rowsets.
SetRowsetCursorPosition Verschiebt den Cursor zu einer bestimmten Zeile innerhalb eines Rowsets.
SetRowsetSize Virtuelle Funktion, die die Einstellung für die Rowsetgröße in den angegebenen Wert ändert.

Besondere Überlegungen

Obwohl das Abrufen von Massenzeilen ein Leistungsgewinn ist, funktionieren bestimmte Features unterschiedlich. Bevor Sie sich für die Implementierung von Massenzeilenabrufen entscheiden, sollten Sie Folgendes berücksichtigen:

  • Das Framework ruft die DoBulkFieldExchange Memberfunktion automatisch auf, um Daten aus der Datenquelle an das Recordset-Objekt zu übertragen. Daten werden jedoch nicht vom Recordset zurück an die Datenquelle übertragen. Das Aufrufen der AddNewFunktionen , Edit, oder DeleteUpdate Memberfunktionen führt zu einer fehlgeschlagenen Assertion. Obwohl CRecordset derzeit kein Mechanismus zum Aktualisieren von Massenzeilen von Daten bereitgestellt wird, können Sie ihre eigenen Funktionen mithilfe der ODBC-API-Funktion SQLSetPosschreiben. Weitere Informationen SQLSetPosfinden Sie in der ODBC-Programmierreferenz.

  • Die Memberfunktionen IsDeleted, , IsFieldDirty, IsFieldNull, SetFieldDirtyIsFieldNullableund SetFieldNull können nicht für Recordsets verwendet werden, die massenweise Zeilenabrufe implementieren. Sie können GetRowStatus jedoch anstelle von IsDeleted, und GetODBCFieldInfo anstelle von IsFieldNullable.

  • Die Move Vorgänge positionieren Das Recordset-Objekt nach Rowset. Angenommen, Sie öffnen ein Recordset mit 100 Datensätzen mit einer anfänglichen Rowsetgröße von 10. Open Ruft Die Zeilen 1 bis 10 ab, wobei der aktuelle Datensatz in Zeile 1 positioniert ist. Ein Aufruf zum MoveNext Abrufen des nächsten Rowsets und nicht der nächsten Zeile. Dieses Rowset besteht aus den Zeilen 11 bis 20, wobei der aktuelle Datensatz in Zeile 11 positioniert ist. Beachten Sie, dass MoveNext und Move( 1 ) nicht gleichwertig sind, wenn massenweise Zeilenabrufe implementiert werden. Move( 1 ) Ruft das Rowset ab, das 1 Zeile aus dem aktuellen Datensatz beginnt. In diesem Beispiel ruft der Aufruf Move( 1 ) nach dem Aufrufen Open das Rowset ab, das aus Zeilen 2 bis 11 besteht, wobei der aktuelle Datensatz in Zeile 2 positioniert ist. Weitere Informationen finden Sie in der Funktion "Member verschieben ".

  • Im Gegensatz zum Austausch von Datensatzfeldern unterstützen die Assistenten keinen Massendatensatzfeldaustausch. Dies bedeutet, dass Sie Die Felddatenelemente manuell deklarieren und manuell außer Kraft DoBulkFieldExchange setzen müssen, indem Sie Aufrufe an die Massen-RFX-Funktionen schreiben. Weitere Informationen finden Sie unter Record Field Exchange Functions in the Class Library Reference.

Implementieren von Exchange für Massendatensatzfelder

Massendatensatzfeldaustausch überträgt ein Rowset von Daten aus der Datenquelle an das Recordset-Objekt. Die Massen-RFX-Funktionen verwenden Arrays, um diese Daten zu speichern, sowie Arrays, um die Länge der einzelnen Datenelemente im Rowset zu speichern. In Ihrer Klassendefinition müssen Sie die Felddatenmber als Zeiger definieren, um auf die Datenarrays zuzugreifen. Darüber hinaus müssen Sie einen Satz von Zeigern definieren, um auf die Arrays von Längen zuzugreifen. Parameterdatenmmber sollten nicht als Zeiger deklariert werden; Das Deklarieren von Parameterdatenmbern bei Verwendung eines Massendatensatzfeldaustauschs entspricht dem Deklarieren von Parameterdatenelementen bei Verwendung des Datensatzfeldaustauschs. Der folgende Code zeigt ein einfaches Beispiel:

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;

   .
   .
   .
}

Sie können diese Speicherpuffer entweder manuell zuweisen oder über das Framework verfügen, um die Zuordnung zu erledigen. Um die Puffer selbst zuzuweisen, müssen Sie die CRecordset::userAllocMultiRowBuffers Option des dwOptions-Parameters in der Open Memberfunktion angeben. Stellen Sie sicher, dass Sie die Größe der Arrays mindestens gleich der Rowsetgröße festlegen. Wenn Sie das Framework für die Zuordnung verwenden möchten, sollten Sie die Zeiger auf NULL initialisieren. Dies geschieht in der Regel im Konstruktor des Recordsetobjekts:

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;

   .
   .
   .
}

Schließlich müssen Sie die DoBulkFieldExchange Memberfunktion außer Kraft setzen. Rufen Sie für die Felddatenelemente die Massen-RFX-Funktionen auf; rufen Sie für alle Parameterdatenmber die RFX-Funktionen auf. Wenn Sie das Recordset durch Übergeben einer SQL-Anweisung oder gespeicherten Prozedur Openan geöffnet haben, muss die Reihenfolge, in der Sie die Massen-RFX-Aufrufe ausführen, der Reihenfolge der Spalten im Recordset entsprechen. Entsprechend muss die Reihenfolge der RFX-Aufrufe für Parameter der Reihenfolge der Parameter in der SQL-Anweisung oder gespeicherten Prozedur entsprechen.

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

Hinweis

Sie müssen die Close Memberfunktion aufrufen, bevor die abgeleitete CRecordset Klasse den Gültigkeitsbereich überschreitet. Dadurch wird sichergestellt, dass alle vom Framework zugewiesenen Arbeitsspeicher freigegeben werden. Es empfiehlt sich, immer explizit aufzurufen Close, unabhängig davon, ob Sie massenweise Zeilenabrufe implementiert haben.

Weitere Informationen zum Datensatzfeldaustausch (Record Field Exchange, RFX) finden Sie unter Record Field Exchange: How RFX Works. Weitere Informationen zur Verwendung von Parametern finden Sie unter "CFieldExchange::SetFieldType" und "Recordset: Parametrisieren eines Recordset (ODBC)".For more information about using parameters, see CFieldExchange::SetFieldType and Recordset: Parameterizing a Recordset (ODBC).

Siehe auch

Recordset (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams