CRecordset-Klasse

Stellt eine Gruppe von Datensätzen dar, die aus einer Datenquelle ausgewählt wurden.

Syntax

class CRecordset : public CObject

Member

Öffentliche Konstruktoren

Name Beschreibung
CRecordset::CRecordset Erstellt ein CRecordset-Objekt. Die abgeleitete Klasse muss einen Konstruktor bereitstellen, der diese Klasse aufruft.

Öffentliche Methoden

Name Beschreibung
CRecordset::AddNew Bereitet sich auf das Hinzufügen eines neuen Datensatzes vor. Rufen Sie Update auf, um die Ergänzung abzuschließen.
CRecordset::CanAppend Gibt "nonzero" zurück, wenn dem Recordset neue Datensätze über die AddNew Memberfunktion hinzugefügt werden können.
CRecordset::CanBookmark Gibt "nonzero" zurück, wenn das Recordset Lesezeichen unterstützt.
CRecordset::Cancel Bricht einen asynchronen Vorgang oder einen Prozess aus einem zweiten Thread ab.
CRecordset::CancelUpdate Bricht alle ausstehenden Updates aufgrund eines Vorgangs oder Edit Vorgangs AddNew ab.
CRecordset::CanRestart Gibt "nonzero" zurück, wenn Requery die Abfrage des Recordsets erneut ausgeführt werden kann.
CRecordset::CanScroll Gibt nonzero zurück, wenn Sie durch die Datensätze scrollen können.
CRecordset::CanTransact Gibt "nonzero" zurück, wenn die Datenquelle Transaktionen unterstützt.
CRecordset::CanUpdate Gibt "nonzero" zurück, wenn das Recordset aktualisiert werden kann (Sie können Datensätze hinzufügen, aktualisieren oder löschen).
CRecordset::CheckRowsetError Wird aufgerufen, um Fehler zu behandeln, die beim Abrufen von Datensätzen generiert wurden.
CRecordset::Close Schließt das Recordset und dessen ODBC HSTMT .
CRecordset::Delete Löscht den aktuellen Datensatz aus dem Recordset. Sie müssen nach dem Löschen explizit zu einem anderen Datensatz scrollen.
CRecordset::DoBulkFieldExchange Wird aufgerufen, um Massenzeilen von Daten aus der Datenquelle in das Recordset auszutauschen. Implementiert Massendatensatzfeldaustausch (Bulk RFX).
CRecordset::DoFieldExchange Wird aufgerufen, um Daten (in beide Richtungen) zwischen den Felddatenelementen des Recordsets und dem entsprechenden Datensatz in der Datenquelle auszutauschen. Implementiert Datensatzfeldaustausch (RECORD Field Exchange, RFX).
CRecordset::Edit Bereitet die Änderungen am aktuellen Datensatz vor. Rufen Sie Update auf, um die Bearbeitung abzuschließen.
CRecordset::FlushResultSet Gibt "nonzero" zurück, wenn ein anderes Resultset abgerufen werden soll, wenn eine vordefinierte Abfrage verwendet wird.
CRecordset::GetBookmark Weist dem Parameterobjekt den Textmarkenwert eines Datensatzes zu.
CRecordset::GetDefaultConnect Wird aufgerufen, um die Standard-Verbindungszeichenfolge abzurufen.
CRecordset::GetDefaultSQL Wird aufgerufen, um die sql-Standardzeichenfolge abzurufen, die ausgeführt werden soll.
CRecordset::GetFieldValue Gibt den Wert eines Felds in einem Recordset zurück.
CRecordset::GetODBCFieldCount Gibt die Anzahl der Felder im Recordset zurück.
CRecordset::GetODBCFieldInfo Gibt bestimmte Arten von Informationen zu den Feldern in einem Recordset zurück.
CRecordset::GetRecordCount Gibt die Anzahl der Datensätze im Recordset zurück.
CRecordset::GetRowsetSize Gibt die Anzahl der Datensätze zurück, die Sie während eines einzelnen Abrufs abrufen möchten.
CRecordset::GetRowsFetched Gibt die tatsächliche Anzahl der während eines Abrufs abgerufenen Zeilen zurück.
CRecordset::GetRowStatus Gibt den Status der Zeile nach einem Abruf zurück.
CRecordset::GetSQL Ruft die SQL-Zeichenfolge ab, die zum Auswählen von Datensätzen für das Recordset verwendet wird.
CRecordset::GetStatus Ruft den Status des Recordsets ab: der Index des aktuellen Datensatzes und ob eine endgültige Anzahl der Datensätze abgerufen wurde.
CRecordset::GetTableName Ruft den Namen der Tabelle ab, auf der das Recordset basiert.
CRecordset::IsBOF Gibt "nonzero" zurück, wenn das Recordset vor dem ersten Datensatz positioniert wurde. Es gibt keinen aktuellen Datensatz.
CRecordset::IsDeleted Gibt "nonzero" zurück, wenn das Recordset in einem gelöschten Datensatz positioniert ist.
CRecordset::IsEOF Gibt "nonzero" zurück, wenn das Recordset nach dem letzten Datensatz positioniert wurde. Es gibt keinen aktuellen Datensatz.
CRecordset::IsFieldDirty Gibt "nonzero" zurück, wenn das angegebene Feld im aktuellen Datensatz geändert wurde.
CRecordset::IsFieldNull Gibt "nonzero" zurück, wenn das angegebene Feld im aktuellen Datensatz null ist (hat keinen Wert).
CRecordset::IsFieldNullable Gibt "nonzero" zurück, wenn das angegebene Feld im aktuellen Datensatz auf NULL festgelegt werden kann (ohne Wert).
CRecordset::IsOpen Gibt nonzero zurück, wenn Open zuvor aufgerufen wurde.
CRecordset::Move Positioniert das Recordset in eine angegebene Anzahl von Datensätzen aus dem aktuellen Datensatz in beide Richtungen.
CRecordset::MoveFirst Positioniert den aktuellen Datensatz für den ersten Datensatz im Recordset. Testen Sie IsBOF zuerst.
CRecordset::MoveLast Positioniert den aktuellen Datensatz im letzten Datensatz oder im letzten Rowset. Testen Sie IsEOF zuerst.
CRecordset::MoveNext Positioniert den aktuellen Datensatz im nächsten Datensatz oder im nächsten Rowset. Testen Sie IsEOF zuerst.
CRecordset::MovePrev Positioniert den aktuellen Datensatz im vorherigen Datensatz oder im vorherigen Rowset. Testen Sie IsBOF zuerst.
CRecordset::OnSetOptions Wird aufgerufen, um Optionen (für die Auswahl verwendet) für die angegebene ODBC-Anweisung festzulegen.
CRecordset::OnSetUpdateOptions Wird aufgerufen, um Optionen (bei Aktualisierung verwendet) für die angegebene ODBC-Anweisung festzulegen.
CRecordset::Open Öffnet das Recordset, indem die Tabelle abgerufen oder die vom Recordset darstellte Abfrage durchgeführt wird.
CRecordset::RefreshRowset Aktualisiert die Daten und den Status der angegebenen Zeilen.
CRecordset::Requery Führt die Abfrage des Recordsets erneut aus, um die ausgewählten Datensätze zu aktualisieren.
CRecordset::SetAbsolutePosition Positioniert das Recordset auf dem Datensatz, der der angegebenen Datensatznummer entspricht.
CRecordset::SetBookmark Positioniert das Recordset auf dem durch die Textmarke angegebenen Datensatz.
CRecordset::SetFieldDirty Markiert das angegebene Feld im aktuellen Datensatz als geändert.
CRecordset::SetFieldNull Legt den Wert des angegebenen Felds im aktuellen Datensatz auf NULL fest (ohne Wert).
CRecordset::SetLockingMode Legt den Sperrmodus auf "optimistische" Sperre (Standardeinstellung) oder "pessimistische" Sperrung fest. Bestimmt, wie Datensätze für Updates gesperrt werden.
CRecordset::SetParamNull Legt den angegebenen Parameter auf NULL fest (ohne Wert).
CRecordset::SetRowsetCursorPosition Positioniert den Cursor an der angegebenen Zeile innerhalb des Rowsets.
CRecordset::SetRowsetSize Gibt die Anzahl der Datensätze an, die Sie während eines Abrufs abrufen möchten.
CRecordset::Update Schließt einen AddNew Vorgang Edit ab, indem die neuen oder bearbeiteten Daten in der Datenquelle gespeichert werden.

Öffentliche Datenmmber

Name Beschreibung
CRecordset::m_hstmt Enthält das ODBC-Anweisungshandle für das Recordset. Geben Sie HSTMTein.
CRecordset::m_nFields Enthält die Anzahl der Felddatenmber im Recordset. Geben Sie UINTein.
CRecordset::m_nParams Enthält die Anzahl der Parameterdatenmmber im Recordset. Geben Sie UINTein.
CRecordset::m_pDatabase Enthält einen Zeiger auf das CDatabase Objekt, über das das Recordset mit einer Datenquelle verbunden ist.
CRecordset::m_strFilter Enthält eine CString , die eine strukturierte Abfragesprache (SQL)WHERE-Klausel angibt. Wird als Filter verwendet, um nur die Datensätze auszuwählen, die bestimmte Kriterien erfüllen.
CRecordset::m_strSort Enthält eine CString SQL-Klausel, die eine SQL-Klausel ORDER BY angibt. Wird verwendet, um zu steuern, wie die Datensätze sortiert werden.

Hinweise

Als "Recordsets" CRecordset bezeichnete Objekte werden in der Regel in zwei Formen verwendet: Dynasets und Momentaufnahme s. Ein Dynaset bleibt mit Datenaktualisierungen synchronisiert, die von anderen Benutzern vorgenommen wurden. Ein Momentaufnahme ist eine statische Ansicht der Daten. Jedes Formular stellt eine Gruppe von Datensätzen dar, die zum Zeitpunkt des Öffnens des Recordsets festgelegt wurden. Wenn Sie in einem Dynaset zu einem Datensatz scrollen, werden Änderungen an dem Datensatz entweder von anderen Benutzern oder von anderen Recordsets in Ihrer Anwendung angezeigt.

Hinweis

Wenn Sie mit den DAO-Klassen (Data Access Objects) anstatt mit den ODBC-Klassen (Open Database Verbinden ivity) arbeiten, verwenden Sie stattdessen die KlasseCDaoRecordset. Weitere Informationen finden Sie unter Übersicht: Datenbankprogrammierung.

Um mit beiden Arten von Recordset zu arbeiten, leiten Sie in der Regel eine anwendungsspezifische Recordsetklasse von CRecordset. Recordsets wählen Datensätze aus einer Datenquelle aus, und Sie können dann:

  • Scrollen Sie durch die Datensätze.

  • Aktualisieren Sie die Datensätze, und geben Sie einen Sperrmodus an.

  • Filtern Sie das Recordset, um zu beschränken, welche Datensätze sie aus den Datensätzen einschränken, die in der Datenquelle verfügbar sind.

  • Sortieren Sie das Recordset.

  • Parametrisieren Sie das Recordset, um die Auswahl mit Informationen anzupassen, die erst zur Laufzeit bekannt sind.

Um Ihre Klasse zu verwenden, öffnen Sie eine Datenbank, und erstellen Sie ein Recordset-Objekt, und übergeben Sie den Konstruktor einen Zeiger auf das CDatabase Objekt. Rufen Sie dann die Memberfunktion des Open Recordsets auf, in der Sie angeben können, ob es sich bei dem Objekt um ein Dynaset oder eine Momentaufnahme handelt. Durch Aufrufen Open werden Daten aus der Datenquelle ausgewählt. Nachdem das Recordset-Objekt geöffnet wurde, verwenden Sie die Memberfunktionen und Datenmember, um durch die Datensätze zu scrollen und sie zu bearbeiten. Die verfügbaren Vorgänge hängen davon ab, ob das Objekt ein Dynaset oder eine Momentaufnahme ist, ob es aktualisierbar oder schreibgeschützt ist (dies hängt von der Funktion der Open Database Verbinden ivity (ODBC)-Datenquelle ab), und ob Sie das Massenabrufen von Zeilen implementiert haben. Um Datensätze zu aktualisieren, die seit dem Open Aufruf möglicherweise geändert oder hinzugefügt wurden, rufen Sie die Memberfunktion des Requery Objekts auf. Rufen Sie die Memberfunktion des Close Objekts auf, und zerstören Sie das Objekt, wenn Sie damit fertig sind.

In einer abgeleiteten CRecordset Klasse wird datensatzfeldaustausch (RECORD Field Exchange, RFX) oder Massendatensatzfeldaustausch (Bulk RFX) verwendet, um das Lesen und Aktualisieren von Datensatzfeldern zu unterstützen.

Weitere Informationen zu Recordsets und Datensatzfeldaustausch finden Sie in den Artikeln Overview: Database Programming, Recordset (ODBC), Recordset: Fetching Records in Bulk (ODBC) und Record Field Exchange (RFX). Einen Fokus auf Dynasets und Momentaufnahme s finden Sie in den Artikeln "Dynaset" und "Snapshot".

Vererbungshierarchie

CObject

CRecordset

Anforderungen

Headerafxdb.h:

CRecordset::AddNew

Bereiten Sie sich auf das Hinzufügen eines neuen Datensatzes zur Tabelle vor.

virtual void AddNew();

Hinweise

Sie müssen die Requery Memberfunktion aufrufen, um den neu hinzugefügten Datensatz anzuzeigen. Die Felder des Datensatzes sind anfangs Null. (In der Datenbankterminologie bedeutet Null "keinen Wert" und ist nicht mit NULL in C++ identisch.) Um den Vorgang abzuschließen, müssen Sie die Update Memberfunktion aufrufen. Update speichert Ihre Änderungen an der Datenquelle.

Hinweis

Wenn Sie das Massenabrufen von Zeilen implementiert haben, können Sie nicht anrufen AddNew. Dies führt zu einer fehlgeschlagenen Assertion. Obwohl die Klasse CRecordset keinen Mechanismus zum Aktualisieren von Massenzeilen von Daten bereitstellt, können Sie ihre eigenen Funktionen mithilfe der ODBC-API-Funktion SQLSetPosschreiben. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

AddNew bereitet einen neuen, leeren Datensatz mithilfe der Felddatenmember des Recordsets vor. Legen Sie nach dem Aufrufen AddNewdie gewünschten Werte in den Felddatenelementen des Recordsets fest. (Sie müssen dieBearbeiten Sie die Memberfunktion zu diesem Zweck; verwenden Sie Edit nur für vorhandene Datensätze.) Beim Aufrufen Updatewerden geänderte Werte in den Felddatenelementen in der Datenquelle gespeichert.

Achtung

Wenn Sie vor dem Aufrufen Updatezu einem neuen Datensatz scrollen, geht der neue Datensatz verloren, und es wird keine Warnung angezeigt.

Wenn die Datenquelle Transaktionen unterstützt, können Sie Ihren AddNew Anruf als Teil einer Transaktion tätigen. Weitere Informationen zu Transaktionen finden Sie unter Klasse CDatabase. Rufen Sie CDatabase::BeginTrans vor dem Anruf AddNewan.

Hinweis

Bei Dynasets werden dem Recordset neue Datensätze als letzter Datensatz hinzugefügt. Hinzugefügte Datensätze werden nicht zu Momentaufnahme s hinzugefügt. Sie müssen aufrufenRequery, um das Recordset zu aktualisieren.

Es ist unzulässig, ein Recordset aufzurufen AddNew , dessen Open Memberfunktion nicht aufgerufen wurde. Ein CDBException Fehler wird ausgelöst, wenn Sie ein Recordset aufrufen AddNew , das nicht angefügt werden kann. Sie können ermitteln, ob das Recordset aktualisierbar ist, indem Sie aufrufen CanAppend.

Weitere Informationen finden Sie in den folgenden Artikeln: Recordset: How Recordsets Update Records (ODBC), Recordset: Adding, Updating, and Deleting Records (ODBC) and Transaction (ODBC).

Beispiel

siehe Transaktion: Durchführen einer Transaktion in einem Recordset (ODBC).

CRecordset::CanAppend

