CRecordset::Open

 

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

Syntax

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

Parameter

  • nOpenType
    Übernehmen Sie den Standardwert, AFX_DB_USE_DEFAULT_TYPE, oder verwenden Sie einen der folgenden Werte aus enum OpenType:

    • CRecordset::dynaset   Ein Recordset mit bidirektionalem Bildlauf.  Die Mitgliedschaft und die Reihenfolge der Datensätze werden beim Öffnen des Recordsets bestimmt. Die von anderen Benutzern an den Datenwerten vorgenommenen Änderungen sind nach einem Abrufvorgang allerdings sichtbar.  Dynasets sind auch als keysetgesteuerte Recordsets bekannt.  

    • CRecordset::snapshot   Ein statisches Recordset mit bidirektionalem Bildlauf.  Die Mitgliedschaft und die Reihenfolge der Datensätze werden beim Öffnen des Recordsets und die Datenwerte beim Abrufen der Datensätze bestimmt.  Die von anderen Benutzern vorgenommenen Änderungen sind nicht sichtbar, bis das Recordset geschlossen und 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.  Beachten Sie, dass dieser Recordsettyp von vielen ODBC-Treibern nicht unterstützt wird.  

    • CRecordset::forwardOnly   Ein schreibgeschütztes Recordset, bei dem der Bildlauf ausschließlich vorwärts ausgeführt wird.

      Der Standardwert für CRecordset ist CRecordset::snapshot.  Mithilfe des Standardwertmechanismus kann bei Visual C++-Assistenten mit ODBC-CRecordset sowie DAO- CDaoRecordset, die über unterschiedliche Standardwerte verfügen, interagiert werden.  

    Weitere Informationen über diese Recordsettypen finden Sie im Artikel Recordset (ODBC).  Weitere Informationen finden Sie im Artikel "Verwenden von Blocks und bildlauffähigen Cursorn" im Windows SDK.  

    Warnung

    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 SELECT-SQL-Anweisung (optional mit einer WHERE-SQL-Klausel oder einer ORDER BY-SQL-Klausel).

    • Eine den Namen einer vordefinierten Abfrage (gespeicherten Prozedur) angebenden CALL-Anweisung.  Achten Sie darauf, dass zwischen der geschweiften Klammer und dem CALL-Schlüsselwort keine Leerzeichen stehen.  

    Weitere Informationen zu dieser Zeichenfolge finden Sie in der Tabelle und der Diskussion über die Rolle von ClassWizard unter Hinweisen.

    Hinweis

    Die Reihenfolge der Spalten in einem Resultset muss der Reihenfolge der RFX- oder der Massen-RFX-Funktionsaufrufe in der DoFieldExchange oder der DoBulkFieldExchange-Funktionsüberschreibung entsprechen.

  • 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   Keine Optionen festgelegt.  Dieser Parameterwert und alle anderen Werte schließen einander aus.  Standardmäßig kann das Recordset mit Bearbeiten oder Löschen aktualisiert werden und ermöglicht das Anfügen von neuen Datensätzen mit AddNew.  Aktualisierbarkeit hängt von der Datenquelle sowie von der angegebenen nOpenType - Option ab.  Optimierung für Massenhinzufügeaktionen ist nicht verfügbar.  Das gesammelte Abrufen von Zeilen wird nicht implementiert.  Gelöschte Datensätze werden während der Recordsetnavigation nicht übersprungen.  Lesezeichen sind nicht verfügbar.  Automatische Überprüfung fehlerhafter Felder wird implementiert.  

    • CRecordset::appendOnly   Ermöglicht kein Bearbeiten oder Löschen im Recordset.  Lassen Sie nur AddNew zu.  Diese Option und CRecordset::readOnly schließen einander aus.  

    • CRecordset::readOnly   Schreibgeschütztes Öffnen des Recordsets.  Diese Option und CRecordset::appendOnly schließen einander aus.  

    • CRecordset::optimizeBulkAdd   Verwenden Sie zum Optimieren des Hinzufügevorgangs bei vielen Datensätze auf einmal eine vorbereitete SQL-Anweisung.  Gilt nur, wenn Sie nicht die ODBC-API-Funktion SQLSetPos zum Aktualisieren des Recordsets verwenden.  Das erste Update bestimmt die geänderten Felder.  Diese Option und CRecordset::useMultiRowFetch schließen einander aus.  

    • CRecordset::useMultiRowFetch   Implementieren Sie das gesammelte Abrufen von Zeilen, damit mehrere Zeilen in einem Abrufvorgang abgerufen werden können.  Das ist eine erweiterte Funktion, die zum Verbessern der Leistung entworfen wurde. Allerdings wird der Massenaustausch von Datensatzfeldern von ClassWizard nicht unterstützt.  Diese Option und CRecordset::optimizeBulkAdd schließen einander aus.  Beachten Sie, dass bei der Angabe von CRecordset::useMultiRowFetch die CRecordset::noDirtyFieldCheck-Option automatisch aktiviert wird (doppelte Pufferung ist nicht verfügbar). Bei forward-only-Recordsets wird die Option CRecordset::useExtendedFetch automatisch aktiviert.  Weitere Informationen über das gesammelte Abrufen von Zeilen finden Sie im Artikel Recordset: Abrufen von Datensätzen in einer Sammeloperation (ODBC).  

    • CRecordset::skipDeletedRecords   Überspringen Sie bei der Navigation durch das Recordset alle gelöschten Datensätze.  Das verlangsamt in bestimmten relativen Abrufen die Leistung.  Diese Option ist bei forward-only-Recordsets ungültig.  Wenn Sie Verschieben mit dem auf 0 (null) festgelegten nRows-Parameter und der aktivierten CRecordset::skipDeletedRecords-Option aufrufen, wird Verschieben bestätigt.  Beachten Sie, dass CRecordset::skipDeletedRecords der Treiberverpackung ähnelt, d. h., dass vom Recordset gelöschte Zeilen entfernt werden.  Wenn der Treiber allerdings Datensätze verpackt, werden nur die von Ihnen gelöschten Datensätze übersprungen. Die von anderen Benutzern gelöschten Datensätze werden nicht übersprungen, solange das Recordset geöffnet ist.  CRecordset::skipDeletedRecords überspringt die von anderen Benutzern gelöschten Zeilen.  

    • CRecordset::useBookmarks   Verwendet möglicherweise Lesezeichen in den Recordset, sofern dies unterstützt wird.  Lesezeichen verlangsamen den Datenabruf, verbessern aber die Leistung bei der Datennavigation.  In forward-only-Recordsets ist das ungültig.  Weitere Informationen finden Sie im Artikel Recordset: Lesezeichen und absolute Positionen (ODBC).  

    • CRecordset::noDirtyFieldCheck   Deaktivieren der automatischen Überprüfung fehlerhafter Felder (doppelte Pufferung).  Dadurch wird die Leistung verbessert. Sie müssen allerdings Felder manuell als geändert kennzeichnen, indem Sie die Memberfunktionen SetFieldDirty und SetFieldNull aufrufen. Beachten Sie, dass die doppelte Pufferung in der CRecordset-Klasse der doppelten Pufferung in der CDaoRecordset-Klasse ähnelt.  Bei CRecordset können Sie die doppelte Pufferung allerdings nicht für einzelne Felder aktivieren. Sie können sie für alle Felder aktivieren oder deaktivieren.  Beachten Sie, dass Sie die Option CRecordset::useMultiRowFetch angeben. Dann wird CRecordset::noDirtyFieldCheck automatisch aktiviert. Allerdings können SetFieldDirty und SetFieldNull nicht in Recordsets eingesetzt werden, in denen das gesammelte Abrufen von Zeilen implementiert wird.  

    • CRecordset::executeDirect   Verwenden Sie keine vorbereitete SQL-Anweisung.  Zum Verbessern der Leistung geben Sie diese Option an, sofern die Requery-Memberfunktion nicht aufgerufen wird.  

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

    • CRecordset::userAllocMultiRowBuffers   Der Benutzer wird den Daten Speicherpuffer zuordnen.  Verwenden Sie diese Option in Verbindung mit CRecordset::useMultiRowFetch, wenn Sie Ihren eigenen Speicher zuordnen möchten. Andernfalls ordnet wird der notwendigen Speicher vom Framework automatisch zugeordnet.  Weitere Informationen finden Sie im Artikel Recordset: Abrufen von Datensätzen in einer Sammeloperation (ODBC).  Beachten Sie, dass die Angabe von CRecordset::userAllocMultiRowBuffers ohne die Angabe von CRecordset::useMultiRowFetch einen Assert-Fehler zur Folge hat.  

