CRecordset
-Klasse
Stellt eine Gruppe von Datensätzen dar, die aus einer Datenquelle ausgewählt wurden.
class CRecordset : public CObject
Name | Beschreibung |
---|---|
CRecordset::CRecordset |
Erstellt ein CRecordset -Objekt. Die abgeleitete Klasse muss einen Konstruktor bereitstellen, der diese Klasse aufruft. |
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. |
Name | Beschreibung |
---|---|
CRecordset::m_hstmt |
Enthält das ODBC-Anweisungshandle für das Recordset. Geben Sie HSTMT ein. |
CRecordset::m_nFields |
Enthält die Anzahl der Felddatenmber im Recordset. Geben Sie UINT ein. |
CRecordset::m_nParams |
Enthält die Anzahl der Parameterdatenmmber im Recordset. Geben Sie UINT ein. |
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. |
Als "Recordsets" CRecordset
bezeichnete Objekte werden in der Regel in zwei Formen verwendet: Dynasets und Momentaufnahmen. Ein Dynaset bleibt mit Datenaktualisierungen synchronisiert, die von anderen Benutzern vorgenommen wurden. Eine 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) anstelle der ODBC-Klassen (Open Database Connectivity) arbeiten, verwenden Sie stattdessen die Klasse CDaoRecordset
. 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 ODBC-Datenquelle (Open Database Connectivity) ab und ob Sie massenweises Abrufen 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 Momentaufnahmen finden Sie in den Artikeln Dynaset und Snapshot.
CRecordset
Header: afxdb.h
Bereiten Sie sich auf das Hinzufügen eines neuen Datensatzes zur Tabelle vor.
virtual void AddNew();
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 SQLSetPos
schreiben. 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 AddNew
die 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 Update
werden geänderte Werte in den Felddatenelementen in der Datenquelle gespeichert.
Achtung
Wenn Sie vor dem Aufrufen Update
zu 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 AddNew
an.
Hinweis
Bei Dynasets werden dem Recordset neue Datensätze als letzter Datensatz hinzugefügt. Hinzugefügte Datensätze werden nicht zu Momentaufnahmen hinzugefügt. Sie müssen aufrufen Requery
, 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).
siehe Transaktion: Durchführen einer Transaktion in einem Recordset (ODBC).
Bestimmt, ob mit dem zuvor geöffneten Recordset neue Datensätze hinzugefügt werden können.
BOOL CanAppend() const;
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.
Bestimmt, ob mit dem Recordset Datensätze mithilfe von Lesezeichen markiert werden können.
BOOL CanBookmark() const;
Nonzero, wenn das Recordset Lesezeichen unterstützt; andernfalls 0.
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).
Fordert an, dass die Datenquelle entweder einen asynchronen Vorgang in Bearbeitung oder einen Prozess aus einem zweiten Thread abbricht.
void Cancel();
Die MFC ODBC-Klassen verwenden keine asynchrone Verarbeitung mehr; um einen asynchronen Vorgang auszuführen, müssen Sie die ODBC-API-Funktion SQLSetConnectOption
direkt aufrufen. Weitere Informationen finden Sie unter "Asynchrones Ausführen von Funktionen" im ODBC SDK-Programmierhandbuch.
Bricht alle ausstehenden Updates ab, die durch einen Edit
Vorgang AddNew
verursacht werden, bevor Update
sie aufgerufen wird.
void CancelUpdate();
Hinweis
Diese Memberfunktion gilt nicht für Recordsets, die massenweises Abrufen von Zeilen verwenden, da solche Recordsets weder aufrufen Edit
AddNew
Update
noch 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 Überprüfung des geänderten Felds aktiviert ist, werden die Membervariablen auf die Werte wiederhergestellt, CancelUpdate
die sie zuvor Edit
hatten oder AddNew
aufgerufen wurden. Andernfalls bleiben alle Wertänderungen erhalten. Standardmäßig ist die automatische Feldüberprüfung aktiviert, wenn das Recordset geöffnet wird. Zum Deaktivieren müssen Sie den CRecordset::noDirtyFieldCheck
dwOptions
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).
Bestimmt, ob das Recordset das Neustarten der Abfrage (zum Aktualisieren der Datensätze) durch Aufrufen der Requery
Memberfunktion zulässt.
BOOL CanRestart() const;
Nonzero, wenn requery zulässig ist; andernfalls 0.
Bestimmt, ob das Recordset einen Bildlauf zulässt.
BOOL CanScroll() const;
Nonzero, wenn das Recordset Bildlauf zulässt; andernfalls 0.
Weitere Informationen zum Scrollen finden Sie unter Recordset: Scrolling (ODBC).For more information about scrolling, see Recordset: Scrolling (ODBC).
Bestimmt, ob das Recordset Transaktionen zulässt.
BOOL CanTransact() const;
Nonzero, wenn das Recordset Transaktionen zulässt; andernfalls 0.
Weitere Informationen finden Sie unter Transaction (ODBC).For more information, see Transaction (ODBC).
Bestimmt, ob das Recordset aktualisiert werden kann.
BOOL CanUpdate() const;
Nonzero, wenn das Recordset aktualisiert werden kann; andernfalls 0.
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.
Wird aufgerufen, um Fehler zu behandeln, die beim Abrufen von Datensätzen generiert wurden.
virtual void CheckRowsetError(RETCODE nRetCode);
nRetCode
Eine ODBC-API-Funktion gibt Code zurück. Einzelheiten finden Sie unter "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.
CheckRowsetError
wird automatisch in einem Cursornavigationsvorgang, zOpen
Requery
. 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 SQLError abgerufen 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 SQLError abgerufen 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 SQLError
Sie 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
Schließt das Recordset.
virtual void Close();
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 Close
löschen Sie das C++-Recordset-Objekt, wenn es zugeordnet new
wurde.
Sie können nach dem Anruf Close
erneut anrufenOpen
. Auf diese Weise können Sie das Recordset-Objekt wiederverwenden. Die Alternative ist das Aufrufen Requery
von Anrufen.
// 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
Erstellt ein CRecordset
-Objekt.
CRecordset(CDatabase* pDatabase = NULL);
pDatabase
Enthält einen Zeiger auf ein CDatabase
Objekt oder den Wert NULL
. Wenn die NULL
CDatabase
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.
Sie können eine anwendungsspezifische Klasse entweder direkt verwenden CRecordset
oder von CRecordset
dieser 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::CRecordset
auf, 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.
Weitere Informationen finden Sie unter "Recordset: Deklarieren einer Klasse für eine Tabelle (ODBC)".
Löscht den aktuellen Datensatz.
virtual void Delete();
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 SQLSetPos
schreiben. 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 Delete
ein 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.
Dieses Beispiel zeigt ein Recordset, das im Rahmen einer Funktion erstellt wurde. Im Beispiel wird davon ausgegangen, dass m_dbCust
eine 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();
Wird aufgerufen, um Massenzeilen von Daten aus der Datenquelle in das Recordset auszutauschen. Implementiert Massendatensatzfeldaustausch (Bulk RFX).
virtual void DoBulkFieldExchange(CFieldExchange* pFX);
pFX
Ein Zeiger auf ein CFieldExchange
-Objekt. Das Framework hat dieses Objekt bereits eingerichtet, um einen Kontext für den Feldaustauschvorgang anzugeben.
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 CRecordset
erstellt 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
, Edit
oder Update
Delete
sie 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 SQLSetPos
schreiben.
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).
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);
pFX
Ein Zeiger auf ein CFieldExchange
-Objekt. Das Framework hat dieses Objekt bereits eingerichtet, um einen Kontext für den Feldaustauschvorgang anzugeben.
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 CRecordset
erstellt 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: Dynamisches Binden von Datenspalten (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 DoFieldExchange
finden Sie unter Record Field Exchange: How RFX Works. Allgemeine Informationen zu RFX finden Sie unter Record Field Exchange.
Ermöglicht Änderungen am aktuellen Datensatz.
virtual void Edit();
Nachdem Sie aufgerufen Edit
haben, 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 SQLSetPos
schreiben. 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::BeginTrans
Edit
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 Update
zu 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).
// 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!"));
}
Ruft den nächsten Resultset einer vordefinierten Abfrage (gespeicherte Prozedur) ab, wenn mehrere Resultsets vorhanden sind.
BOOL FlushResultSet();
Nonzero, wenn mehr Resultsets abgerufen werden sollen; andernfalls 0.
Sie sollten nur aufgerufen werden FlushResultSet
, wenn Sie mit dem Cursor im aktuellen Resultset fertig sind. Wenn Sie das nächste Resultset durch Aufrufen FlushResultSet
abrufen, ist der Cursor für diesen Resultset nicht gültig. Sie sollten die MoveNext
Memberfunktion nach dem Aufrufen FlushResultSet
aufrufen.
Wenn eine vordefinierte Abfrage einen Ausgabeparameter oder Eingabe-/Ausgabeparameter verwendet, müssen Sie aufrufen FlushResultSet
, bis sie zurückgegeben FALSE
wird (der Wert 0), um diese Parameterwerte abzurufen.
FlushResultSet
ruft die ODBC-API-Funktion SQLMoreResults
auf. Wenn SQLMoreResults
zurückgegeben SQL_ERROR
oder SQL_INVALID_HANDLE
, wird FlushResultSet
eine Ausnahme ausgelöst. Weitere Informationen finden SQLMoreResults
Sie im Windows SDK.
Ihre gespeicherte Prozedur muss gebundene Felder enthalten, wenn Sie aufrufen FlushResultSet
möchten.
Im folgenden Code wird davon ausgegangen, dass es sich um ein CRecordset
abgeleitetes 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();
Ruft den Textmarkenwert für den aktuellen Datensatz ab.
void GetBookmark(CDBVariant& varBookmark);
varBookmark
Ein Verweis auf ein CDBVariant
Objekt, das die Textmarke im aktuellen Datensatz darstellt.
Rufen Sie auf, um CanBookmark
zu 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 Requery
anrufenGetBookmark
, 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 SetBookmark
können.
Weitere Informationen zur Textmarken- und Recordsetnavigation finden Sie in den Artikeln Recordset: Bookmarks and Absolute Positions (ODBC) und Recordset: Scrolling (ODBC).
Wird aufgerufen, um die Standard-Verbindungszeichenfolge abzurufen.
virtual CString GetDefaultConnect();
A CString
that contains the default Verbindungszeichenfolge.
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, indem Sie die Version verwerfen ClassWizard
. Weitere Informationen zu Verbindungszeichenfolge finden Sie unter Data Source (ODBC).For more information about Verbindungszeichenfolge s, see Data Source (ODBC).
Wird aufgerufen, um die sql-Standardzeichenfolge abzurufen, die ausgeführt werden soll.
virtual CString GetDefaultSQL();
A CString
that contains the default SQL statement.
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 ClassWizard
und ClassWizard
diese Aufgabe für Sie ausführen.
Wenn Sie die SQL-Anweisungszeichenfolge für ihre eigene Verwendung benötigen, rufen Sie die GetSQL
SQL-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 GetDefaultSQL
Ihrer Klasse bearbeiten. Sie können z. B. einen Aufruf einer vordefinierten Abfrage mithilfe einer CALL
Anweisung angeben. (Beachten Sie jedoch, dass Sie beim Bearbeiten GetDefaultSQL
auch ä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 oder vor der geschweiften Klammer oder vor dem SELECT
Schlüsselwort in einer SELECT
Anweisung ein.
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);
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_TYPE
den 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.
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 CRecordset
haben, 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 CRecordset
mü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 SQLGetData
auf. 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 SQLGetData
Sie im Windows SDK.
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 CDaoRecordset
CRecordset
ist keine SetFieldValue
Memberfunktion vorhanden. Wenn Sie ein Objekt direkt CRecordset
erstellen, 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
Ruft die Gesamtanzahl der Felder in Ihrem Recordset -Objekt ab.
short GetODBCFieldCount() const;
Die Anzahl der Felder im Recordset.
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
Ruft Informationen zu den Feldern im Recordset ab.
void GetODBCFieldInfo(
LPCTSTR lpszName,
CODBCFieldInfo& fieldinfo);
void GetODBCFieldInfo(
short nIndex,
CODBCFieldInfo& fieldinfo);
lpszName
Der Name eines Felds.
fieldinfo
Ein Verweis auf eine CODBCFieldInfo
Struktur.
nIndex
Der nullbasierte Index des Felds.
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
Bestimmt die Größe des Recordsets.
long GetRecordCount() const;
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.
Achtung
Die Datensatzanzahl wird als "High Water Mark" beibehalten, der höchst nummerierte Datensatz, der noch angezeigt 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 MoveLast
nicht 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.
Ruft die aktuelle Einstellung für die Anzahl der Zeilen ab, die Sie während eines bestimmten Abrufs abrufen möchten.
DWORD GetRowsetSize() const;
Die Anzahl der Zeilen, die während eines bestimmten Abrufs abgerufen werden sollen.
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 SetRowsetSize
die 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
Bestimmt, wie viele Datensätze nach einem Abruf abgerufen wurden.
DWORD GetRowsFetched() const;
Die Anzahl der Zeilen, die nach einem bestimmten Abruf aus der Datenquelle abgerufen wurden.
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
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();
Ruft den Status für eine Zeile im aktuellen Rowset ab.
WORD GetRowStatus(WORD wRow) const;
wRow
Die 1-basierte Position einer Zeile im aktuellen Rowset. Dieser Wert kann zwischen 1 und der Größe des Rowsets liegen.
Ein Statuswert für die Zeile. Einzelheiten finden Sie unter "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 wRow keine Zeile . |
Weitere Informationen finden Sie in der ODBC-API-Funktion SQLExtendedFetch
im Windows SDK.
Bestimmt den Index des aktuellen Datensatzes im Recordset und ob der letzte Datensatz angezeigt wurde.
void GetStatus(CRecordsetStatus& rStatus) const;
rStatus
Ein Verweis auf ein CRecordsetStatus
-Objekt. Weitere Informationen finden Sie in den Hinweisen.
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ältAFX_CURRENT_RECORD_UNDEFINED
dieses Element (-2). WennIsBOF
TRUE (leeres Recordset oder Versuch, vor dem ersten Datensatz zu scrollen) ist,m_lCurrentRecord
wird der Wert aufAFX_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 aufrufenMoveNext
, bisIsEOF
nonzero zurückgegeben wird. Wenn dieses Element null ist, wird der Datensatz wie vonGetRecordCount
, wenn nicht -1 zurückgegeben, nur eine "Hohe Wassermarke" Anzahl der Datensätze sein.
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;
Ein const
Verweis auf ein CString
Objekt, das die SQL-Anweisung enthält.
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 Open
haben, mit dem Sie angegeben ClassWizard
haben, 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
.
Ruft den Namen der SQL-Tabelle ab, auf der die Abfrage des Recordsets basiert.
const CString& GetTableName() const;
Ein const
Verweis auf ein CString
Objekt, das den Tabellennamen enthält, wenn das Recordset auf einer Tabelle basiert; andernfalls eine leere Zeichenfolge.
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
.
Gibt "nonzero" zurück, wenn das Recordset vor dem ersten Datensatz positioniert wurde. Es gibt keinen aktuellen Datensatz.
BOOL IsBOF() const;
Nonzero, wenn das Recordset keine Datensätze enthält oder wenn Sie vor dem ersten Datensatz rückwärts gescrollt haben; andernfalls 0.
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 Open
einen 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.
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();
Bestimmt, ob der aktuelle Datensatz gelöscht wurde.
BOOL IsDeleted() const;
Nonzero, wenn das Recordset in einem gelöschten Datensatz positioniert ist; andernfalls 0.
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
Gibt "nonzero" zurück, wenn das Recordset nach dem letzten Datensatz positioniert wurde. Es gibt keinen aktuellen Datensatz.
BOOL IsEOF() const;
Nonzero, wenn das Recordset keine Datensätze enthält oder wenn Sie einen Bildlauf über den letzten Datensatz hinaus ausgeführt haben; andernfalls 0.
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 Open
einen 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 MoveNext
der 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.
Ein Beispiel hierfür finden Sie unter IsBOF
.
Bestimmt, ob das angegebene Felddatenmemm seit Edit
dem Aufruf geändert oder AddNew
aufgerufen wurde.
BOOL IsFieldDirty(void* pv);
pv
Ein Zeiger auf das Felddatenelement, dessen Status Sie überprüfen möchten, oder NULL
um festzustellen, ob eines der Felder geändert wurde.
Nonzero, wenn sich das angegebene Felddatenmemm seit dem Aufrufen AddNew
oder Edit
; andernfalls 0 geändert hat.
Die Daten in allen Elementen der schmutzigen Felddaten werden an den Datensatz in der Datenquelle übertragen, wenn der aktuelle Datensatz durch einen Aufruf der Update
Memberfunktion ( CRecordset
nach einem Aufruf von Edit
oder AddNew
) 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 vorheriger Aufrufe auf SetFieldDirty zurückgesetzt, da der geänderte Status des Felds neu ausgewertet wird. Wenn sich der AddNew
aktuelle Feldwert vom Pseudo-NULL-Wert unterscheidet, wird der Feldstatus geändert. Falls sich der Edit
Feldwert vom zwischengespeicherten Wert unterscheidet, wird der Feldstatus geändert.
IsFieldDirty
wird über DoFieldExchange
.
Weitere Informationen zum schmutzigen Flag finden Sie unter Recordset: How Recordsets Select Records (ODBC).
Gibt "nonzero" zurück, wenn das angegebene Feld im aktuellen Datensatz Null ist (hat keinen Wert).
BOOL IsFieldNull(void* pv);
pv
Ein Zeiger auf das Felddatenelement, dessen Status Sie überprüfen möchten, oder NULL
um zu bestimmen, ob eines der Felder Null ist.
Nonzero, wenn das angegebene Felddatenmemm als Null gekennzeichnet ist; andernfalls 0.
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
.
Gibt "nonzero" zurück, wenn das angegebene Feld im aktuellen Datensatz auf Null festgelegt werden kann (ohne Wert).
BOOL IsFieldNullable(void* pv);
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.
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 NULL
festlegen können, wie sie mit outputColumn
Feldern möglich sind.
IsFieldNullable
wird über DoFieldExchange implementiert.
Bestimmt, ob das Recordset bereits geöffnet ist.
BOOL IsOpen() const;
Nonzero, wenn die Recordset-Objekt Open
- oder Requery
Memberfunktion zuvor aufgerufen wurde und das Recordset nicht geschlossen wurde, andernfalls 0.
Enthält ein Handle zur ODBC-Anweisungsdatenstruktur des Typs HSTMT
, der dem Recordset zugeordnet ist.
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_hstmt
von .
Enthält die Anzahl der Felddatenmber in der Recordsetklasse; d. h. die Anzahl der Spalten, die vom Recordset aus der Datenquelle ausgewählt wurden.
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::outputColumn
registrierten 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).
siehe Datensatzfeldaustausch: Verwenden von RFX.
Enthält die Anzahl der Parameterdatenmber in der Recordsetklasse; d. h. die Anzahl der Parameter, die mit der Abfrage des Recordsets übergeben werden.
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::outputParam
oder CFieldExchange::inoutParam
.
Weitere Informationen finden Sie in den Artikeln Recordset: Parametrisieren eines Recordset -Objekts (ODBC) und Record Field Exchange: Using RFX.
Enthält einen Zeiger auf das CDatabase
Objekt, über das das Recordset mit einer Datenquelle verbunden ist.
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_pDatabase
Zeiger nicht direkt verwenden. Wenn Sie jedoch eigene Erweiterungen CRecordset
schreiben, müssen Sie möglicherweise den Zeiger verwenden. Sie benötigen z. B. den Zeiger, wenn Sie eigene CDBException
s 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.
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.
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 das WHERE
Schlüsselwort 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)".
CCustomer rsCustSet(&m_dbCust);
// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");
// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
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.
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 das ORDER BY
Schlüsselwort 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)".
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"));
Verschiebt den aktuellen Datensatzzeiger innerhalb des Recordsets vorwärts oder rückwärts.
virtual void Move(
long nRows,
WORD wFetchType = SQL_FETCH_RELATIVE);
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".
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. dwOption
Open
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 nRows entspricht. |
SetBookmark |
Hinweis
Bei vorwärtsgeschützten Recordsets Move
gilt nur der Wert für SQL_FETCH_NEXT
wFetchType
.
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.
// 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();
Macht den ersten Datensatz im ersten Rowset zum aktuellen Datensatz.
void MoveFirst();
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
Ein Beispiel hierfür finden Sie unter IsBOF
.
Macht den ersten Datensatz im letzten vollständigen Rowset zum aktuellen Datensatz.
void MoveLast();
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
Ein Beispiel hierfür finden Sie unter IsBOF
.
Macht den ersten Datensatz im nächsten Rowset zum aktuellen Datensatz.
void MoveNext();
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 IsEOF
MoveNext
. 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
Ein Beispiel hierfür finden Sie unter IsBOF
.
Macht den ersten Datensatz im vorherigen Rowset zum aktuellen Datensatz.
void MovePrev();
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 IsBOF
MovePrev
. 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
Ein Beispiel hierfür finden Sie unter IsBOF
.
Wird aufgerufen, um Optionen (für die Auswahl verwendet) für die angegebene ODBC-Anweisung festzulegen.
virtual void OnSetOptions(HSTMT hstmt);
hstmt
Die HSTMT
ODBC-Anweisung, deren Optionen festgelegt werden sollen.
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.
Wird aufgerufen, um Optionen (bei Aktualisierung verwendet) für die angegebene ODBC-Anweisung festzulegen.
virtual void OnSetUpdateOptions(HSTMT hstmt);
hstmt
Die HSTMT
ODBC-Anweisung, deren Optionen festgelegt werden sollen.
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.
Ö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);
nOpenType
Übernehmen Sie den Standardwert, AFX_DB_USE_DEFAULT_TYPE
oder 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 isCRecordset::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- oderORDER BY
KlauselWHERE
).Eine
CALL
Anweisung, die den Namen einer vordefinierten Abfrage (gespeicherte Prozedur) angibt. Achten Sie darauf, keine Leerzeichen zwischen der geschweiften Klammer und demCALL
Schlüsselwort 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 mitEdit
neuen Datensätzen aktualisiert werden oderDelete
ermöglicht das Anfügen neuer Datensätze mitAddNew
. Die Updatability hängt von der Datenquelle und dernOpenType
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 zuEdit
oderDelete
verwenden Sie sie. Lassen Sie nurAddNew
zu. Diese Option undCRecordset::readOnly
schließen einander aus.CRecordset::readOnly
Öffnen Sie das Recordset als schreibgeschützt. Diese Option undCRecordset::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-FunktionSQLSetPos
nicht zum Aktualisieren des Recordsets verwenden. Das erste Update bestimmt die geänderten Felder. Diese Option undCRecordset::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 vonClassWizard
. Diese Option undCRecordset::optimizeBulkAdd
schließen einander aus. Wenn Sie angebenCRecordset::useMultiRowFetch
, wird die OptionCRecordset::noDirtyFieldCheck
automatisch aktiviert (doppelter Puffer ist nicht verfügbar). Bei vorwärtsgeschützten Recordsets wird die OptionCRecordset::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 informationCRecordset::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 denMove
nRows-Parameter aufrufen, der auf 0 festgelegt ist, und derCRecordset::skipDeletedRecords
Optionssatz wirdMove
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::noDirtyFieldCheck
Deaktivieren Sie die automatische Überprüfung des geänderten Felds (doppelte Pufferung). Dadurch wird die Leistung verbessert; Sie müssen felder jedoch manuell als geändert markieren, indem Sie dieSetFieldDirty
Funktionen undSetFieldNull
Member aufrufen. Die doppelte Pufferung in der KlasseCRecordset
ähnelt der doppelten Pufferung in der KlasseCDaoRecordset
. AllerdingsCRecordset
kö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 OptionCRecordset::useMultiRowFetch
angeben, wird sieCRecordset::noDirtyFieldCheck
automatisch aktiviert. Sie können jedoch nicht für Recordsets verwendet werden,SetFieldDirty
SetFieldNull
die massenweise Zeilenabrufe implementieren.CRecordset::executeDirect
Verwenden Sie keine vorbereitete SQL-Anweisung. Um die Leistung zu verbessern, geben Sie diese Option an, wenn dieRequery
Memberfunktion nie aufgerufen wird.CRecordset::useExtendedFetch
AnstelleSQLExtendedFetch
vonSQLFetch
. 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 dieCRecordset::useExtendedFetch
OptionCRecordset::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). AngabeCRecordset::userAllocMultiRowBuffers
ohne AngabeCRecordset::useMultiRowFetch
von Ergebnissen in einer fehlgeschlagenen Assertion.
Nonzero, wenn das CRecordset
Objekt erfolgreich geöffnet wurde; andernfalls 0, wenn CDatabase::Open
(wenn aufgerufen) 0 zurückgibt.
Sie müssen diese Memberfunktion zum Ausführen der vom Recordset definierten Abfrage aufrufen. Vor dem Aufrufen Open
müssen Sie das Recordset-Objekt erstellen.
Die Verbindung dieses Recordsets mit der Datenquelle hängt davon ab, wie Sie das Recordset vor dem Aufrufen Open
erstellen. 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}" |
SELECT Spaltenlistentabellenliste 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 einfügen, interpretiert MFC die SQL-Zeichenfolge als Tabellennamen falsch und integriert sie in eine SELECT
Anweisung, was zu einer Ausnahme führt. 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 Anweisung oder vor dem SELECT
Schlüsselwort in einer CALL
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 ClassWizard
dem 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 GetSQL
Open
. 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).
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();
Aktualisiert die Daten und den Status einer Zeile im aktuellen Rowset.
void RefreshRowset(
WORD wRow,
WORD wLockType = SQL_LOCK_NO_CHANGE);
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".
Wenn Sie für null einen Wert wRow
übergeben, wird jede Zeile im Rowset aktualisiert.
Zur Verwendung RefreshRowset
mü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 SQLSetPos
auf. 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 SQLSetPos
Sie 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
Erstellt ein Recordset neu (aktualisiert).
virtual BOOL Requery();
Nonzero, wenn das Recordset erfolgreich neu erstellt wurde; andernfalls 0.
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 Requery
neu 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 es sich bei dem Recordset um eine Momentaufnahme handelt, müssen Sie aufrufen Requery
, um Bearbeitungen anderer Benutzer und Ergänzungen und Löschungen widerzuspiegeln.
Rufen Sie für ein Dynaset oder eine Momentaufnahme jederzeit auf Requery
, wenn Sie das Recordset mit einem neuen Filter oder einer neuen Sortierung oder neuen Parameterwerten 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 Requery
zuweisen. Legen Sie neue Parameter fest, indem Sie parametern Datenmmber vor dem Aufrufen Requery
neue 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 Open
haben.
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!"));
Positioniert das Recordset auf dem Datensatz, der der angegebenen Datensatznummer entspricht.
void SetAbsolutePosition(long nRows);
nRows
Die 1-basierte Ordnungsposition für den aktuellen Datensatz im Recordset.
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).
Positioniert das Recordset auf dem Datensatz, der die angegebene Textmarke enthält.
void SetBookmark(const CDBVariant& varBookmark);
varBookmark
Ein Verweis auf ein CDBVariant
Objekt, das den Textmarkenwert für einen bestimmten Datensatz enthält.
Rufen Sie auf, um CanBookmark
zu 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, GetBookmark
wodurch 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 SetBookmark
können.
Weitere Informationen zur Textmarken- und Recordsetnavigation finden Sie in den Artikeln Recordset: Bookmarks and Absolute Positions (ODBC) und Recordset: Scrolling (ODBC).
Kennzeichnet ein Felddatenelement des Recordsets als geändert oder unverändert.
void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
pv
Enthält die Adresse eines Felddatenelements im Recordset oder NULL
. Wenn NULL
alle Felddatenmber im Recordset gekennzeichnet sind. (C++ NULL
ist nicht mit Null in der Datenbankterminologie identisch, was bedeutet, dass "kein Wert vorhanden" ist.)
bDirty
TRUE
wenn das Felddatenmemm als "geändert" gekennzeichnet werden soll. Andernfalls FALSE
, wenn das Felddatenmember als "sauber" gekennzeichnet werden soll (unverändert).
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 geändert, sodass Sie sich selten selbst aufrufen SetFieldDirty
müssen, aber manchmal möchten Sie sicherstellen, dass Spalten explizit aktualisiert oder eingefügt werden, unabhängig davon, welcher Wert sich im Felddatenmemm befindet.
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 NULL
festlegen können, wie sie mit outputColumn
Feldern möglich sind.
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);
pv
Enthält die Adresse eines Felddatenelements im Recordset oder NULL
. Wenn NULL
alle 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.
Wenn Sie einem Recordset einen neuen Datensatz hinzufügen, werden zunächst alle Felddatenmember auf einen Null-Wert festgelegt und als "geändert" gekennzeichnet. 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 SetFieldNull
bNull
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 IsFieldNullable
zu bestimmen, ob das Feld Null sein darf.
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 NULL
festlegen 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
.
Legt den Sperrmodus auf "optimistische" Sperre (Standardeinstellung) oder "pessimistische" Sperrung fest. Bestimmt, wie Datensätze für Updates gesperrt werden.
void SetLockingMode(UINT nMode);
nMode
Enthält einen der folgenden Werte aus dem enum LockMode
:
optimistic
Optimistisches Sperren sperrt den Datensatz, der nur während des AnrufsUpdate
aktualisiert wird.pessimistic
Pessimistische Sperrung sperrt den Datensatz, sobaldEdit
er aufgerufen wird, und hält ihn gesperrt, bis derUpdate
Anruf abgeschlossen ist oder Sie zu einem neuen Datensatz wechseln.
Rufen Sie diese Memberfunktion auf, wenn Sie angeben müssen, welche von zwei Datensatzsperrstrategien das Recordset für Updates verwendet. Standardmäßig ist optimistic
der 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
.
Flags a parameter as Null (specifically having no value) or as non-Null.
void SetParamNull(
int nIndex,
BOOL bNull = TRUE);
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.
Im Gegensatz dazu SetFieldNull
können Sie anrufen SetParamNull
, bevor Sie das Recordset geöffnet haben.
SetParamNull
wird in der Regel mit vordefinierten Abfragen (gespeicherte Prozeduren) verwendet.
Verschiebt den Cursor in eine Zeile innerhalb des aktuellen Rowsets.
void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
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".
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 SetRowsetCursorPosition
auf. Sie können z. B. mit der GetFieldValue
Memberfunktion kombinierenSetRowsetCursorPosition
, um die Daten dynamisch aus jedem Datensatz Ihres Recordsets abzurufen.
Zur Verwendung SetRowsetCursorPosition
mü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 SQLSetPos
auf. 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 SQLSetPos
Sie 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
Gibt die Anzahl der Datensätze an, die Sie während eines Abrufs abrufen möchten.
virtual void SetRowsetSize(DWORD dwNewRowsetSize);
dwNewRowsetSize
Die Anzahl der Zeilen, die während eines bestimmten Abrufs abgerufen werden sollen.
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 SetRowsetSize
Open
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 SetRowsetSize
auf 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 SetRowsetSize
neu zuordnen müssen, aber bevor Sie einen Cursornavigationsvorgang ausführen.
Rufen Sie auf, um GetRowsetSize
die 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
Schließt einen AddNew
Vorgang Edit
ab, indem die neuen oder bearbeiteten Daten in der Datenquelle gespeichert werden.
virtual BOOL Update();
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.
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 SQLSetPos
schreiben. 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 Edit
AddNew
, 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).
siehe Transaktion: Durchführen einer Transaktion in einem Recordset (ODBC).
CObject
-Klasse
Hierarchiediagramm
CDatabase
-Klasse
CRecordView
-Klasse