Bestimmt, ob mit dem zuvor geöffneten Recordset neue Datensätze hinzugefügt werden können.

BOOL CanAppend() const;

Rückgabewert

Nonzero, wenn das Recordset das Hinzufügen neuer Datensätze zulässt; andernfalls 0. CanAppend gibt 0 zurück, wenn Sie das Recordset als schreibgeschützt geöffnet haben.

CRecordset::CanBookmark

Bestimmt, ob mit dem Recordset Datensätze mithilfe von Lesezeichen markiert werden können.

BOOL CanBookmark() const;

Rückgabewert

Nonzero, wenn das Recordset Lesezeichen unterstützt; andernfalls 0.

Hinweise

Diese Funktion ist unabhängig von der CRecordset::useBookmarks Option im dwOptions Parameter der Open Memberfunktion. CanBookmark gibt an, ob der angegebene ODBC-Treiber und der Cursor Textmarken unterstützen. CRecordset::useBookmarks gibt an, ob Lesezeichen verfügbar sind, vorausgesetzt, sie werden unterstützt.

Hinweis

Textmarken werden für Vorwärtsrecordsets nicht unterstützt.

Weitere Informationen zur Textmarken- und Recordsetnavigation finden Sie in den Artikeln Recordset: Bookmarks and Absolute Positions (ODBC) und Recordset: Scrolling (ODBC).

CRecordset::Cancel

Fordert an, dass die Datenquelle entweder einen asynchronen Vorgang in Bearbeitung oder einen Prozess aus einem zweiten Thread abbricht.

void Cancel();

Hinweise

Die MFC ODBC-Klassen verwenden keine asynchrone Verarbeitung mehr; um einen asynchronen Vorgang auszuführen, müssen Sie die ODBC-API-Funktion SQLSetConnectOptiondirekt aufrufen. Weitere Informationen finden Sie unter "Asynchrones Ausführen von Funktionen" im ODBC SDK-Programmierhandbuch.

CRecordset::CancelUpdate

Bricht alle ausstehenden Updates ab, die durch einen Edit Vorgang AddNew verursacht werden, bevor Update sie aufgerufen wird.

void CancelUpdate();

Hinweise

Hinweis

Diese Memberfunktion gilt nicht für Recordsets, die massenweises Abrufen von Zeilen verwenden, da solche Recordsets weder aufrufen EditAddNewUpdatenoch aufrufen können. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Wenn die automatische modifiziert Feldüberprüfung aktiviert ist, werden die Membervariablen auf die Werte wiederhergestellt, CancelUpdate die sie zuvor hatten Edit oder AddNew aufgerufen wurden. Andernfalls werden alle Wertänderungen erneut Standard. Standardmäßig ist die automatische Feldüberprüfung aktiviert, wenn das Recordset geöffnet wird. Zum Deaktivieren müssen Sie den CRecordset::noDirtyFieldCheckdwOptions Parameter der Open-Memberfunktion angeben.

Weitere Informationen zum Aktualisieren von Daten finden Sie unter Recordset: Hinzufügen, Aktualisieren und Löschen von Datensätzen (ODBC).

CRecordset::CanRestart

Bestimmt, ob das Recordset das Neustarten der Abfrage (zum Aktualisieren der Datensätze) durch Aufrufen der Requery Memberfunktion zulässt.

BOOL CanRestart() const;

Rückgabewert

Nonzero, wenn requery zulässig ist; andernfalls 0.

CRecordset::CanScroll

Bestimmt, ob das Recordset einen Bildlauf zulässt.

BOOL CanScroll() const;

Rückgabewert

Nonzero, wenn das Recordset Bildlauf zulässt; andernfalls 0.

Hinweise

Weitere Informationen zum Scrollen finden Sie unter Recordset: Scrolling (ODBC).For more information about scrolling, see Recordset: Scrolling (ODBC).

CRecordset::CanTransact

Bestimmt, ob das Recordset Transaktionen zulässt.

BOOL CanTransact() const;

Rückgabewert

Nonzero, wenn das Recordset Transaktionen zulässt; andernfalls 0.

Hinweise

Weitere Informationen finden Sie unter Transaction (ODBC).For more information, see Transaction (ODBC).

CRecordset::CanUpdate

Bestimmt, ob das Recordset aktualisiert werden kann.

BOOL CanUpdate() const;

Rückgabewert

Nonzero, wenn das Recordset aktualisiert werden kann; andernfalls 0.

Hinweise

Ein Recordset kann schreibgeschützt sein, wenn die zugrunde liegende Datenquelle schreibgeschützt ist oder wenn Sie beim dwOptions Öffnen des Recordsets im Parameter angegeben CRecordset::readOnly haben.

CRecordset::CheckRowsetError

Wird aufgerufen, um Fehler zu behandeln, die beim Abrufen von Datensätzen generiert wurden.

virtual void CheckRowsetError(RETCODE nRetCode);

Parameter

nRetCode
Eine ODBC-API-Funktion gibt Code zurück. Einzelheiten finden Sie unter "Hinweise".

Hinweise

Diese virtuelle Memberfunktion behandelt Fehler, die beim Abrufen von Datensätzen auftreten und beim Abrufen von Massenzeilen nützlich sind. Möglicherweise sollten Sie die Außerkraftsetzung CheckRowsetError in Betracht ziehen, um ihre eigene Fehlerbehandlung zu implementieren.

CheckRowsetErrorwird automatisch in einem Cursornavigationsvorgang, zOpenRequery. B. , oder einem beliebigen Move Vorgang, aufgerufen. Es wird der Rückgabewert der ODBC-API-Funktion SQLExtendedFetchübergeben. In der folgenden Tabelle sind die möglichen Werte für den nRetCode Parameter aufgeführt.

nRetCode Beschreibung
SQL_SUCCESS Die Funktion wurde erfolgreich abgeschlossen; es sind keine zusätzlichen Informationen verfügbar.
SQL_SUCCESS_WITH_INFO Die Funktion wurde erfolgreich abgeschlossen, möglicherweise mit einem nichtfatalen Fehler. Zusätzliche Informationen können durch Aufrufen SQLErrorabgerufen werden.
SQL_NO_DATA_FOUND Alle Zeilen aus dem Resultset wurden abgerufen.
SQL_ERROR Fehler bei der Funktion. Zusätzliche Informationen können durch Aufrufen SQLErrorabgerufen werden.
SQL_INVALID_HANDLE Fehler bei der Funktion aufgrund eines ungültigen Umgebungshandles, Verbindungshandle oder Anweisungshandle. Dies weist auf einen Programmierfehler hin. Es stehen keine zusätzlichen Informationen zur Verfügung.SQLError
SQL_STILL_EXECUTING Eine Funktion, die asynchron gestartet wurde, wird weiterhin ausgeführt. Standardmäßig übergibt MFC diesen Wert niemals an CheckRowsetError; MFC wird weiterhin aufgerufen SQLExtendedFetch , bis sie nicht mehr zurückgegeben wird SQL_STILL_EXECUTING.

Weitere Informationen finden SQLErrorSie im Windows SDK. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

CRecordset::Close

Schließt das Recordset.

virtual void Close();

Hinweise

Der ODBC-Speicher HSTMT und der gesamte Arbeitsspeicher, den das Framework für das Recordset zugewiesen hat, werden zugeordnet. In der Regel nach dem Aufrufen Closelöschen Sie das C++-Recordset-Objekt, wenn es zugeordnet newwurde.

Sie können nach dem Anruf Closeerneut anrufenOpen. Auf diese Weise können Sie das Recordset-Objekt wiederverwenden. Die Alternative ist das Aufrufen Requeryvon Anrufen.

Beispiel

// Construct a snapshot object
CCustomer rsCustSet(NULL);

if (!rsCustSet.Open())
return;

// Use the snapshot ...

// Close the snapshot
rsCustSet.Close();

// Destructor is called when the function exits

CRecordset::CRecordset

Erstellt ein CRecordset-Objekt.

CRecordset(CDatabase* pDatabase = NULL);

Parameter

pDatabase
Enthält einen Zeiger auf ein CDatabase Objekt oder den Wert NULL. Wenn die NULLCDatabase Memberfunktion des Open Objekts nicht aufgerufen wurde, um sie mit der Datenquelle zu verbinden, versucht das Recordset, sie während des eigenen Open Aufrufs für Sie zu öffnen. Wenn Sie übergeben NULL, wird ein CDatabase Objekt erstellt und mit den Datenquelleninformationen verbunden, die Sie angegeben haben, wenn Sie die Recordset-Klasse mit ClassWizard abgeleitet haben.

Hinweise

Sie können eine anwendungsspezifische Klasse entweder direkt verwenden CRecordset oder von CRecordsetdieser ableiten. Sie können ClassWizard verwenden, um Ihre Recordsetklassen abzuleiten.

Hinweis

Eine abgeleitete Klasse muss einen eigenen Konstruktor bereitstellen. Rufen Sie im Konstruktor der abgeleiteten Klasse den Konstruktor CRecordset::CRecordsetauf, und übergeben Sie die entsprechenden Parameter daran.

Übergeben Sie NULL den Recordset-Konstruktor, damit automatisch ein CDatabase Objekt erstellt und verbunden wird. Dies ist eine nützliche Kurzform, die es nicht erfordert, ein CDatabase Objekt zu erstellen und zu verbinden, bevor Sie das Recordset erstellen.

Beispiel

Weitere Informationen finden Sie unter "Recordset: Deklarieren einer Klasse für eine Tabelle (ODBC)".

CRecordset::Delete

Löscht den aktuellen Datensatz.

virtual void Delete();

Hinweise

Nach einem erfolgreichen Löschen werden die Felddatenmember des Recordsets auf einen Null-Wert festgelegt, und Sie müssen eine der Move Funktionen explizit aufrufen, um den gelöschten Datensatz zu deaktivieren. Nachdem Sie den gelöschten Datensatz entfernt haben, ist es nicht möglich, dorthin zurückzukehren. Wenn die Datenquelle Transaktionen unterstützt, können Sie den Delete Aufrufteil einer Transaktion vornehmen. Weitere Informationen finden Sie unter Transaction (ODBC).For more information, see Transaction (ODBC).

Hinweis

Wenn Sie das Massenabrufen von Zeilen implementiert haben, können Sie nicht anrufen Delete. Dies führt zu einer fehlgeschlagenen Assertion. Obwohl die Klasse CRecordset keinen Mechanismus zum Aktualisieren von Massenzeilen von Daten bereitstellt, können Sie ihre eigenen Funktionen mithilfe der ODBC-API-Funktion SQLSetPosschreiben. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Achtung

Das Recordset muss aktualisierbar sein, und es muss beim Aufrufen Deleteein gültiger Datensatz im Recordset vorhanden sein; andernfalls tritt ein Fehler auf. Wenn Sie z. B. einen Datensatz löschen, aber nicht zu einem neuen Datensatz scrollen, bevor Sie erneut aufrufen Delete , Delete wird eine CDBException ausgelöst.

Im Gegensatz zu AddNew und Edit, wird ein Anruf Delete nicht gefolgt von einem Anruf an Update. Wenn ein Delete Aufruf fehlschlägt, bleiben die Felddatenmember unverändert.

Beispiel

Dieses Beispiel zeigt ein Recordset, das im Rahmen einer Funktion erstellt wurde. Im Beispiel wird davon ausgegangen, dass m_dbCusteine Membervariable vom Typ CDatabase vorhanden ist, die bereits mit der Datenquelle verbunden ist.

// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();

if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
   !rsCustSet.CanTransact())
{
   return;
}

m_dbCust.BeginTrans();

// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();

// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();

CRecordset::DoBulkFieldExchange

Wird aufgerufen, um Massenzeilen von Daten aus der Datenquelle in das Recordset auszutauschen. Implementiert Massendatensatzfeldaustausch (Bulk RFX).

virtual void DoBulkFieldExchange(CFieldExchange* pFX);

Parameter

pFX
Ein Zeiger auf ein CFieldExchange-Objekt. Das Framework hat dieses Objekt bereits eingerichtet, um einen Kontext für den Feldaustauschvorgang anzugeben.

Hinweise

Wenn massenweise Zeilenabrufe implementiert werden, ruft das Framework diese Memberfunktion auf, um Daten aus der Datenquelle automatisch an Das Recordset-Objekt zu übertragen. DoBulkFieldExchange bindet ggf. die Parameterdatenmber an Parameterplatzhalter in der SQL-Anweisungszeichenfolge für die Auswahl des Recordsets.

Wenn das Abrufen von Massenzeilen nicht implementiert ist, ruft das Framework auf DoFieldExchange. Um massenweises Abrufen von Zeilen zu implementieren, müssen Sie die CRecordset::useMultiRowFetch Option des dwOptions-Parameters in der Open Memberfunktion angeben.

Hinweis

DoBulkFieldExchange ist nur verfügbar, wenn Sie eine von CRecordset. Wenn Sie ein Recordset-Objekt direkt CRecordseterstellt haben, müssen Sie die GetFieldValue Memberfunktion aufrufen, um Daten abzurufen.

Massendatensatzfeldaustausch (Bulk RFX) ähnelt dem Datensatzfeldaustausch (RFX). Daten werden automatisch von der Datenquelle an das Recordset-Objekt übertragen. Sie können jedoch keine Änderungen an der Datenquelle aufrufenAddNew, Editoder UpdateDeletesie können keine Änderungen an die Datenquelle übertragen. Die Klasse CRecordset stellt derzeit keinen Mechanismus zum Aktualisieren von Massenzeilen von Daten bereit. Sie können jedoch eigene Funktionen mithilfe der ODBC-API-Funktion SQLSetPosschreiben.

ClassWizard unterstützt keinen Massendatensatzfeldaustausch; Daher müssen Sie manuell außer Kraft setzen DoBulkFieldExchange , indem Sie Aufrufe an die Massen-RFX-Funktionen schreiben. Weitere Informationen zu diesen Funktionen finden Sie unter Record Field Exchange Functions.

Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information Verwandte Informationen finden Sie unter Record Field Exchange (RFX).For related information, see Record Field Exchange (RFX).

CRecordset::DoFieldExchange

Wird aufgerufen, um Daten (in beide Richtungen) zwischen den Felddatenelementen des Recordsets und dem entsprechenden Datensatz in der Datenquelle auszutauschen. Implementiert Datensatzfeldaustausch (RECORD Field Exchange, RFX).

virtual void DoFieldExchange(CFieldExchange* pFX);

Parameter

pFX
Ein Zeiger auf ein CFieldExchange-Objekt. Das Framework hat dieses Objekt bereits eingerichtet, um einen Kontext für den Feldaustauschvorgang anzugeben.

Hinweise

Wenn das Massenabrufen von Zeilen nicht implementiert ist, ruft das Framework diese Memberfunktion auf, um automatisch Daten zwischen den Felddatenmembern Des Recordset-Objekts und den entsprechenden Spalten des aktuellen Datensatzes in der Datenquelle auszutauschen. DoFieldExchange bindet ggf. die Parameterdatenmber an Parameterplatzhalter in der SQL-Anweisungszeichenfolge für die Auswahl des Recordsets.

Wenn massenweises Abrufen von Zeilen implementiert ist, ruft das Framework auf DoBulkFieldExchange. Um massenweises Abrufen von Zeilen zu implementieren, müssen Sie die CRecordset::useMultiRowFetch Option des dwOptions Parameters in der Open Memberfunktion angeben.

Hinweis

DoFieldExchange ist nur verfügbar, wenn Sie eine von CRecordset. Wenn Sie ein Recordset-Objekt direkt CRecordseterstellt haben, müssen Sie die GetFieldValue-Memberfunktion aufrufen, um Daten abzurufen.

Der Austausch von Felddaten, der als Datensatzfeldaustausch (RFX) bezeichnet wird, funktioniert in beide Richtungen: von den Felddatenelementen des Recordset-Objekts bis zu den Feldern des Datensatzes in der Datenquelle und vom Datensatz in der Datenquelle bis zum Recordset-Objekt.