Rückgabewert

Ungleich 0 (null), wenn das CRecordset-Objekt erfolgreich geöffnet wurde; andernfalls 0 (null), wenn von CDatabase::Open (sofern aufgerufen) 0 (null) zurückgegeben wird.

Hinweise

Sie müssen diese Memberfunktion zum Ausführen der vom Recordset definierten Abfrage aufrufen.  Sie müssen das Recordset-Objekt vor Aufruf von Öffnen konstruiert haben.  

Die Verbindung des Recordsets mit der Datenquelle hängt von der Erstellung des Recordsets vor dem Aufruf von Öffnen ab.  Wenn Sie ein CDatabase-Objekt an den Recordsetkonstruktor übergeben, der nicht mit der Datenquelle verbunden wurde, wird von dieser Memberfunktion GetDefaultConnect für den Versuch, ein Datenbankobjekt zu öffnen, verwendet.  Wenn Sie NULL an den Recordsetkonstruktor übergeben, wird der Konstruktor ein CDatabase-Objekt für Sie konstruieren und Öffnen wird versuchen, eine Verbindung mit dem Datenbankobjekt herzustellen.  Ausführliche Informationen zum Schließen des Recordsets und der Verbindung in diesen unterschiedlichen Situationen finden Sie unter Schließen.  

