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 CRecordset
abgeleiteten Klasse verwenden. Weitere Informationen finden Sie unter Record Field Exchange (RFX).
In diesem Thema wird Folgendes erläutert:
Wie CRecordset Massenzeilenabrufe unterstützt.
Einige besondere Überlegungen bei der Verwendung von Massenzeilenabrufen.
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 derAddNew
Funktionen ,Edit
, oderDelete
Update
Memberfunktionen führt zu einer fehlgeschlagenen Assertion. ObwohlCRecordset
derzeit kein Mechanismus zum Aktualisieren von Massenzeilen von Daten bereitgestellt wird, können Sie ihre eigenen Funktionen mithilfe der ODBC-API-FunktionSQLSetPos
schreiben. Weitere InformationenSQLSetPos
finden Sie in der ODBC-Programmierreferenz.Die Memberfunktionen
IsDeleted
, ,IsFieldDirty
,IsFieldNull
,SetFieldDirty
IsFieldNullable
undSetFieldNull
können nicht für Recordsets verwendet werden, die massenweise Zeilenabrufe implementieren. Sie könnenGetRowStatus
jedoch anstelle vonIsDeleted
, undGetODBCFieldInfo
anstelle vonIsFieldNullable
.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 zumMoveNext
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, dassMoveNext
undMove( 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 AufrufMove( 1 )
nach dem AufrufenOpen
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 Open
an 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