Die einzige Aktion, die Sie normalerweise ausführen müssen, um die abgeleitete Recordsetklasse zu implementieren DoFieldExchange , besteht darin, die Klasse mit ClassWizard zu erstellen und die Namen und Datentypen der Felddatenmber anzugeben. Sie können auch Code hinzufügen, den ClassWizard schreibt, um Parameterdatenmmber anzugeben oder um alle Spalten zu behandeln, die Sie dynamisch binden. Weitere Informationen finden Sie unter Recordset: Dynamically Binding Data Columns (ODBC).

Wenn Sie die abgeleitete Recordset-Klasse mit ClassWizard deklarieren, schreibt der Assistent eine Außerkraftsetzung DoFieldExchange für Sie, die dem folgenden Beispiel ähnelt:

void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputColumn);
   // Macros such as RFX_Text() and RFX_Int() are dependent on the
   // type of the member variable, not the type of the field in the database.
   // ODBC will try to automatically convert the column value to the requested type
   RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
   RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
   RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
   RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
   RFX_Long(pFX, _T("[BillingID]"), m_BillingID);

   pFX->SetFieldType(CFieldExchange::inputParam);
   RFX_Text(pFX, _T("Param"), m_strParam);
}

Weitere Informationen zu den RFX-Funktionen finden Sie unter Record Field Exchange Functions.

Weitere Beispiele und Details dazu DoFieldExchangefinden Sie unter Record Field Exchange: How RFX Works. Allgemeine Informationen zu RFX finden Sie unter Record Field Exchange.

CRecordset::Edit

Ermöglicht Änderungen am aktuellen Datensatz.

virtual void Edit();

Hinweise

Nachdem Sie aufgerufen Edithaben, können Sie die Felddatenmber ändern, indem Sie ihre Werte direkt zurücksetzen. Der Vorgang wird abgeschlossen, wenn Sie die Update Memberfunktion aufrufen, um Ihre Änderungen in der Datenquelle zu speichern.

Hinweis

Wenn Sie das Massenabrufen von Zeilen implementiert haben, können Sie nicht anrufen Edit. Dies führt zu einer fehlgeschlagenen Assertion. Obwohl die Klasse CRecordset keinen Mechanismus zum Aktualisieren von Massenzeilen von Daten bereitstellt, können Sie ihre eigenen Funktionen mithilfe der ODBC-API-Funktion SQLSetPosschreiben. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Edit speichert die Werte der Datenmber des Recordsets. Wenn Sie aufrufen Edit, nehmen Sie Änderungen vor, und rufen Edit Sie dann erneut auf, die Werte des Datensatzes werden wiederhergestellt, was sie vor dem ersten Edit Aufruf waren.

In einigen Fällen möchten Sie möglicherweise eine Spalte aktualisieren, indem Sie sie null machen (ohne Daten enthalten). Rufen Sie SetFieldNull dazu einen Parameter von TRUE auf, um das Feld NULL zu markieren. Dadurch wird auch die Spalte aktualisiert. Wenn ein Feld in die Datenquelle geschrieben werden soll, obwohl sein Wert nicht geändert wurde, rufen SetFieldDirty Sie mit einem Parameter von TRUE auf. Dies funktioniert auch, wenn das Feld den Wert Null hatte.

Wenn die Datenquelle Transaktionen unterstützt, können Sie den Edit Aufrufteil einer Transaktion vornehmen. Rufen Sie vor dem Anruf CDatabase::BeginTransEdit und nach dem Öffnen des Recordsets auf. Außerdem ist der Anruf CDatabase::CommitTrans kein Ersatz für anrufe Update , um den Edit Vorgang abzuschließen. Weitere Informationen zu Transaktionen finden Sie unter Klasse CDatabase.

Je nach dem aktuellen Sperrmodus wird der datensatz, der aktualisiert wird, möglicherweise gesperrt Edit , bis Sie einen Anruf tätigen Update oder zu einem anderen Datensatz scrollen, oder er wird nur während des Edit Anrufs gesperrt. Sie können den Sperrmodus mit SetLockingMode.

Der vorherige Wert des aktuellen Datensatzes wird wiederhergestellt, wenn Sie vor dem Aufrufen Updatezu einem neuen Datensatz scrollen. Ein CDBException Fehler wird ausgelöst, wenn Sie ein Recordset aufrufen Edit , das nicht aktualisiert werden kann oder wenn kein aktueller Datensatz vorhanden ist.

Weitere Informationen finden Sie in den Artikeln Transaction (ODBC) und Recordset: Locking Records (ODBC).

Beispiel

// To edit a record, first set up the edit buffer
rsCustSet.Edit();

// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");

// Finally, complete the operation
if (!rsCustSet.Update())
{
   // Handle the failure to update
   AfxMessageBox(_T("Couldn't update record!"));
}

CRecordset::FlushResultSet

Ruft den nächsten Resultset einer vordefinierten Abfrage (gespeicherte Prozedur) ab, wenn mehrere Resultsets vorhanden sind.

BOOL FlushResultSet();

Rückgabewert

Nonzero, wenn mehr Resultsets abgerufen werden sollen; andernfalls 0.

Hinweise

Sie sollten nur aufgerufen werden FlushResultSet , wenn Sie mit dem Cursor im aktuellen Resultset fertig sind. Wenn Sie das nächste Resultset durch Aufrufen FlushResultSetabrufen, ist der Cursor für diesen Resultset nicht gültig. Sie sollten die MoveNext Memberfunktion nach dem Aufrufen FlushResultSetaufrufen.

Wenn eine vordefinierte Abfrage einen Ausgabeparameter oder Eingabe-/Ausgabeparameter verwendet, müssen Sie aufrufen FlushResultSet , bis sie zurückgegeben FALSEwird (der Wert 0), um diese Parameterwerte abzurufen.

FlushResultSet ruft die ODBC-API-Funktion SQLMoreResultsauf. Wenn SQLMoreResults zurückgegeben SQL_ERROR oder SQL_INVALID_HANDLE, wird FlushResultSet eine Ausnahme ausgelöst. Weitere Informationen finden SQLMoreResultsSie im Windows SDK.

Ihre gespeicherte Prozedur muss gebundene Felder enthalten, wenn Sie aufrufen FlushResultSetmöchten.

Beispiel

Im folgenden Code wird davon ausgegangen, dass es sich um ein CRecordsetabgeleitetes Objekt handelt, das COutParamRecordset auf einer vordefinierten Abfrage mit einem Eingabeparameter und einem Ausgabeparameter basiert und mehrere Resultsets hat. Beachten Sie die Struktur der DoFieldExchange Außerkraftsetzung.

// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputParam);
   RFX_Long(pFX, _T("Param1"), m_nCountParam);
   // The "Param1" name here is a dummy name 
   // that is never used

   pFX->SetFieldType(CFieldExchange::inputParam);
   RFX_Text(pFX, _T("Param2"), m_strNameParam);
   // The "Param2" name here is a dummy name 
   // that is never used
}

 

// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");

// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor 
//       type for multiple rowset returning stored 
//       procedures
rs.Open(CRecordset::forwardOnly,
   _T("{? = CALL GetCourses( ? )}"),
   CRecordset::readOnly);

// Loop through all the data in the first result set
while (!rs.IsEOF())
{
   CString strFieldValue;
   for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
   {
      rs.GetFieldValue(nIndex, strFieldValue);

      // TO DO: Use field value string.
   }
   rs.MoveNext();
}

// Retrieve other result sets...
while (rs.FlushResultSet())
{
   // must call MoveNext because cursor is invalid
   rs.MoveNext();

   while (!rs.IsEOF())
   {
      CString strFieldValue;
      for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
      {
         rs.GetFieldValue(nIndex, strFieldValue);

         // TO DO: Use field value string.
      }
      rs.MoveNext();
   }
}


// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.

// TO DO: Use m_nCountParam

// Cleanup
rs.Close();

CRecordset::GetBookmark

Ruft den Textmarkenwert für den aktuellen Datensatz ab.

void GetBookmark(CDBVariant& varBookmark);

Parameter

varBookmark
Ein Verweis auf ein CDBVariant Objekt, das die Textmarke im aktuellen Datensatz darstellt.

Hinweise

Rufen Sie auf, um CanBookmarkzu ermitteln, ob Lesezeichen für das Recordset unterstützt werden. Um Lesezeichen verfügbar zu machen, wenn sie unterstützt werden, müssen Sie die CRecordset::useBookmarks Option im dwOptions Parameter der Open Memberfunktion festlegen.

Hinweis

Wenn Lesezeichen nicht unterstützt oder nicht verfügbar sind, führt der Aufruf GetBookmark zu einer Ausnahme, die ausgelöst wird. Textmarken werden für Vorwärtsrecordsets nicht unterstützt.

GetBookmark weist dem Objekt den Wert der Textmarke für den aktuellen Datensatz zu CDBVariant . Wenn Sie zu diesem Datensatz zurückkehren möchten, nachdem Sie zu einem anderen Datensatz wechseln, rufen Sie SetBookmark das entsprechende CDBVariant Objekt auf.

Hinweis

Nach bestimmten Recordsetvorgängen sind Textmarken möglicherweise nicht mehr gültig. Wenn Sie z. B. gefolgt von RequeryanrufenGetBookmark, können Sie möglicherweise nicht zum Datensatz zurückkehren mit SetBookmark. Rufen Sie CDatabase::GetBookmarkPersistence an, um zu überprüfen, ob Sie sicher anrufen SetBookmarkkönnen.

Weitere Informationen zur Textmarken- und Recordsetnavigation finden Sie in den Artikeln Recordset: Bookmarks and Absolute Positions (ODBC) und Recordset: Scrolling (ODBC).

CRecordset::GetDefaultConnect

Wird aufgerufen, um die Standard-Verbindungszeichenfolge abzurufen.

virtual CString GetDefaultConnect();

Rückgabewert

A CString that contains the default Verbindungszeichenfolge.

Hinweise

Das Framework ruft diese Memberfunktion auf, um die Standard-Verbindungszeichenfolge für die Datenquelle abzurufen, auf der das Recordset basiert. ClassWizard implementiert diese Funktion für Sie, indem Sie die gleiche Datenquelle identifizieren, die ClassWizard Sie zum Abrufen von Informationen zu Tabellen und Spalten verwenden. Wahrscheinlich ist es praktisch, sich auf diese Standardverbindung zu verlassen, während Sie Ihre Anwendung entwickeln. Die Standardverbindung eignet sich jedoch möglicherweise nicht für Benutzer Ihrer Anwendung. Wenn dies der Fall ist, sollten Sie diese Funktion erneut anwenden, die Version aufheben KarteClassWizard. Weitere Informationen zu Verbindungszeichenfolge finden Sie unter Data Source (ODBC).For more information about Verbindungszeichenfolge s, see Data Source (ODBC).

CRecordset::GetDefaultSQL

Wird aufgerufen, um die sql-Standardzeichenfolge abzurufen, die ausgeführt werden soll.

virtual CString GetDefaultSQL();

Rückgabewert

A CString that contains the default SQL statement.

Hinweise

Das Framework ruft diese Memberfunktion auf, um die SQL-Standardanweisung abzurufen, auf der das Recordset basiert. Dies kann ein Tabellenname oder eine SQL-Anweisung SELECT sein.

Sie definieren indirekt die STANDARD-SQL-Anweisung, indem Sie die Recordset-Klasse deklarieren ClassWizardund ClassWizard diese Aufgabe für Sie ausführen.

Wenn Sie die SQL-Anweisungszeichenfolge für ihre eigene Verwendung benötigen, rufen Sie die GetSQLSQL-Anweisung zurück, die zum Auswählen der Datensätze des Recordsets beim Öffnen verwendet wird. Sie können die SQL-Standardzeichenfolge in der Außerkraftsetzung GetDefaultSQLIhrer Klasse bearbeiten. Sie können z. B. einen Aufruf einer vordefinierten Abfrage mithilfe einer CALL Anweisung angeben. (Beachten Sie jedoch, dass Sie beim Bearbeiten GetDefaultSQLauch ändern müssen m_nFields , um der Anzahl der Spalten in der Datenquelle zu entsprechen.)

Weitere Informationen finden Sie unter "Recordset: Deklarieren einer Klasse für eine Tabelle (ODBC)".

Achtung

Der Tabellenname ist leer, wenn das Framework keinen Tabellennamen identifizieren konnte, wenn mehrere Tabellennamen angegeben wurden oder eine CALL Anweisung nicht interpretiert werden konnte. Wenn Sie eine CALL Anweisung verwenden, fügen Sie keine Leerzeichen zwischen der geschweiften Klammer und dem CALL Schlüsselwort (keyword) oder vor der geschweiften Klammer oder vor dem SELECT Schlüsselwort (keyword) in einer SELECT Anweisung ein.

CRecordset::GetFieldValue

Ruft Felddaten im aktuellen Datensatz ab.

void GetFieldValue(
    LPCTSTR lpszName,
    CDBVariant& varValue,
    short nFieldType = DEFAULT_FIELD_TYPE);

void GetFieldValue(
    LPCTSTR lpszName,
    CStringA& strValue
);

void GetFieldValue(
    LPCTSTR lpszName,
    CStringW& strValue
);

void GetFieldValue(
    short nIndex,
    CDBVariant& varValue,
    short nFieldType = DEFAULT_FIELD_TYPE);

void GetFieldValue(
    short nIndex,
    CStringA& strValue);

void GetFieldValue(
    short nIndex,
    CStringW& strValue);

Parameter

lpszName
Der Name eines Felds.

varValue Ein Verweis auf ein CDBVariant Objekt, das den Wert des Felds speichert.

nFieldType
Der ODBC-C-Datentyp des Felds. Wenn Sie den Standardwert verwenden, wird erzwingtGetFieldValue, DEFAULT_FIELD_TYPEden Datentyp C aus dem SQL-Datentyp basierend auf der folgenden Tabelle zu bestimmen. Andernfalls können Sie den Datentyp direkt angeben oder einen kompatiblen Datentyp auswählen. Sie können z. B. jeden Datentyp speichern.SQL_C_CHAR

C-Datentyp SQL-Datentyp
SQL_C_BIT SQL_BIT
SQL_C_UTINYINT SQL_TINYINT
SQL_C_SSHORT SQL_SMALLINT
SQL_C_SLONG SQL_INTEGER
SQL_C_FLOAT SQL_REAL
SQL_C_DOUBLE SQL_FLOATSQL_DOUBLE
SQL_C_TIMESTAMP SQL_DATESQL_TIMESQL_TIMESTAMP
SQL_C_CHAR SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR
SQL_C_BINARY SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY

Weitere Informationen zu ODBC-Datentypen finden Sie in den Themen "SQL-Datentypen" und "C-Datentypen" in Anhang D des Windows SDK.

nIndex
Der nullbasierte Index des Felds.

strValue
Ein Verweis auf ein CString Objekt, das den in Text konvertierten Wert des Felds speichert, unabhängig vom Datentyp des Felds.

Hinweise

Sie können ein Feld entweder anhand des Namens oder nach Index nachschlagen. Sie können den Feldwert entweder in einem CDBVariant Objekt oder in einem CString Objekt speichern.

Wenn Sie das Massenabrufen von Zeilen implementiert haben, wird der aktuelle Datensatz immer auf dem ersten Datensatz in einem Rowset positioniert. Wenn Sie einen Datensatz in einem bestimmten Rowset verwenden GetFieldValue möchten, müssen Sie zuerst die SetRowsetCursorPosition Memberfunktion aufrufen, um den Cursor in die gewünschte Zeile innerhalb dieses Rowsets zu verschieben. Rufen Sie GetFieldValue dann diese Zeile auf. Um massenweises Abrufen von Zeilen zu implementieren, müssen Sie die CRecordset::useMultiRowFetch Option des dwOptions Parameters in der Open Memberfunktion angeben.

Sie können felder GetFieldValue zur Laufzeit dynamisch abrufen, anstatt sie zur Entwurfszeit statisch zu binden. Wenn Sie z. B. ein Recordset-Objekt direkt deklariert CRecordsethaben, müssen Sie die GetFieldValue Felddaten abrufen; Datensatzfeldaustausch (RFX) oder Massendatensatzfeldaustausch (Bulk RFX) ist nicht implementiert.

Hinweis