Hinweis

Der Zugriff auf eine Datenquelle durch ein CRecordset-Objekt wird immer freigegeben.  Anders als die CDaoRecordset-Klasse können Sie kein CRecordset-Objekt zum Öffnen einer Datenquelle mit exklusivem Zugriff verwenden.  

Beim Aufruf von Öffnen wird eine Abfrage, normalerweise eine SELECT-SQL-Anweisung Datensätze auf Grundlage der Kriterien in der folgenden Tabelle ausgewählt.

Der Wert des lpszSQL-Parameters.

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 Spaltenliste FROM Tabellenliste

Die angegebenen Spalten aus den angegebenen Tabellen.

"SELECT CustId, CustName FROM

Customer"

Warnung

Achten Sie darauf, dass keine zusätzlichen Leerzeichen in der SQL-Zeichenfolge eingefügt werden.  Wenn Sie zum Beispiel Leerzeichen zwischen der geschweiften Klammer und dem CALL-Schlüsselwort einfügen, interpretiert MFC die SQL-Zeichenfolge falsch als Tabellenname und bindet sie in eine SELECT-Anweisung ein, wodurch eine Ausnahme ausgelöst wird.  Entsprechend sollten Sie bei Verwendung eines Ausgabeparameters für eine vordefinierte Abfrage keine Leerzeichen zwischen der geschweiften Klammer und dem "?"-Symbol einfügen.  Schließlich dürfen Sie in einer CALL-Anweisung oder dem SELECT-Schlüsselwort in einer SELECT-Anweisung keine Leerzeichen vor der geschweiften Klammer einfügen.  

Bei der üblichen Vorgehensweise wird NULL an Öffnen übergeben. In diesem Fall wird mit Öffnen GetDefaultSQL aufgerufen.  Bei Verwendung einer abgeleiteten CRecordset-Klasse gibt GetDefaultSQL den bzw. die den von Ihnen in ClassWizard angegebenen Tabellennamen an.  Sie können stattdessen andere Informationen im lpszSQL-Parameter angeben.  

Öffnen konstruiert für jede Übergabe eine endgültige SQL-Anweisung für die Abfrage (bei der Zeichenfolge sind möglicherweise die SQL-Klauseln WHERE und ORDER BY an die von Ihnen übergebene lpszSQL-Zeichenfolge angefügt) und führt dann die Abfrage aus.  Sie können die erstellte Zeichenfolge überprüfen, indem Sie GetSQL aufrufen, nachdem Sie Öffnen aufgerufen haben.  Weitere Informationen über die Konstruktionsweise einer SQL-Anweisung und die Auswahl von Datensätzen durch das Recordset finden Sie im Artikel Recordset: Datensatzauswahl durch Recordsets (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, wie einen Filter oder eine Sortierung festlegen möchten, geben Sie diese nach der Konstruktion des Recordset-Objekts, aber vor dem Aufruf von Öffnen an.  Wenn Sie die Datensätze im Recordset nach Öffnen des Recordset aktualisieren möchten, rufen Sie Erneut abfragen auf.  

Weitere Informationen und Beispiele finden Sie in den Artikeln Recordset (ODBC), Recordset: Datensatzauswahl durch Recordsets (ODBC) und Recordset: Erstellen und Schließen von Recordsets (ODBC).

Ausnahmen

Exception

Condition

Diese Methode kann Ausnahmen des Typs CDBException* und CMemoryException* auszulösen.

Beispiel

In den folgenden Codebeispielen werden verschiedenen Formen des Öffnen-Aufrufs veranschaulicht.

// 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();

Anforderungen

Header: afxdb.h

Siehe auch

CRecordset Class
Hierarchiediagramm
CRecordset::CRecordset
CRecordset::Close
CRecordset::GetDefaultSQL
CRecordset::GetSQL
CRecordset::m_strFilter
CRecordset::m_strSort
CRecordset::Requery