Wenn Sie ein Recordset-Objekt deklarieren, ohne ableiten zu CRecordsetmüssen, ist die ODBC-Cursorbibliothek nicht geladen. Für die Cursorbibliothek muss das Recordset mindestens eine gebundene Spalte aufweisen. Wenn Sie jedoch direkt verwenden CRecordset , sind keine Spalten gebunden. Die Memberfunktionen CDatabase::OpenEx und CDatabase::Open steuern, ob die Cursorbibliothek geladen wird.

GetFieldValue ruft die ODBC-API-Funktion SQLGetDataauf. Wenn ihr Treiber den Wert ausgibt, der für die tatsächliche Länge des Feldwerts SQL_NO_TOTAL, GetFieldValue löst eine Ausnahme aus. Weitere Informationen finden SQLGetDataSie im Windows SDK.

Beispiel

Der folgende Beispielcode veranschaulicht Aufrufe GetFieldValue für ein Recordset-Objekt, das direkt von CRecordset.

// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);

// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));

// Create a CDBVariant object to
// store field data
CDBVariant varValue;

// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
   for (short index = 0; index < nFields; index++)
   {
      rs.GetFieldValue(index, varValue);
      // do something with varValue
   }
   rs.MoveNext();
}

rs.Close();
db.Close();

Hinweis

Im Gegensatz zur DAO-Klasse CDaoRecordsetCRecordset ist keine SetFieldValue Memberfunktion vorhanden. Wenn Sie ein Objekt direkt CRecordseterstellen, ist es effektiv schreibgeschützt.

Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

CRecordset::GetODBCFieldCount

Ruft die Gesamtanzahl der Felder in Ihrem Recordset -Objekt ab.

short GetODBCFieldCount() const;

Rückgabewert

Die Anzahl der Felder im Recordset.

Hinweise

Weitere Informationen zum Erstellen von Recordsets finden Sie unter Recordset: Creating and Closing Recordsets (ODBC).For more information about creating recordsets, see Recordset: Creating and Closing Recordsets (ODBC).For more information about creating recordsets, see Recordset: Creating and Closing Recordsets (ODBC).For more information about

CRecordset::GetODBCFieldInfo

Ruft Informationen zu den Feldern im Recordset ab.

void GetODBCFieldInfo(
    LPCTSTR lpszName,
    CODBCFieldInfo& fieldinfo);

void GetODBCFieldInfo(
    short nIndex,
    CODBCFieldInfo& fieldinfo);

Parameter

lpszName
Der Name eines Felds.

fieldinfo
Ein Verweis auf eine CODBCFieldInfo Struktur.

nIndex
Der nullbasierte Index des Felds.

Hinweise

Mit einer Version der Funktion können Sie ein Feld anhand des Namens nachschlagen. Mit der anderen Version können Sie ein Feld nach Index nachschlagen.

Eine Beschreibung der zurückgegebenen Informationen finden Sie in der CODBCFieldInfo Struktur.

Weitere Informationen zum Erstellen von Recordsets finden Sie unter Recordset: Creating and Closing Recordsets (ODBC).For more information about creating recordsets, see Recordset: Creating and Closing Recordsets (ODBC).For more information about creating recordsets, see Recordset: Creating and Closing Recordsets (ODBC).For more information about

CRecordset::GetRecordCount

Bestimmt die Größe des Recordsets.

long GetRecordCount() const;

Rückgabewert

Die Anzahl der Datensätze im Recordset; 0, wenn das Recordset keine Datensätze enthält; oder -1, wenn die Datensatzanzahl nicht bestimmt werden kann.

Hinweise

Achtung

Die Datensatzanzahl wird Standard als "High Water Mark" beibehalten, der höchst nummerierte Datensatz, der noch gesehen wird, wenn der Benutzer die Datensätze durchläuft. Die Gesamtzahl der Datensätze ist nur bekannt, nachdem der Benutzer über den letzten Datensatz hinausgezogen wurde. Aus Leistungsgründen wird die Anzahl beim Anruf MoveLastnicht aktualisiert. Um die Datensätze selbst zu zählen, rufen Sie wiederholt auf MoveNext , bis IsEOF nonzero zurückgegeben wird. Das Hinzufügen eines Datensatzes über CRecordset:AddNew und Update erhöht die Anzahl; durch Löschen eines Datensatzes über CRecordset::Delete verringert die Anzahl.

CRecordset::GetRowsetSize

Ruft die aktuelle Einstellung für die Anzahl der Zeilen ab, die Sie während eines bestimmten Abrufs abrufen möchten.

DWORD GetRowsetSize() const;

Rückgabewert

Die Anzahl der Zeilen, die während eines bestimmten Abrufs abgerufen werden sollen.

Hinweise

Wenn Sie massenweises Abrufen von Zeilen verwenden, beträgt die Standardzeilengröße, wenn das Recordset geöffnet wird, 25; andernfalls ist es 1.

Um massenweises Abrufen von Zeilen zu implementieren, müssen Sie die CRecordset::useMultiRowFetch Option im dwOptions Parameter der Open Memberfunktion angeben. Rufen Sie auf, um SetRowsetSizedie Einstellung für die Zeilensatzgröße zu ändern.

Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

CRecordset::GetRowsFetched

Bestimmt, wie viele Datensätze nach einem Abruf abgerufen wurden.

DWORD GetRowsFetched() const;

Rückgabewert

Die Anzahl der Zeilen, die nach einem bestimmten Abruf aus der Datenquelle abgerufen wurden.

Hinweise

Dies ist nützlich, wenn Sie massenweises Abrufen von Zeilen implementiert haben. Die Rowsetgröße gibt normalerweise an, wie viele Zeilen aus einem Abruf abgerufen werden. Die Gesamtanzahl der Zeilen im Recordset wirkt sich jedoch auch darauf aus, wie viele Zeilen in einem Rowset abgerufen werden. Wenn ihr Recordset beispielsweise über 10 Datensätze mit einer Zeilensatzgröße von vier Datensätzen verfügt, führt das Durchlaufen des Recordsets durch aufrufen MoveNext dazu, dass nur zwei Datensätze vorhanden sind.

Um massenweises Abrufen von Zeilen zu implementieren, müssen Sie die CRecordset::useMultiRowFetch Option im dwOptions-Parameter der Open Memberfunktion angeben. Um die Rowsetgröße anzugeben, rufen Sie SetRowsetSize auf.

Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Beispiel

CMultiCustomer rs(&m_dbCust);

// Set the rowset size
rs.SetRowsetSize(5);

// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);

// loop through the recordset by rowsets
while (!rs.IsEOF())
{
   for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
   {
      // do something
   }

   rs.MoveNext();
}

rs.Close();

CRecordset::GetRowStatus

Ruft den Status für eine Zeile im aktuellen Rowset ab.

WORD GetRowStatus(WORD wRow) const;

Parameter

wRow
Die 1-basierte Position einer Zeile im aktuellen Rowset. Dieser Wert kann zwischen 1 und der Größe des Rowsets liegen.

Rückgabewert

Ein Statuswert für die Zeile. Einzelheiten finden Sie unter "Hinweise".

Hinweise

GetRowStatus gibt einen Wert zurück, der entweder eine Änderung des Status der Zeile angibt, seit sie zuletzt aus der Datenquelle abgerufen wurde, oder dass keine Zeile abgerufen wurde, die dem Abruf entspricht wRow . In der folgenden Tabelle sind die möglichen Rückgabewerte aufgelistet:

Statuswert Beschreibung
SQL_ROW_SUCCESS Die Zeile ist unverändert.
SQL_ROW_UPDATED Die Zeile wurde aktualisiert.
SQL_ROW_DELETED Die Zeile wurde gelöscht.
SQL_ROW_ADDED Die Zeile wurde hinzugefügt.
SQL_ROW_ERROR Die Zeile kann aufgrund eines Fehlers nicht wiederholt werden.
SQL_ROW_NOROW Es entspricht wRowkeine Zeile .

Weitere Informationen finden Sie in der ODBC-API-Funktion SQLExtendedFetch im Windows SDK.

CRecordset::GetStatus

Bestimmt den Index des aktuellen Datensatzes im Recordset und ob der letzte Datensatz angezeigt wurde.

void GetStatus(CRecordsetStatus& rStatus) const;

Parameter

rStatus
Ein Verweis auf ein CRecordsetStatus-Objekt. Weitere Informationen finden Sie in den Hinweisen.

Hinweise

CRecordset versucht, den Index nachzuverfolgen, aber unter bestimmten Umständen ist dies möglicherweise nicht möglich. Eine Erläuterung finden Sie GetRecordCount hier.

Die CRecordsetStatus Struktur weist die folgende Form auf:

struct CRecordsetStatus
{
    long m_lCurrentRecord;
    BOOL m_bRecordCountFinal;
};

Die beiden Mitglieder haben CRecordsetStatus die folgenden Bedeutungen:

  • m_lCurrentRecord Enthält den nullbasierten Index des aktuellen Datensatzes im Recordset, falls bekannt. Wenn der Index nicht bestimmt werden kann, enthält AFX_CURRENT_RECORD_UNDEFINED dieses Element (-2). Wenn IsBOF TRUE (leeres Recordset oder Versuch, vor dem ersten Datensatz zu scrollen) ist, m_lCurrentRecord wird der Wert auf AFX_CURRENT_RECORD_BOF (-1) festgelegt. Wenn sie sich auf dem ersten Datensatz befindet, wird er auf 0, zweiten Datensatz 1 usw. festgelegt.

  • m_bRecordCountFinal Nonzero, wenn die Gesamtanzahl der Datensätze im Recordset ermittelt wurde. Im Allgemeinen muss dies erreicht werden, indem sie am Anfang des Recordsets beginnen und aufrufen MoveNext , bis IsEOF nonzero zurückgegeben wird. Wenn dieses Element null ist, wird der Datensatz wie von GetRecordCount, wenn nicht -1 zurückgegeben, nur eine "Hohe Wassermarke" Anzahl der Datensätze sein.

CRecordset::GetSQL

Rufen Sie diese Memberfunktion auf, um die SQL-Anweisung abzurufen, die zum Auswählen der Datensätze des Recordsets beim Öffnen verwendet wurde.

const CString& GetSQL() const;

Rückgabewert

Ein const Verweis auf ein CString Objekt, das die SQL-Anweisung enthält.

Hinweise

Dies ist in der Regel eine SQL-Anweisung SELECT . Die von GetSQL der Zeichenfolge zurückgegebene Zeichenfolge ist schreibgeschützt.

Die zurückgegebene GetSQL Zeichenfolge unterscheidet sich in der Regel von jeder Zeichenfolge, die Sie möglicherweise an das Recordset im lpszSQL Parameter an die Open Memberfunktion übergeben haben. Dies liegt daran, dass das Recordset eine vollständige SQL-Anweisung erstellt, basierend auf dem, an was Sie übergeben Openhaben, mit dem Sie angegeben ClassWizardhaben, was Sie möglicherweise in den Membern und m_strSort Daten angegeben haben, und alle Parameter, die m_strFilter Sie angegeben haben. Ausführliche Informationen dazu, wie das Recordset diese SQL-Anweisung erstellt, finden Sie unter Recordset: How Recordsets Select Records (ODBC).

Hinweis

Rufen Sie diese Memberfunktion erst nach dem Aufrufen auf Open.

CRecordset::GetTableName

Ruft den Namen der SQL-Tabelle ab, auf der die Abfrage des Recordsets basiert.

const CString& GetTableName() const;

Rückgabewert

Ein const Verweis auf ein CString Objekt, das den Tabellennamen enthält, wenn das Recordset auf einer Tabelle basiert; andernfalls eine leere Zeichenfolge.

Hinweise

GetTableName ist nur gültig, wenn das Recordset auf einer Tabelle basiert, nicht auf einer Verknüpfung mehrerer Tabellen oder einer vordefinierten Abfrage (gespeicherte Prozedur). Der Name ist schreibgeschützt.

Hinweis

Rufen Sie diese Memberfunktion erst nach dem Aufrufen auf Open.

CRecordset::IsBOF

Gibt "nonzero" zurück, wenn das Recordset vor dem ersten Datensatz positioniert wurde. Es gibt keinen aktuellen Datensatz.

BOOL IsBOF() const;

Rückgabewert

Nonzero, wenn das Recordset keine Datensätze enthält oder wenn Sie vor dem ersten Datensatz rückwärts gescrollt haben; andernfalls 0.

Hinweise

Rufen Sie diese Memberfunktion auf, bevor Sie von Datensatz zu Datensatz scrollen, um zu erfahren, ob Sie vor dem ersten Datensatz des Recordsets gegangen sind. Sie können auch IsBOF zusammen mit IsEOF dem Datensatz bestimmen, ob das Recordset Datensätze enthält oder leer ist. Wenn das Recordset keine Datensätze enthält, IsBOF gibt das Recordset unmittelbar nach dem Aufruf Openeinen Wert ungleich Null zurück. Wenn Sie ein Recordset öffnen, das mindestens einen Datensatz enthält, ist der erste Datensatz der aktuelle Datensatz und IsBOF gibt "0" zurück.

Wenn der erste Datensatz der aktuelle Datensatz ist und Sie aufrufen MovePrev, IsBOF wird "nonzero" zurückgegeben. Wenn IsBOF "nonzero" zurückgegeben wird und Sie aufrufen MovePrev, tritt ein Fehler auf. Wenn IsBOF "nonzero" zurückgegeben wird, ist der aktuelle Datensatz nicht definiert, und jede Aktion, die einen aktuellen Datensatz erfordert, führt zu einem Fehler.

Beispiel

In diesem Beispiel werden die Grenzen eines Recordsets verwendet IsBOF und IsEOF erkannt, wenn der Code in beide Richtungen durch das Recordset scrollt.

// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();

if(rsCustSet.IsBOF())
   return;
   // The recordset is empty

// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
   rsCustSet.MoveNext();

// Move to the last record
rsCustSet.MoveLast();

// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
   rsCustSet.MovePrev();

// First record is current again
rsCustSet.MoveFirst();

CRecordset::IsDeleted

Bestimmt, ob der aktuelle Datensatz gelöscht wurde.

BOOL IsDeleted() const;

Rückgabewert

Nonzero, wenn das Recordset in einem gelöschten Datensatz positioniert ist; andernfalls 0.

Hinweise

Wenn Sie zu einem Datensatz scrollen und IsDeleted zurückgeben TRUE (nonzero), müssen Sie zu einem anderen Datensatz scrollen, bevor Sie andere Recordsetvorgänge ausführen können.

Das Ergebnis IsDeleted hängt von vielen Faktoren ab, z. B. dem Recordset-Typ, ob das Recordset aktualisierbar ist, ob Sie beim Öffnen des Recordsets die CRecordset::skipDeletedRecords Option angegeben haben, ob Die Treiber gelöschte Datensätze packen und ob mehrere Benutzer vorhanden sind.

Weitere Informationen zum CRecordset::skipDeletedRecords Packen und Packen von Treibern finden Sie in der Funktion "Member öffnen ".

Hinweis

Wenn Sie das Massenabrufen von Zeilen implementiert haben, sollten Sie nicht aufrufen IsDeleted. Rufen Sie stattdessen die GetRowStatus-Memberfunktion auf. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

CRecordset::IsEOF

Gibt "nonzero" zurück, wenn das Recordset nach dem letzten Datensatz positioniert wurde. Es gibt keinen aktuellen Datensatz.

BOOL IsEOF() const;

Rückgabewert

Nonzero, wenn das Recordset keine Datensätze enthält oder wenn Sie einen Bildlauf über den letzten Datensatz hinaus ausgeführt haben; andernfalls 0.

Hinweise

Rufen Sie diese Memberfunktion auf, während Sie von Datensatz zu Datensatz scrollen, um zu erfahren, ob Sie den letzten Datensatz des Recordsets überschritten haben. Sie können auch IsEOF bestimmen, ob das Recordset Datensätze enthält oder leer ist. Wenn das Recordset keine Datensätze enthält, IsEOF gibt das Recordset unmittelbar nach dem Aufruf Openeinen Wert ungleich Null zurück. Wenn Sie ein Recordset öffnen, das mindestens einen Datensatz enthält, ist der erste Datensatz der aktuelle Datensatz und IsEOF gibt "0" zurück.

Wenn der letzte Datensatz beim Aufrufen MoveNextder aktuelle Datensatz ist, IsEOF wird kein Wert zurückgegeben. Wenn IsEOF "nonzero" zurückgegeben wird und Sie aufrufen MoveNext, tritt ein Fehler auf. Wenn IsEOF "nonzero" zurückgegeben wird, ist der aktuelle Datensatz nicht definiert, und jede Aktion, die einen aktuellen Datensatz erfordert, führt zu einem Fehler.

Beispiel

Sehen Sie sich das Beispiel für IsBOF.

CRecordset::IsFieldDirty

Bestimmt, ob das angegebene Felddatenmemm seit Edit dem Aufruf geändert oder AddNew aufgerufen wurde.

BOOL IsFieldDirty(void* pv);

Parameter

pv
Ein Zeiger auf das Felddatenelement, dessen Status Sie überprüfen möchten, oder NULL um festzustellen, ob eines der Felder modifiziert ist.

Rückgabewert

Nonzero, wenn sich das angegebene Felddatenmemm seit dem Aufrufen AddNew oder Edit; andernfalls 0 geändert hat.

Hinweise

Die Daten in allen modifiziert Felddatenmember werden an den Datensatz in der Datenquelle übertragen, wenn der aktuelle Datensatz durch einen Aufruf der Update Memberfunktion CRecordset (nach einem Aufruf von Edit oderAddNew) aktualisiert wird.

Hinweis

Diese Memberfunktion gilt nicht für Recordsets, die Massenzeilenabrufe verwenden. Wenn Sie das Massenabrufen von Zeilen implementiert haben, IsFieldDirty wird immer FALSE zurückgegeben und führt zu einer fehlgeschlagenen Assertion. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Beim Aufrufen IsFieldDirty werden die Auswirkungen der vorherigen Aufrufe auf SetFieldDirty zurückgesetzt, da der modifiziert Status des Felds neu ausgewertet wird. Wenn sich der AddNew aktuelle Feldwert vom Pseudo-NULL-Wert unterscheidet, wird der Feldstatus modifiziert festgelegt. Falls sich der Edit Feldwert vom zwischengespeicherten Wert unterscheidet, wird der Feldstatus modifiziert festgelegt.

IsFieldDirty wird über DoFieldExchange.

Weitere Informationen zum flag modifiziert finden Sie unter Recordset: How Recordsets Select Records (ODBC).

CRecordset::IsFieldNull

Gibt "nonzero" zurück, wenn das angegebene Feld im aktuellen Datensatz Null ist (hat keinen Wert).

BOOL IsFieldNull(void* pv);

Parameter

pv
Ein Zeiger auf das Felddatenelement, dessen Status Sie überprüfen möchten, oder NULL um zu bestimmen, ob eines der Felder Null ist.

Rückgabewert

Nonzero, wenn das angegebene Felddatenmemm als Null gekennzeichnet ist; andernfalls 0.

Hinweise

Rufen Sie diese Memberfunktion auf, um zu bestimmen, ob das angegebene Felddatenmemm eines Recordsets als Null gekennzeichnet wurde. (In der Datenbankterminologie bedeutet Null "keinen Wert" und ist nicht identisch mit NULL in C++.) Wenn ein Felddatenmemm als Null gekennzeichnet ist, wird es als Spalte des aktuellen Datensatzes interpretiert, für den kein Wert vorhanden ist.

Hinweis

Diese Memberfunktion gilt nicht für Recordsets, die Massenzeilenabrufe verwenden. Wenn Sie massenweises Abrufen von Zeilen implementiert haben, wird immer IsFieldNull zurückgegeben FALSE und führt zu einer fehlgeschlagenen Assertion. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

IsFieldNull wird über DoFieldExchange.

CRecordset::IsFieldNullable

Gibt "nonzero" zurück, wenn das angegebene Feld im aktuellen Datensatz auf Null festgelegt werden kann (ohne Wert).

BOOL IsFieldNullable(void* pv);

Parameter

pv
Ein Zeiger auf das Felddatenelement, dessen Status Sie überprüfen möchten, oder NULL um zu bestimmen, ob eines der Felder auf einen Null-Wert festgelegt werden kann.

Hinweise

Rufen Sie diese Memberfunktion auf, um zu bestimmen, ob das angegebene Felddatenmemm "nullable" ist (kann auf einen Nullwert festgelegt werden; C++ NULL ist nicht identisch mit Null, was in der Datenbankterminologie "keinen Wert hat" bedeutet.

Hinweis

Wenn Sie das Massenabrufen von Zeilen implementiert haben, können Sie nicht anrufen IsFieldNullable. Rufen Sie stattdessen die GetODBCFieldInfo Memberfunktion auf, um zu bestimmen, ob ein Feld auf einen Null-Wert festgelegt werden kann. Sie können jederzeit aufrufen GetODBCFieldInfo, unabhängig davon, ob Sie massenweise Zeilenabrufe implementiert haben. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Ein Feld, das nicht Null sein kann, muss einen Wert aufweisen. Wenn Sie versuchen, ein solches Feld beim Hinzufügen oder Aktualisieren eines Datensatzes auf Null festzulegen, lehnt die Datenquelle das Hinzufügen oder Aktualisieren ab und Update löst eine Ausnahme aus. Die Ausnahme tritt auf, wenn Sie anrufen Update, nicht, wenn Sie anrufen SetFieldNull.

Wird NULL für das erste Argument der Funktion verwendet, wird die Funktion nur auf Felder angewendet, nicht param auf outputColumn Felder. Beispielsweise der Anruf

SetFieldNull(NULL);

werden nur outputColumn Felder auf NULL; param Felder werden nicht betroffen sein.

Um an param Feldern zu arbeiten, müssen Sie die tatsächliche Adresse der Person param angeben, an der Sie arbeiten möchten, z. B.:

SetFieldNull(&m_strParam);

Dies bedeutet, dass Sie nicht alle param Felder NULLfestlegen können, wie sie mit outputColumn Feldern möglich sind.

IsFieldNullable wird über DoFieldExchange implementiert.

CRecordset::IsOpen

Bestimmt, ob das Recordset bereits geöffnet ist.

BOOL IsOpen() const;

Rückgabewert

Nonzero, wenn die Recordset-Objekt Open - oder Requery Memberfunktion zuvor aufgerufen wurde und das Recordset nicht geschlossen wurde, andernfalls 0.

CRecordset::m_hstmt

Enthält ein Handle zur ODBC-Anweisungsdatenstruktur des Typs HSTMT, der dem Recordset zugeordnet ist.

Hinweise

Jede Abfrage an eine ODBC-Datenquelle ist mit einer HSTMT.

Achtung

Verwenden Sie nicht, m_hstmt bevor Open sie aufgerufen wurde.

Normalerweise müssen Sie nicht direkt auf die HSTMT Anweisung zugreifen, aber möglicherweise benötigen Sie ihn für die direkte Ausführung von SQL-Anweisungen. Die ExecuteSQL Memberfunktion der Klasse CDatabase stellt ein Beispiel für die Verwendung m_hstmtvon .

CRecordset::m_nFields

Enthält die Anzahl der Felddatenmber in der Recordsetklasse; d. h. die Anzahl der Spalten, die vom Recordset aus der Datenquelle ausgewählt wurden.

Hinweise

Der Konstruktor für die Recordsetklasse muss mit der richtigen Zahl initialisiert werden m_nFields . Wenn Sie das Massenabrufen von Zeilen nicht implementiert haben, wird diese Initialisierung für Sie geschrieben, ClassWizard wenn Sie sie zum Deklarieren der Recordset-Klasse verwenden. Sie können sie auch manuell schreiben.

Das Framework verwendet diese Zahl, um die Interaktion zwischen den Felddatenelementen und den entsprechenden Spalten des aktuellen Datensatzes in der Datenquelle zu verwalten.

Achtung

Diese Zahl muss der Anzahl der in oder DoBulkFieldExchange nach einem Aufruf SetFieldType mit dem Parameter CFieldExchange::outputColumnregistrierten DoFieldExchange Ausgabespalten entsprechen.

Sie können Spalten dynamisch binden, wie im Artikel "Recordset: Dynamically Binding Data Columns" erläutert. Wenn Sie dies tun, müssen Sie die Anzahl m_nFields erhöhen, um die Anzahl der RFX- oder Bulk RFX-Funktionsaufrufe in Ihrer DoFieldExchange oder DoBulkFieldExchange Memberfunktion für die dynamisch gebundenen Spalten widerzuspiegeln.

Weitere Informationen finden Sie in den Artikeln Recordset: Dynamically Binding Data Columns (ODBC) und Recordset: Fetching Records in Bulk (ODBC).

Beispiel

siehe Datensatzfeldaustausch: Verwenden von RFX.

CRecordset::m_nParams

Enthält die Anzahl der Parameterdatenmber in der Recordsetklasse; d. h. die Anzahl der Parameter, die mit der Abfrage des Recordsets übergeben werden.

Hinweise

Wenn die Recordset-Klasse Parameterdatenmmber enthält, muss der Konstruktor für die Klasse mit der richtigen Zahl initialisiert werden m_nParams . Der Standardwert m_nParams ist 0. Wenn Sie Parameterdatenmmber hinzufügen (die Sie manuell ausführen müssen), müssen Sie auch manuell eine Initialisierung im Klassenkonstruktor hinzufügen, um die Anzahl der Parameter widerzuspiegeln (die mindestens so groß sein müssen wie die Anzahl der Platzhalter in Ihrer m_strFilter oder m_strSort Zeichenfolge).

Das Framework verwendet diese Zahl, wenn sie die Abfrage des Recordsets parametrisiert.

Achtung

Diese Zahl muss der Anzahl von "Params" entsprechen, die in DoFieldExchange oder DoBulkFieldExchange nach einem Aufruf SetFieldType mit einem Parameterwert von CFieldExchange::inputParam, , CFieldExchange::param, CFieldExchange::outputParamoder CFieldExchange::inoutParam.

Beispiel

Weitere Informationen finden Sie in den Artikeln Recordset: Parametrisieren eines Recordset -Objekts (ODBC) und Record Field Exchange: Using RFX.

CRecordset::m_pDatabase

Enthält einen Zeiger auf das CDatabase Objekt, über das das Recordset mit einer Datenquelle verbunden ist.

Hinweise

Diese Variable wird auf zwei Arten festgelegt. Normalerweise übergeben Sie einen Zeiger an ein bereits verbundenes CDatabase Objekt, wenn Sie das Recordset-Objekt erstellen. Wenn Sie stattdessen übergeben NULL , CRecordset wird ein CDatabase Objekt für Sie erstellt und eine Verbindung hergestellt. In beiden Fällen CRecordset wird der Zeiger in dieser Variablen gespeichert.

Normalerweise müssen Sie den in der Datei gespeicherten m_pDatabaseZeiger nicht direkt verwenden. Wenn Sie jedoch eigene Erweiterungen CRecordsetschreiben, müssen Sie möglicherweise den Zeiger verwenden. Sie benötigen z. B. den Zeiger, wenn Sie eigene CDBExceptions auslösen. Oder Sie benötigen es möglicherweise, wenn Sie etwas mit demselben CDatabase Objekt ausführen müssen, z. B. ausführen von Transaktionen, Festlegen von Timeouts oder Aufrufen der ExecuteSQL Memberfunktion der Klasse CDatabase , um SQL-Anweisungen direkt auszuführen.

CRecordset::m_strFilter

Nachdem Sie das Recordset-Objekt erstellt haben, aber bevor Sie die Open Memberfunktion aufrufen, verwenden Sie dieses Datenelement, um eine CString sql-Klausel WHERE zu speichern.

Hinweise

Das Recordset verwendet diese Zeichenfolge zum Einschränken (oder Filtern) der Datensätze, die es während des Open Aufrufs Requery auswählt. Dies ist nützlich für die Auswahl einer Teilmenge von Datensätzen, z. B. "alle Vertriebsmitarbeiter, die in Kalifornien ansässig sind" ("State = CA"). Die ODBC-SQL-Syntax für eine WHERE Klausel lautet

WHERE search-condition

Schließen Sie die WHERE Schlüsselwort (keyword) nicht in die Zeichenfolge ein. Das Framework liefert es.

Sie können ihre Filterzeichenfolge auch parametrisieren, indem Sie darin Platzhalter "" platzieren, ein Parameterdatenmemm in Ihrer Klasse für jeden Platzhalter deklarieren und Parameter zur Laufzeit an das Recordset übergeben. Auf diese Weise können Sie den Filter zur Laufzeit erstellen. Weitere Informationen finden Sie unter "Recordset: Parametrisieren eines Recordset (ODBC)".

Weitere Informationen zu SQL-Klauseln WHERE finden Sie unter SQL. Weitere Informationen zum Auswählen und Filtern von Datensätzen finden Sie unter "Recordset: Filtering Records (ODBC)".

Beispiel

CCustomer rsCustSet(&m_dbCust);

// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");

// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));

CRecordset::m_strSort

Nachdem Sie das Recordset-Objekt erstellt haben, aber bevor Sie die Open Memberfunktion aufrufen, verwenden Sie dieses Datenelement, um eine CString sql-Klausel ORDER BY zu speichern.

Hinweise

Das Recordset verwendet diese Zeichenfolge, um die datensätze zu sortieren, die er während des Open Aufrufs auswählt Requery . Sie können dieses Feature verwenden, um ein Recordset nach einer oder mehreren Spalten zu sortieren. Die ODBC-SQL-Syntax für eine ORDER BY Klausel lautet

ORDER BY sort-specification [, sort-specification]...

Dabei handelt es sich bei einer Sortierspezifikation um eine ganze Zahl oder einen Spaltennamen. Sie können auch aufsteigende oder absteigende Reihenfolge angeben (die Reihenfolge ist standardmäßig aufsteigend), indem Sie "ASC" oder "DESC" an die Spaltenliste in der Sortierzeichenfolge anfügen. Die ausgewählten Datensätze werden zuerst nach der ersten aufgelisteten Spalte, dann nach der zweiten und so weiter sortiert. Sie können z. B. ein Recordset "Customers" nach Nachnamen und dann nach dem Vornamen bestellen. Die Anzahl der Spalten, die Sie auflisten können, hängt von der Datenquelle ab. Weitere Informationen finden Sie im Windows SDK.

Schließen Sie die ORDER BY Schlüsselwort (keyword) nicht in die Zeichenfolge ein. Das Framework liefert es.

Weitere Informationen zu SQL-Klauseln finden Sie unter SQL. Weitere Informationen zum Sortieren von Datensätzen finden Sie unter "Recordset: Sorting Records (ODBC)".

Beispiel

CCustomer rsCustSet(&m_dbCust);

// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");

// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));

CRecordset::Move

Verschiebt den aktuellen Datensatzzeiger innerhalb des Recordsets vorwärts oder rückwärts.

virtual void Move(
    long nRows,
    WORD wFetchType = SQL_FETCH_RELATIVE);

Parameter

nRows
Die Anzahl der Zeilen, die vorwärts oder rückwärts verschoben werden sollen. Positive Werte bewegen sich nach vorne bis zum Ende des Recordsets. Negative Werte bewegen sich rückwärts, zum Anfang.

wFetchType
Bestimmt das rowset, das Move abgerufen wird. Einzelheiten finden Sie unter "Hinweise".

Hinweise

Wenn Sie einen Wert von 0 für nRows, Move aktualisiert den aktuellen Datensatz; Move beendet den aktuellen AddNew oder Edit Modus und stellt den Wert des aktuellen Datensatzes vor AddNew oder Edit aufgerufen wieder her.

Hinweis

Wenn Sie durch ein Recordset navigieren, können Sie gelöschte Datensätze nicht überspringen. Weitere Informationen finden Sie unter CRecordset::IsDeleted. Wenn Sie einen CRecordset mit dem skipDeletedRecords Optionssatz öffnen, wird bestätigt, Move ob der nRows Parameter 0 ist. Dieses Verhalten verhindert die Aktualisierung von Zeilen, die von anderen Clientanwendungen mit denselben Daten gelöscht werden. dwOptionOpen Eine Beschreibung von skipDeletedRecords.

Move positioniert das Recordset nach Rowsets. Basierend auf den Werten für nRows und wFetchType, Move ruft das entsprechende Rowset ab und macht dann den ersten Datensatz in diesem Rowset zum aktuellen Datensatz. Wenn Sie das Massenabrufen von Zeilen nicht implementiert haben, ist die Rowsetgröße immer 1. Beim Abrufen eines Rowsets ruft die Memberfunktion direkt aufCheckRowsetError, um fehler zu behandeln, Move die sich aus dem Abruf ergeben.

Abhängig von den übergebenen Werten Move entspricht dies anderen CRecordset Memberfunktionen. Insbesondere kann der Wert wFetchType einer Memberfunktion angeben, die intuitiver und häufig die bevorzugte Methode zum Verschieben des aktuellen Datensatzes ist.

In der folgenden Tabelle sind die möglichen Werte für wFetchType, das Rowset aufgeführt, das Move basierend auf wFetchType und und nRows, und jeder entsprechenden Memberfunktion, die entspricht wFetchType.

wFetchType Abgerufenes Rowset Gleichwertige Memberfunktion
SQL_FETCH_RELATIVE (Standardwert) Das Rowset, das die Zeile(n) aus der ersten Zeile im aktuellen Rowset beginnt nRows .
SQL_FETCH_NEXT Das nächste Rowset; nRows wird ignoriert. MoveNext
SQL_FETCH_PRIOR Das vorherige Rowset; nRows wird ignoriert. MovePrev
SQL_FETCH_FIRST Das erste Rowset im Recordset; nRows wird ignoriert. MoveFirst
SQL_FETCH_LAST Das letzte vollständige Rowset im Recordset; nRows wird ignoriert. MoveLast
SQL_FETCH_ABSOLUTE Bei nRows> 0 beginnt das Rowset nRows ab dem Anfang des Recordsets. Wenn nRows< 0, beginnt das Rowset nRows zeile(n) vom Ende des Recordsets. If nRows = 0, then a beginning-of file (BOF) condition is returned. SetAbsolutePosition
SQL_FETCH_BOOKMARK Das Rowset beginnt mit der Zeile, deren Textmarkenwert dem nRowsentspricht. SetBookmark

Hinweis

Bei vorwärtsgeschützten Recordsets Move gilt nur der Wert für SQL_FETCH_NEXTwFetchType.

Achtung

Beim Aufrufen Move wird eine Ausnahme ausgelöst, wenn das Recordset keine Datensätze enthält. Um zu ermitteln, ob das Recordset Datensätze, Anrufe IsBOF und IsEOF.

Hinweis

Wenn Sie einen Bildlauf nach dem Anfang oder Ende des Recordsets (IsBOF oder IsEOF gibt nonzero zurück) verschoben haben, löst das Aufrufen einer Move Funktion möglicherweise ein CDBException. Wenn z. B IsEOF . "nonzero" zurückgegeben wird und IsBOF nicht, MoveNext wird eine Ausnahme ausgelöst, aber MovePrev nicht.

Hinweis

Wenn Sie anrufen Move , während der aktuelle Datensatz aktualisiert oder hinzugefügt wird, gehen die Updates ohne Warnung verloren.

Weitere Informationen zur Recordset-Navigation finden Sie in den Artikeln Recordset: Scrolling (ODBC) und Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset navigation, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC). Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information Verwandte Informationen finden Sie in der ODBC-API-Funktion SQLExtendedFetch im Windows SDK.

Beispiel

// rs is a CRecordset or a CRecordset-derived object

// Change the rowset size to 5
rs.SetRowsetSize(5);

// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);

// Move to the first record in the recordset
rs.MoveFirst();

// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);

rs.MoveFirst();
rs.MoveNext();

CRecordset::MoveFirst

Macht den ersten Datensatz im ersten Rowset zum aktuellen Datensatz.

void MoveFirst();

Hinweise

Unabhängig davon, ob massenweise Zeilenabrufe implementiert wurden, ist dies immer der erste Datensatz im Recordset.

Sie müssen nicht sofort anrufen MoveFirst , nachdem Sie das Recordset geöffnet haben. Zu diesem Zeitpunkt ist der erste Datensatz (sofern vorhanden) automatisch der aktuelle Datensatz.

Hinweis

Diese Memberfunktion ist für Vorwärtsrecordsets nicht gültig.

Hinweis

Wenn Sie durch ein Recordset navigieren, können Sie gelöschte Datensätze nicht überspringen. Details finden Sie in der IsDeleted Memberfunktion.

Achtung

Das Aufrufen einer der Move Funktionen löst eine Ausnahme aus, wenn das Recordset keine Datensätze enthält. Um zu ermitteln, ob das Recordset Datensätze, Anrufe IsBOF und IsEOF.

Hinweis

Wenn Sie eine der Move Funktionen aufrufen, während der aktuelle Datensatz aktualisiert oder hinzugefügt wird, gehen die Updates ohne Warnung verloren.

Weitere Informationen zur Recordset-Navigation finden Sie in den Artikeln Recordset: Scrolling (ODBC) und Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset navigation, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC). Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Beispiel

Sehen Sie sich das Beispiel für IsBOF.

CRecordset::MoveLast

Macht den ersten Datensatz im letzten vollständigen Rowset zum aktuellen Datensatz.

void MoveLast();

Hinweise

Wenn Sie das Massenabrufen von Zeilen nicht implementiert haben, weist das Recordset eine Rowsetgröße von 1 auf. Wechselt also MoveLast zum letzten Datensatz im Recordset.

Hinweis

Diese Memberfunktion ist für Vorwärtsrecordsets nicht gültig.

Hinweis

Wenn Sie durch ein Recordset navigieren, können Sie gelöschte Datensätze nicht überspringen. Details finden Sie in der IsDeleted Memberfunktion.

Achtung

Das Aufrufen einer der Move Funktionen löst eine Ausnahme aus, wenn das Recordset keine Datensätze enthält. Um zu ermitteln, ob das Recordset Datensätze, Anrufe IsBOF und IsEOF.

Hinweis

Wenn Sie eine der Move Funktionen aufrufen, während der aktuelle Datensatz aktualisiert oder hinzugefügt wird, gehen die Updates ohne Warnung verloren.

Weitere Informationen zur Recordset-Navigation finden Sie in den Artikeln Recordset: Scrolling (ODBC) und Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset navigation, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC). Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Beispiel

Sehen Sie sich das Beispiel für IsBOF.

CRecordset::MoveNext

Macht den ersten Datensatz im nächsten Rowset zum aktuellen Datensatz.

void MoveNext();

Hinweise

Wenn Sie das Massenabrufen von Zeilen noch nicht implementiert haben, verfügt das Recordset über eine Rowsetgröße von 1. Wechselt also MoveNext zum nächsten Datensatz.

Hinweis

Wenn Sie durch ein Recordset navigieren, können Sie gelöschte Datensätze nicht überspringen. Details finden Sie in der IsDeleted Memberfunktion.

Achtung

Das Aufrufen einer der Move Funktionen löst eine Ausnahme aus, wenn das Recordset keine Datensätze enthält. Um zu ermitteln, ob das Recordset Datensätze, Anrufe IsBOF und IsEOF.

Hinweis

Es wird auch empfohlen, vor dem Anruf anzurufen IsEOFMoveNext. Wenn Sie beispielsweise nach dem Ende des Recordsets scrollen, IsEOF wird "nonzero" zurückgegeben. Bei einem nachfolgenden Aufruf würde MoveNext eine Ausnahme ausgelöst.

Hinweis

Wenn Sie eine der Move Funktionen aufrufen, während der aktuelle Datensatz aktualisiert oder hinzugefügt wird, gehen die Updates ohne Warnung verloren.

Weitere Informationen zur Recordset-Navigation finden Sie in den Artikeln Recordset: Scrolling (ODBC) und Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset navigation, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC). Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Beispiel

Sehen Sie sich das Beispiel für IsBOF.

CRecordset::MovePrev

Macht den ersten Datensatz im vorherigen Rowset zum aktuellen Datensatz.

void MovePrev();

Hinweise

Wenn Sie das Massenabrufen von Zeilen nicht implementiert haben, weist das Recordset eine Rowsetgröße von 1 auf, sodass MovePrev sie zum vorherigen Datensatz wechselt.

Hinweis

Diese Memberfunktion ist für Vorwärtsrecordsets nicht gültig.

Hinweis

Wenn Sie durch ein Recordset navigieren, können Sie gelöschte Datensätze nicht überspringen. Details finden Sie in der IsDeleted Memberfunktion.

Achtung

Das Aufrufen einer der Move Funktionen löst eine Ausnahme aus, wenn das Recordset keine Datensätze enthält. Um zu ermitteln, ob das Recordset Datensätze, Anrufe IsBOF und IsEOF.

Hinweis

Es wird auch empfohlen, vor dem Anruf anzurufen IsBOFMovePrev. Wenn Sie z. B. vor dem Anfang des Recordsets scrollen, IsBOF wird "nonzero" zurückgegeben. Bei einem nachfolgenden Aufruf wird MovePrev eine Ausnahme ausgelöst.

Hinweis

Wenn Sie eine der Move Funktionen aufrufen, während der aktuelle Datensatz aktualisiert oder hinzugefügt wird, gehen die Updates ohne Warnung verloren.

Weitere Informationen zur Recordset-Navigation finden Sie in den Artikeln Recordset: Scrolling (ODBC) und Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset navigation, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC).For more information about recordset, see the articles Recordset: Scrolling (ODBC) and Recordset: Bookmarks and Absolute Positions (ODBC). Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Beispiel

Sehen Sie sich das Beispiel für IsBOF.

CRecordset::OnSetOptions

Wird aufgerufen, um Optionen (für die Auswahl verwendet) für die angegebene ODBC-Anweisung festzulegen.

virtual void OnSetOptions(HSTMT hstmt);

Parameter

hstmt
Die HSTMT ODBC-Anweisung, deren Optionen festgelegt werden sollen.

Hinweise

Aufrufen OnSetOptions zum Festlegen von Optionen (für die Auswahl verwendet) für die angegebene ODBC-Anweisung. Das Framework ruft diese Memberfunktion auf, um die anfänglichen Optionen für das Recordset festzulegen. OnSetOptions bestimmt die Unterstützung der Datenquelle für bildlauffähige Cursor und für die Parallelität des Cursors und legt die Optionen des Recordsets entsprechend fest. (Während OnSetOptions für Auswahlvorgänge verwendet wird, OnSetUpdateOptions wird sie für Aktualisierungsvorgänge verwendet.)

Überschreiben OnSetOptions , um Optionen festzulegen, die für den Treiber oder die Datenquelle spezifisch sind. Wenn Ihre Datenquelle z. B. das Öffnen für exklusiven Zugriff unterstützt, können Sie diese Möglichkeit außer Kraft setzen OnSetOptions .

Weitere Informationen zu Cursorn finden Sie unter ODBC.

CRecordset::OnSetUpdateOptions

Wird aufgerufen, um Optionen (bei Aktualisierung verwendet) für die angegebene ODBC-Anweisung festzulegen.

virtual void OnSetUpdateOptions(HSTMT hstmt);

Parameter

hstmt
Die HSTMT ODBC-Anweisung, deren Optionen festgelegt werden sollen.

Hinweise

Aufrufen OnSetUpdateOptions zum Festlegen von Optionen (bei Aktualisierung verwendet) für die angegebene ODBC-Anweisung. Das Framework ruft diese Memberfunktion auf, nachdem eine HSTMT Datensatzaktualisierung in einem Recordset erstellt wurde. (Während OnSetOptions für Auswahlvorgänge verwendet wird, OnSetUpdateOptions wird für Aktualisierungsvorgänge verwendet.) OnSetUpdateOptions bestimmt die Unterstützung der Datenquelle für bildlauffähige Cursor und für die Parallelität des Cursors und legt die Optionen des Recordsets entsprechend fest.

Überschreiben OnSetUpdateOptions , um Optionen einer ODBC-Anweisung festzulegen, bevor diese Anweisung für den Zugriff auf eine Datenbank verwendet wird.

Weitere Informationen zu Cursorn finden Sie unter ODBC.

CRecordset::Open

Öffnet das Recordset, indem die Tabelle abgerufen oder die vom Recordset darstellte Abfrage durchgeführt wird.

virtual BOOL Open(
    UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
    LPCTSTR lpszSQL = NULL,
    DWORD dwOptions = none);

Parameter

nOpenType
Übernehmen Sie den Standardwert, AFX_DB_USE_DEFAULT_TYPEoder verwenden Sie einen der folgenden Werte aus dem enum OpenType:

  • CRecordset::dynaset Ein Recordset mit bidirektionalem Bildlauf. Durch das Öffnen des Recordsets wird die Mitgliedschaft und Sortierung der Datensätze bestimmt, aber änderungen, die von anderen Benutzern an den Datenwerten vorgenommen wurden, sind nach einem Abrufvorgang sichtbar. Dynasets sind auch als keysetgesteuerte Recordsets bekannt.

  • CRecordset::snapshot Ein statisches Recordset mit bidirektionalem Bildlauf. Beim Öffnen des Recordsets wird die Mitgliedschaft und Sortierung der Datensätze bestimmt. Durch das Abrufen eines Datensatzes werden die Datenwerte bestimmt. Änderungen, die von anderen Benutzern vorgenommen wurden, werden erst angezeigt, wenn das Recordset geschlossen und dann erneut geöffnet wird.

  • CRecordset::dynamic Ein Recordset mit bidirektionalem Bildlauf. Die von anderen Benutzern an der Mitgliedschaft, der Reihenfolge und den Datenwerten vorgenommen Änderungen sind nach einem Abrufvorgang sichtbar. Viele ODBC-Treiber unterstützen diese Art von Recordset nicht.

  • CRecordset::forwardOnly Ein schreibgeschütztes Recordset mit nur Vorwärtslauf.

    For CRecordset, the default value is CRecordset::snapshot. Mithilfe des Standardwertmechanismus kann bei Visual C++-Assistenten mit ODBC-CRecordset sowie DAO- CDaoRecordset, die über unterschiedliche Standardwerte verfügen, interagiert werden.

Weitere Informationen zu diesen Recordsettypen finden Sie unter Recordset (ODBC).For more information about these recordset types, see Recordset (ODBC). Verwandte Informationen finden Sie unter "Verwenden von Block- und Bildlaufcursorn" im Windows SDK.

Achtung

Wenn der angeforderte Typ nicht unterstützt wird, löst das Framework eine Ausnahme aus.

lpszSQL
Eine Zeichenfolge, in der eines der folgenden Elemente enthalten ist:

  • Ein NULL Zeiger.

  • Name der Tabelle

  • Eine SQL-Anweisung SELECT (optional mit einer SQL- oder ORDER BY KlauselWHERE).

  • Eine CALL Anweisung, die den Namen einer vordefinierten Abfrage (gespeicherte Prozedur) angibt. Achten Sie darauf, keine Leerzeichen zwischen der geschweiften Klammer und dem CALL Schlüsselwort (keyword) einzufügen.

Weitere Informationen zu dieser Zeichenfolge finden Sie in der Tabelle und in der Diskussion der Rolle von ClassWizard im Abschnitt "Hinweise ".

Hinweis

Die Reihenfolge der Spalten in Ihrem Resultset muss mit der Reihenfolge der RFX- oder Bulk RFX-Funktionsaufrufe in Ihrer DoFieldExchange Oder DoBulkFieldExchange Funktionsüberschreibung übereinstimmen.

dwOptions
Eine Bitmaske, die eine Kombination der unten aufgeführten Werte angeben kann. Einige davon schließen sich einander aus. Der Standardwert ist none.

  • CRecordset::none Es sind keine Optionen festgelegt. Dieser Parameterwert und alle anderen Werte schließen einander aus. Das Recordset kann standardmäßig mit Edit neuen Datensätzen aktualisiert werden oder Delete ermöglicht das Anfügen neuer Datensätze mit AddNew. Die Updatability hängt von der Datenquelle und der nOpenType von Ihnen angegebenen Option ab. Optimierung für Massenzufügungen ist nicht verfügbar. Das Abrufen von Massenzeilen wird nicht implementiert. Gelöschte Datensätze werden während der Datensatznavigation nicht übersprungen. Lesezeichen sind nicht verfügbar. Automatische Überprüfung fehlerhafter Felder wird implementiert.

  • CRecordset::appendOnly Lassen Sie das Recordset nicht zu Edit oder Delete verwenden Sie sie. Lassen Sie nur AddNew zu. Diese Option und CRecordset::readOnly schließen einander aus.

  • CRecordset::readOnly Öffnen Sie das Recordset als schreibgeschützt. Diese Option und CRecordset::appendOnly schließen einander aus.

  • CRecordset::optimizeBulkAdd Verwenden Sie eine vorbereitete SQL-Anweisung, um das Hinzufügen vieler Datensätze gleichzeitig zu optimieren. Gilt nur, wenn Sie die ODBC-API-Funktion SQLSetPos nicht zum Aktualisieren des Recordsets verwenden. Das erste Update bestimmt die geänderten Felder. Diese Option und CRecordset::useMultiRowFetch schließen einander aus.

  • CRecordset::useMultiRowFetch Implementieren Sie massenweises Abrufen von Zeilen, damit mehrere Zeilen in einem einzigen Abrufvorgang abgerufen werden können. Dies ist ein erweitertes Feature, das die Leistung verbessert. Massendatensatzfeldaustausch wird jedoch nicht von ClassWizard. Diese Option und CRecordset::optimizeBulkAdd schließen einander aus. Wenn Sie angeben CRecordset::useMultiRowFetch, wird die Option CRecordset::noDirtyFieldCheck automatisch aktiviert (doppelter Puffer ist nicht verfügbar). Bei vorwärtsgeschützten Recordsets wird die Option CRecordset::useExtendedFetch automatisch aktiviert. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

  • CRecordset::skipDeletedRecords Überspringen Sie alle gelöschten Datensätze, wenn Sie durch das Recordset navigieren. Das verlangsamt in bestimmten relativen Abrufen die Leistung. Diese Option ist für Vorwärtsrecordsets nicht gültig. Wenn Sie den MovenRows-Parameter aufrufen, der auf 0 festgelegt ist, und der CRecordset::skipDeletedRecords Optionssatz wird Move bestätigt. CRecordset::skipDeletedRecordsähnelt dem Packen des Treibers, was bedeutet, dass gelöschte Zeilen aus dem Recordset entfernt werden. Wenn Ihr Treiber jedoch Datensätze packt, werden nur die Datensätze übersprungen, die Sie löschen. Es überspringt datensätze, die von anderen Benutzern gelöscht wurden, während das Recordset geöffnet ist. CRecordset::skipDeletedRecords überspringt Zeilen, die von anderen Benutzern gelöscht wurden.

  • CRecordset::useBookmarks Kann Lesezeichen für das Recordset verwenden, falls unterstützt. Lesezeichen verlangsamen den Datenabruf, verbessern aber die Leistung bei der Datennavigation. In forward-only-Recordsets ist das ungültig. Weitere Informationen finden Sie unter Recordset: Bookmarks and Absolute Positions (ODBC).For more information, see Recordset: Bookmarks and Absolute Positions (ODBC).

  • CRecordset::noDirtyFieldCheckDeaktivieren Sie die automatische modifiziert Feldüberprüfung (doppelte Pufferung). Dadurch wird die Leistung verbessert; Sie müssen felder jedoch manuell als modifiziert markieren, indem Sie die SetFieldDirty Funktionen und SetFieldNull Memberfunktionen aufrufen. Die doppelte Pufferung in der Klasse CRecordset ähnelt der doppelten Pufferung in der Klasse CDaoRecordset. Allerdings CRecordsetkönnen Sie in einzelnen Feldern keine doppelte Pufferung aktivieren. Sie aktivieren sie entweder für alle Felder oder deaktivieren sie für alle Felder. Wenn Sie die Option CRecordset::useMultiRowFetchangeben, wird sie CRecordset::noDirtyFieldCheck automatisch aktiviert. Sie können jedoch nicht für Recordsets verwendet werden, SetFieldDirtySetFieldNull die massenweise Zeilenabrufe implementieren.

  • CRecordset::executeDirect Verwenden Sie keine vorbereitete SQL-Anweisung. Um die Leistung zu verbessern, geben Sie diese Option an, wenn die Requery Memberfunktion nie aufgerufen wird.

  • CRecordset::useExtendedFetch Anstelle SQLExtendedFetch von SQLFetch. Dies wurde für das Implementieren des gesammelten Abrufens von Zeilen in forward-only-Recordsets entworfen. Wenn Sie die Option für ein Forward-only-Recordset angeben, wird die CRecordset::useExtendedFetch Option CRecordset::useMultiRowFetch automatisch aktiviert.

  • CRecordset::userAllocMultiRowBuffers Der Benutzer weist Speicherpuffer für die Daten zu. Verwenden Sie diese Option, CRecordset::useMultiRowFetch wenn Sie Ihren eigenen Speicher zuordnen möchten. Andernfalls weist das Framework automatisch den erforderlichen Speicher zu. Weitere Informationen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC). Angabe CRecordset::userAllocMultiRowBuffers ohne Angabe CRecordset::useMultiRowFetch von Ergebnissen in einer fehlgeschlagenen Assertion.

Rückgabewert

Nonzero, wenn das CRecordset Objekt erfolgreich geöffnet wurde; andernfalls 0, wenn CDatabase::Open (wenn aufgerufen) 0 zurückgibt.

Hinweise

Sie müssen diese Memberfunktion zum Ausführen der vom Recordset definierten Abfrage aufrufen. Vor dem Aufrufen Openmüssen Sie das Recordset-Objekt erstellen.

Die Verbindung dieses Recordsets mit der Datenquelle hängt davon ab, wie Sie das Recordset vor dem Aufrufen Openerstellen. Wenn Sie ein CDatabase Objekt an den Recordsetkonstruktor übergeben, der nicht mit der Datenquelle verbunden wurde, versucht GetDefaultConnect diese Memberfunktion, das Datenbankobjekt zu öffnen. Wenn Sie NULL an den Recordset-Konstruktor übergeben, erstellt der Konstruktor ein CDatabase Objekt für Sie und Open versucht, das Datenbankobjekt zu verbinden. Ausführliche Informationen zum Schließen des Recordsets und der Verbindung unter diesen unterschiedlichen Umständen finden Sie unter Close.

Hinweis

Der Zugriff auf eine Datenquelle durch ein CRecordset-Objekt wird immer freigegeben. CDaoRecordset Im Gegensatz zur Klasse können Sie ein Objekt nicht verwendenCRecordset, um eine Datenquelle mit exklusivem Zugriff zu öffnen.

Wenn Sie eine Abfrage aufrufen Open, wählt in der Regel eine SQL-Anweisung SELECT Datensätze basierend auf den in der folgenden Tabelle gezeigten Kriterien aus.

Der Wert des Parameters lpszSQL. Die ausgewählten Datensätze werden von folgenden Aspekten bestimmt: Beispiel
NULL Die von GetDefaultSQL zurückgegebene Zeichenfolge.
SQL-Tabellenname Alle Spalten der Tabellenliste in DoFieldExchange oder DoBulkFieldExchange. "Customer"
Der vordefinierte Name der Abfrage (gespeicherten Prozedur) Die Spalten, zu denen die Abfrage per Definition zurückgibt. "{call OverDueAccts}"
SELECTSpaltenlistentabellenliste FROM Die angegebenen Spalten aus den angegebenen Tabellen. "SELECT CustId, CustName FROM

Customer"

Achtung

Fügen Sie keine zusätzliche Leerzeichen in Ihre SQL-Zeichenfolge ein. Wenn Sie z. B. Leerzeichen zwischen der geschweiften Klammer und dem CALL Schlüsselwort (keyword) einfügen, interpretiert MFC die SQL-Zeichenfolge als Tabellennamen falsch und integriert sie in eine SELECT Anweisung, wodurch eine Ausnahme ausgelöst wird. Wenn Ihre vordefinierte Abfrage einen Ausgabeparameter verwendet, fügen Sie keine Leerzeichen zwischen der geschweiften geschweiften Klammer und dem Symbol "" ein. Schließlich dürfen Sie vor der geschweiften Klammer in einer CALL Anweisung oder vor dem SELECT Schlüsselwort (keyword) in einer SELECT Anweisung keine Leerzeichen einfügen.

Die übliche Prozedur besteht darinNULL, Open an Open; in diesem Fall ruft GetDefaultSQL auf. Wenn Sie eine abgeleitete CRecordset Klasse verwenden, GetDefaultSQL wird der tabellenname(n) angegeben, in ClassWizarddem Sie angegeben haben. Sie können stattdessen andere Informationen im lpszSQL-Parameter angeben.

Unabhängig davon, was Sie übergeben, Open erstellt eine endgültige SQL-Zeichenfolge für die Abfrage (die Zeichenfolge kann SQL WHERE und ORDER BY Klauseln an die lpszSQL übergebene Zeichenfolge angefügt haben) und führt dann die Abfrage aus. Sie können die konstruierte Zeichenfolge untersuchen, indem Sie nach dem Aufrufen aufrufen GetSQLOpen. Weitere Informationen dazu, wie das Recordset eine SQL-Anweisung erstellt und Datensätze auswählt, finden Sie unter Recordset: How Recordsets Select Records (ODBC).

Die Felddatenmember der Recordset-Klasse sind an die Spalten der ausgewählten Daten gebunden. Falls Datensätze zurückgegeben werden, wird der erste Datensatz zum aktuellen Datensatz.

Wenn Sie Optionen für das Recordset festlegen möchten, z. B. einen Filter oder eine Sortierung, geben Sie diese an, nachdem Sie das Recordset-Objekt erstellt haben, aber bevor Sie aufrufen Open. Wenn Sie die Datensätze im Recordset aktualisieren möchten, nachdem das Recordset bereits geöffnet ist, rufen Sie auf Requery.

Weitere Informationen, einschließlich weiterer Beispiele, finden Sie unter Recordset (ODBC), Recordset: How Recordsets Select Records (ODBC) und Recordset: Creating and Closing Recordsets (ODBC).

Beispiel

Die folgenden Codebeispiele zeigen verschiedene Formen des Open Aufrufs.

// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived 
// objects

// Open rs using the default SQL statement, implement bookmarks, and turn 
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
   CRecordset::noDirtyFieldCheck);

// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));

// Accept all defaults
rsDefault.Open();

CRecordset::RefreshRowset

Aktualisiert die Daten und den Status einer Zeile im aktuellen Rowset.

void RefreshRowset(
    WORD wRow,
    WORD wLockType = SQL_LOCK_NO_CHANGE);

Parameter

wRow
Die 1-basierte Position einer Zeile im aktuellen Rowset. Dieser Wert kann zwischen Null und Größe des Rowsets liegen.

wLockType
Ein Wert, der angibt, wie die Zeile nach der Aktualisierung gesperrt wird. Einzelheiten finden Sie unter "Hinweise".

Hinweise

Wenn Sie für null einen Wert wRowübergeben, wird jede Zeile im Rowset aktualisiert.

Zur Verwendung RefreshRowsetmüssen Sie massenweises Abrufen von Zeilen implementiert haben, indem Sie die CRecordset::useMulitRowFetch Option in der Open Memberfunktion angeben.

RefreshRowset ruft die ODBC-API-Funktion SQLSetPosauf. Der wLockType Parameter gibt den Sperrstatus der Zeile an, nachdem SQLSetPos sie ausgeführt wurde. In der folgenden Tabelle werden die möglichen Werte für wLockType.

wLockType Beschreibung
SQL_LOCK_NO_CHANGE (Standardwert) Der Treiber oder die Datenquelle stellt sicher, dass sich die Zeile im gleichen gesperrten oder entsperrten Zustand befindet wie zuvor RefreshRowset aufgerufen wurde.
SQL_LOCK_EXCLUSIVE Der Treiber oder die Datenquelle sperrt die Zeile exklusiv. Nicht alle Datenquellen unterstützen diesen Sperrtyp.
SQL_LOCK_UNLOCK Der Treiber oder die Datenquelle entsperrt die Zeile. Nicht alle Datenquellen unterstützen diesen Sperrtyp.

Weitere Informationen finden SQLSetPosSie im Windows SDK. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

CRecordset::Requery

Erstellt ein Recordset neu (aktualisiert).

virtual BOOL Requery();

Rückgabewert

Nonzero, wenn das Recordset erfolgreich neu erstellt wurde; andernfalls 0.

Hinweise

Falls Datensätze zurückgegeben werden, wird der erste Datensatz zum aktuellen Datensatz.

Damit das Recordset die Ergänzungen und Löschungen widerspiegelt, die Sie oder andere Benutzer an der Datenquelle vornehmen, müssen Sie das Recordset durch Aufrufen Requeryneu erstellen. Wenn es sich bei dem Recordset um ein Dynaset handelt, werden automatisch Aktualisierungen angezeigt, die Sie oder andere Benutzer an ihren vorhandenen Datensätzen vornehmen (aber keine Ergänzungen). Wenn das Recordset ein Momentaufnahme ist, müssen Sie aufrufenRequery, um Bearbeitungen anderer Benutzer und Ergänzungen und Löschungen widerzuspiegeln.

Rufen Requery Sie für ein Dynaset oder eine Momentaufnahme jederzeit auf, wenn Sie das Recordset mithilfe eines neuen Filters oder einer neuen Sortierung oder neuer Parameterwerte neu erstellen möchten. Legen Sie die neue Filter- oder Sortiereigenschaft fest, indem Sie neue Werte zu m_strFilter und m_strSort vor dem Aufrufen Requeryzuweisen. Legen Sie neue Parameter fest, indem Sie parametern Datenmmber vor dem Aufrufen Requeryneue Werte zuweisen. Wenn die Filter- und Sortierzeichenfolgen unverändert sind, können Sie die Abfrage wiederverwenden, wodurch die Leistung verbessert wird.

Wenn der Versuch, das Recordset neu zu erstellen, fehlschlägt, wird das Recordset geschlossen. Bevor Sie aufrufen Requery, können Sie ermitteln, ob das Recordset durch Aufrufen der CanRestart Memberfunktion erneut abfragt werden kann. CanRestart garantiert nicht, dass dies Requery erfolgreich ist.

Achtung

Rufen Sie Requery erst an, nachdem Sie angerufen Openhaben.

Beispiel

In diesem Beispiel wird ein Recordset neu erstellt, um eine andere Sortierreihenfolge anzuwenden.

CCustomer rsCustSet(&m_dbCust);

// Open the recordset
rsCustSet.Open();

// Use the recordset ...

// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return;    // Unable to requery

if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));

CRecordset::SetAbsolutePosition

Positioniert das Recordset auf dem Datensatz, der der angegebenen Datensatznummer entspricht.

void SetAbsolutePosition(long nRows);

Parameter

nRows
Die 1-basierte Ordnungsposition für den aktuellen Datensatz im Recordset.

Hinweise

SetAbsolutePosition Verschiebt den aktuellen Datensatzzeiger basierend auf dieser Ordnungsposition.

Hinweis

Diese Memberfunktion ist für Vorwärtsrecordsets nicht gültig.

Bei ODBC-Recordsets bezieht sich eine absolute Positionseinstellung von 1 auf den ersten Datensatz im Recordset; Eine Einstellung von 0 bezieht sich auf die Position anfang der Datei (BOF).

Sie können auch negative Werte an SetAbsolutePosition. In diesem Fall wird die Position des Recordsets vom Ende des Recordsets ausgewertet. Verschiebt beispielsweise SetAbsolutePosition( -1 ) den aktuellen Datensatzzeiger auf den letzten Datensatz im Recordset.

Hinweis

Absolute Position soll nicht als Ersatzdatensatznummer verwendet werden. Lesezeichen sind weiterhin die empfohlene Methode zum Aufbewahren und Zurückgeben an eine bestimmte Position, da sich die Position eines Datensatzes ändert, wenn vorherige Datensätze gelöscht werden. Darüber hinaus können Sie nicht sicher sein, dass ein bestimmter Datensatz dieselbe absolute Position hat, wenn das Recordset erneut erstellt wird, da die Reihenfolge einzelner Datensätze innerhalb eines Recordsets nicht garantiert ist, es sei denn, er wird mit einer SQL-Anweisung mit einer SQL-Anweisung mit einer ORDER BY Klausel erstellt.

Weitere Informationen zur Recordsetnavigation und Textmarken finden Sie in den Artikeln Recordset: Scrolling (ODBC) und Recordset: Bookmarks and Absolute Positions (ODBC).

CRecordset::SetBookmark

Positioniert das Recordset auf dem Datensatz, der die angegebene Textmarke enthält.

void SetBookmark(const CDBVariant& varBookmark);

Parameter

varBookmark
Ein Verweis auf ein CDBVariant Objekt, das den Textmarkenwert für einen bestimmten Datensatz enthält.

Hinweise

Rufen Sie auf, um CanBookmarkzu ermitteln, ob Lesezeichen für das Recordset unterstützt werden. Um Lesezeichen verfügbar zu machen, wenn sie unterstützt werden, müssen Sie die CRecordset::useBookmarks Option im dwOptions Parameter der Open Memberfunktion festlegen.

Hinweis

Wenn Lesezeichen nicht unterstützt oder nicht verfügbar sind, führt der Aufruf SetBookmark zu einer Ausnahme, die ausgelöst wird. Textmarken werden für Vorwärtsrecordsets nicht unterstützt.

Rufen Sie zum ersten Abrufen der Textmarke für den aktuellen Datensatz auf, GetBookmarkwodurch der Textmarkenwert in einem CDBVariant Objekt gespeichert wird. Später können Sie zu diesem Datensatz zurückkehren, indem Sie den gespeicherten Textmarkenwert aufrufen SetBookmark .

Hinweis

Nach bestimmten Recordsetvorgängen sollten Sie die Textmarkenpersistenz vor dem Aufrufen SetBookmarküberprüfen. Wenn Sie beispielsweise eine Textmarke mit GetBookmark und dann aufrufen Requery, ist die Textmarke möglicherweise nicht mehr gültig. Rufen Sie CDatabase::GetBookmarkPersistence an, um zu überprüfen, ob Sie sicher anrufen SetBookmarkkönnen.

Weitere Informationen zur Textmarken- und Recordsetnavigation finden Sie in den Artikeln Recordset: Bookmarks and Absolute Positions (ODBC) und Recordset: Scrolling (ODBC).

CRecordset::SetFieldDirty

Kennzeichnet ein Felddatenelement des Recordsets als geändert oder unverändert.

void SetFieldDirty(void* pv, BOOL bDirty = TRUE);

Parameter

pv
Enthält die Adresse eines Felddatenelements im Recordset oder NULL. Wenn NULLalle Felddatenmber im Recordset gekennzeichnet sind. (C++ NULL ist nicht mit Null in der Datenbankterminologie identisch, was bedeutet, dass "kein Wert vorhanden" ist.)

bDirty
TRUEwenn das Felddatenmemm als "modifiziert" gekennzeichnet werden soll (geändert). AndernfallsFALSE, wenn das Felddatenmemm als "sauber" gekennzeichnet werden soll (unverändert).

Hinweise

Das Markieren von Feldern als unverändert stellt sicher, dass das Feld nicht aktualisiert wird und zu weniger SQL-Datenverkehr führt.

Hinweis

Diese Memberfunktion gilt nicht für Recordsets, die Massenzeilenabrufe verwenden. Wenn Sie das Massenabrufen von Zeilen implementiert haben, führt dies SetFieldDirty zu einer fehlgeschlagenen Assertion. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Das Framework kennzeichnet geänderte Felddatenmber, um sicherzustellen, dass sie vom RFX-Mechanismus (Record Field Exchange) in den Datensatz in die Datenquelle geschrieben werden. Wenn Sie den Wert eines Felds ändern, wird das Feld in der Regel automatisch modifiziert festgelegt, sodass Sie sich selten selbst aufrufen SetFieldDirty müssen, aber Sie möchten manchmal sicherstellen, dass Spalten explizit aktualisiert oder eingefügt werden, unabhängig davon, welcher Wert sich im Felddatenmemm befindet.

Achtung

Rufen Sie diese Memberfunktion nur auf, nachdem Sie aufgerufen Edit oder AddNew.

Wird NULL für das erste Argument der Funktion verwendet, wird die Funktion nur auf Felder angewendet, nicht param auf outputColumn Felder. Beispielsweise der Anruf

SetFieldNull(NULL);

werden nur outputColumn Felder auf NULL; param Felder werden nicht betroffen sein.

Um an param Feldern zu arbeiten, müssen Sie die tatsächliche Adresse der Person param angeben, an der Sie arbeiten möchten, z. B.:

SetFieldNull(&m_strParam);

Dies bedeutet, dass Sie nicht alle param Felder NULLfestlegen können, wie sie mit outputColumn Feldern möglich sind.

CRecordset::SetFieldNull

Flags a field data member of the recordset as Null (specifically having no value) or as non-Null.

void SetFieldNull(void* pv, BOOL bNull = TRUE);

Parameter

pv
Enthält die Adresse eines Felddatenelements im Recordset oder NULL. Wenn NULLalle Felddatenmber im Recordset gekennzeichnet sind. (C++ NULL ist nicht mit Null in der Datenbankterminologie identisch, was bedeutet, dass "kein Wert vorhanden" ist.)

bNull
Nonzero, wenn das Felddatenmemm als kein Wert (Null) gekennzeichnet werden soll. Andernfalls 0, wenn das Felddatenmemm als nicht null gekennzeichnet werden soll.

Hinweise

Wenn Sie einem Recordset einen neuen Datensatz hinzufügen, werden alle Felddatenmember anfangs auf einen Null-Wert festgelegt und als "modifiziert" gekennzeichnet (geändert). Wenn Sie einen Datensatz aus einer Datenquelle abrufen, weisen die Spalten entweder bereits Werte auf oder sind Null.

Hinweis

Rufen Sie diese Memberfunktion nicht für Recordsets auf, die massenweises Abrufen von Zeilen verwenden. Wenn Sie das Massenabrufen von Zeilen implementiert haben, führt der Aufruf SetFieldNull zu einer fehlgeschlagenen Assertion. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Wenn Sie explizit ein Feld des aktuellen Datensatzes als keinen Wert festlegen möchten, rufen SetFieldNullbNull Sie ihn auf, um es als Null zu TRUE kennzeichnen. Wenn ein Feld zuvor null markiert wurde und Sie ihm jetzt einen Wert zugeben möchten, legen Sie den neuen Wert fest. Sie müssen das Null-Flag nicht mit SetFieldNull. Rufen Sie auf, um IsFieldNullablezu bestimmen, ob das Feld Null sein darf.

Achtung

Rufen Sie diese Memberfunktion nur auf, nachdem Sie aufgerufen Edit oder AddNew.

Wird NULL für das erste Argument der Funktion verwendet, wird die Funktion nur auf Felder angewendet, nicht param auf outputColumn Felder. Beispielsweise der Anruf

SetFieldNull(NULL);

werden nur outputColumn Felder auf NULL; param Felder werden nicht betroffen sein.

Um an param Feldern zu arbeiten, müssen Sie die tatsächliche Adresse der Person param angeben, an der Sie arbeiten möchten, z. B.:

SetFieldNull(&m_strParam);

Dies bedeutet, dass Sie nicht alle param Felder NULLfestlegen können, wie sie mit outputColumn Feldern möglich sind.

Hinweis

Beim Festlegen von Parametern auf Null führt ein Aufruf vor SetFieldNull dem Öffnen des Recordsets zu einer Assertion. Rufen Sie in diesem Fall auf SetParamNull.

SetFieldNull wird über DoFieldExchange.

CRecordset::SetLockingMode

Legt den Sperrmodus auf "optimistische" Sperre (Standardeinstellung) oder "pessimistische" Sperrung fest. Bestimmt, wie Datensätze für Updates gesperrt werden.

void SetLockingMode(UINT nMode);

Parameter

nMode
Enthält einen der folgenden Werte aus dem enum LockMode:

  • optimistic Optimistisches Sperren sperrt den Datensatz, der nur während des Anrufs Updateaktualisiert wird.

  • pessimistic Pessimistische Sperrung sperrt den Datensatz, sobald Edit er aufgerufen wird, und hält ihn gesperrt, bis der Update Anruf abgeschlossen ist oder Sie zu einem neuen Datensatz wechseln.

Hinweise

Rufen Sie diese Memberfunktion auf, wenn Sie angeben müssen, welche von zwei Datensatzsperrstrategien das Recordset für Updates verwendet. Standardmäßig ist optimisticder Sperrmodus eines Recordsets . Sie können dies in eine vorsichtigere pessimistic Sperrstrategie ändern. Rufen Sie SetLockingMode nach dem Erstellen und Öffnen des Recordset-Objekts auf, aber bevor Sie aufrufen Edit.

CRecordset::SetParamNull

Flags a parameter as Null (specifically having no value) or as non-Null.

void SetParamNull(
    int nIndex,
    BOOL bNull = TRUE);

Parameter

nIndex
Der nullbasierte Index des Parameters.

bNull
If TRUE (the default value), the parameter is flagged as Null. Andernfalls wird der Parameter als Nicht-Null gekennzeichnet.

Hinweise

Im Gegensatz dazu SetFieldNullkönnen Sie anrufen SetParamNull , bevor Sie das Recordset geöffnet haben.

SetParamNull wird in der Regel mit vordefinierten Abfragen (gespeicherte Prozeduren) verwendet.

CRecordset::SetRowsetCursorPosition

Verschiebt den Cursor in eine Zeile innerhalb des aktuellen Rowsets.

void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);

Parameter

wRow
Die 1-basierte Position einer Zeile im aktuellen Rowset. Dieser Wert kann zwischen 1 und der Größe des Rowsets liegen.

wLockType
Wert, der angibt, wie die Zeile nach der Aktualisierung gesperrt wird. Einzelheiten finden Sie unter "Hinweise".

Hinweise

Beim Implementieren des Massenvorgangs werden Datensätze von Rowsets abgerufen, wobei der erste Datensatz im abgerufenen Rowset der aktuelle Datensatz ist. Um einen weiteren Datensatz innerhalb des Rowsets zum aktuellen Datensatz zu machen, rufen Sie SetRowsetCursorPositionauf. Sie können z. B. mit der GetFieldValue Memberfunktion kombinierenSetRowsetCursorPosition, um die Daten dynamisch aus jedem Datensatz Ihres Recordsets abzurufen.

Zur Verwendung SetRowsetCursorPositionmüssen Sie das Massenabrufen von Zeilen implementiert haben, indem Sie die CRecordset::useMultiRowFetch Option des dwOptions Parameters in der Open Memberfunktion angeben.

SetRowsetCursorPosition ruft die ODBC-API-Funktion SQLSetPosauf. Der wLockType Parameter gibt den Sperrstatus der Zeile an, nachdem SQLSetPos sie ausgeführt wurde. In der folgenden Tabelle werden die möglichen Werte für wLockType.

wLockType Beschreibung
SQL_LOCK_NO_CHANGE (Standardwert) Der Treiber oder die Datenquelle stellt sicher, dass sich die Zeile im gleichen gesperrten oder entsperrten Zustand befindet wie zuvor SetRowsetCursorPosition aufgerufen wurde.
SQL_LOCK_EXCLUSIVE Der Treiber oder die Datenquelle sperrt die Zeile exklusiv. Nicht alle Datenquellen unterstützen diesen Sperrtyp.
SQL_LOCK_UNLOCK Der Treiber oder die Datenquelle entsperrt die Zeile. Nicht alle Datenquellen unterstützen diesen Sperrtyp.

Weitere Informationen finden SQLSetPosSie im Windows SDK. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

CRecordset::SetRowsetSize

Gibt die Anzahl der Datensätze an, die Sie während eines Abrufs abrufen möchten.

virtual void SetRowsetSize(DWORD dwNewRowsetSize);

Parameter

dwNewRowsetSize
Die Anzahl der Zeilen, die während eines bestimmten Abrufs abgerufen werden sollen.

Hinweise

Diese virtuelle Memberfunktion gibt an, wie viele Zeilen Sie während eines einzelnen Abrufs abrufen möchten, wenn Sie massenweises Abrufen von Zeilen verwenden. Um massenweises Abrufen von Zeilen zu implementieren, müssen Sie die CRecordset::useMultiRowFetch Option im dwOptions Parameter der Open Memberfunktion festlegen.

Hinweis

Das Aufrufen SetRowsetSize ohne Implementieren des Massenzeilenabrufs führt zu einer fehlgeschlagenen Assertion.

Rufen Sie den Aufruf SetRowsetSizeOpen auf, um zunächst die Rowsetgröße für das Recordset festzulegen. Die Standardmäßige Rowsetgröße bei der Implementierung von Massenzeilenabrufen ist 25.

Hinweis

Achten Sie beim Aufrufen SetRowsetSizeauf Vorsicht. Wenn Sie den Speicher für die Daten manuell zuordnen (wie durch die CRecordset::userAllocMultiRowBuffers Option des dwOptions-Parameters angegeben Open), sollten Sie überprüfen, ob Sie diese Speicherpuffer nach dem Aufruf SetRowsetSizeneu zuordnen müssen, aber bevor Sie einen Cursornavigationsvorgang ausführen.

Rufen Sie auf, um GetRowsetSizedie aktuelle Einstellung für die Rowsetgröße abzurufen.

Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

CRecordset::Update

Schließt einen AddNew Vorgang Edit ab, indem die neuen oder bearbeiteten Daten in der Datenquelle gespeichert werden.

virtual BOOL Update();

Rückgabewert

Nonzero, wenn ein Datensatz erfolgreich aktualisiert wurde; andernfalls 0, wenn keine Spalten geändert wurden. Wenn keine Datensätze aktualisiert wurden oder mehrere Datensätze aktualisiert wurden, wird eine Ausnahme ausgelöst. Eine Ausnahme wird auch für alle anderen Fehler in der Datenquelle ausgelöst.

Hinweise

Rufen Sie diese Memberfunktion nach einem Aufruf der AddNew Funktion oder Edit Memberfunktion auf. Dieser Aufruf ist erforderlich, um den AddNew Vorgang abzuschließen Edit .

Hinweis

Wenn Sie das Massenabrufen von Zeilen implementiert haben, können Sie nicht anrufen Update. Dies führt zu einer fehlgeschlagenen Assertion. Obwohl die Klasse CRecordset keinen Mechanismus zum Aktualisieren von Massenzeilen von Daten bereitstellt, können Sie ihre eigenen Funktionen mithilfe der ODBC-API-Funktion SQLSetPosschreiben. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Sowohl als Edit auch AddNew vorbereiten eines Bearbeitungspuffers, in dem die hinzugefügten oder bearbeiteten Daten zum Speichern in der Datenquelle platziert werden. Update speichert die Daten. Nur die Felder, die als geändert markiert oder erkannt wurden, werden aktualisiert.

Wenn die Datenquelle Transaktionen unterstützt, können Sie den Update Anruf (und den entsprechenden oder Edit den entsprechenden AddNew Aufruf) einer Transaktion tätigen. Weitere Informationen zu Transaktionen finden Sie unter Transaction (ODBC).For more information about transactions, see Transaction (ODBC).

Achtung

Wenn Sie anrufenUpdate, ohne zuerst entweder oder EditAddNew , Update löst ein CDBException. Wenn Sie anrufen AddNew oder Edit, müssen Sie vor dem Aufrufen eines Move Vorgangs oder vor dem Schließen des Recordsets oder der Datenquellenverbindung aufrufenUpdate. Andernfalls gehen Ihre Änderungen ohne Benachrichtigung verloren.

Ausführliche Informationen zum Behandeln von Update Fehlern finden Sie unter Recordset: How Recordsets Update Records (ODBC).

Beispiel

siehe Transaktion: Durchführen einer Transaktion in einem Recordset (ODBC).

Siehe auch

CObject-Klasse
Hierarchiediagramm
CDatabase-Klasse
CRecordView-Klasse