Recordset: Datensatzauswahl durch Recordsets (ODBC)

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

In diesem Thema wird Folgendes erläutert:

  • Aufgaben und Optionen bei der Auswahl von Datensätzen.

  • Wie ein Recordset seine SQL-Anweisung zusammenstellt und Datensätze auswählt.

  • Anpassungsmöglichkeiten bei der Auswahl.

Recordsets wählen Datensätze aus einer Datenquelle aus, indem sie SQL-Anweisungen an einen ODBC-Treiber schicken. Welche SQL-Anweisungen übertragen werden, hängt davon ab, wie Sie die Recordset-Klasse entwerfen und öffnen.

Optionen bei der Auswahl von Datensätzen

Die folgende Tabelle zeigt, welche Optionen es bei der Auswahl von Datensätzen gibt.

Manipulation eines Recordsets

Wenn Sie

Können Sie

Eine Recordset-Klasse mit dem Assistenten zum Hinzufügen von Klassen deklarieren

Festlegen, aus welcher Tabelle die Datensätze ausgewählt werden sollen.

Angeben, welche Spalten aufgenommen werden.

Siehe Hinzufügen eines MFC-ODBC-Consumers.

Die Implementierung der Recordset-Klasse fertig stellen

Überschreiben Sie Memberfunktionen, z. B. OnSetOptions (weiterführendes Thema), um anwendungsspezifische Optionen einzustellen oder Standardwerte zu ändern. Geben Sie Parameterdatenmember an, falls Sie das Recordset parametrisieren möchten.

Ein Recordset-Objekt konstruieren (bevor Sie Open aufrufen)

Eine Suchbedingung (eventuell aus mehreren Einzelbedingungen zusammengesetzt) für eine WHERE-Klausel angeben, der die Datensätze filtert. Siehe Recordset: Filtern von Datensätzen (ODBC).

Eine Sortierreihenfolge für eine ORDER BY-Klausel angeben, mit der die Datensätze sortiert werden. Siehe Recordset: Sortieren von Datensätzen (ODBC).

Werte für alle Parameter angeben, die Sie der Klasse hinzugefügt haben. Siehe Recordset: Parametrisieren eines Recordsets (ODBC).

Die Abfrage des Recordsets durch Aufruf von Open ausführen

Eine benutzerdefinierte SQL-Zeichenfolge angeben, die die Standard-SQL-Zeichenfolge ersetzt, die vom Assistenten erstellt wurde. Siehe CRecordset::Open in der Class Library Reference und SQL: Anpassen der SQL-Anweisung eines Recordsets (ODBC).

Requery aufrufen, um das Recordset mit den neuesten Werten aus der Datenquelle zu aktualisieren

Neue Parameter angeben, filtern oder sortieren. Siehe Recordset: Erneutes Abfragen eines Recordsets (ODBC).

Wie ein Recordset seine SQL-Anweisung konstruiert

Wenn Sie die Open-Memberfunktion eines Recordset-Objekts aufrufen, erstellt Open eine SQL-Anweisung mit einigen oder allen der folgenden Bestandteile:

  • Der an Open übergebene lpszSQL-Parameter. Wenn er nicht NULL ist, enthält dieser Parameter eine benutzerdefinierte SQL-Zeichenfolge oder einen Teil davon. Das Framework durchsucht die Zeichenfolge. Falls es sich um eine SQL-SELECT-Anweisung oder eine ODBC-CALL-Anweisung handelt, verwendet das Framework diese Zeichenfolge als SQL-Anweisung des Recordsets. Wenn die Zeichenfolge nicht mit "SELECT" oder "{CALL" beginnt, verwendet das Framework die bereitgestellte Zeichenfolge zum Aufbau einer SQL-FROM-Klausel.

  • Die von GetDefaultSQL zurückgegebene Zeichenfolge. Standardmäßig ist dies der Name der Tabelle, die Sie im Assistenten für das Recordset ausgewählt hatten. Sie können den Rückgabewert der Funktion jedoch ändern. Das Framework ruft GetDefaultSQL auf. Wenn die Zeichenfolge nicht mit "SELECT" oder "{CALL" beginnt, wird sie als Tabellenname interpretiert, mit dem eine SQL-Zeichenfolge konstruiert wird.

  • Die Felddatenmember des Recordsets, die an bestimmte Spalten der Tabelle gebunden werden sollen. Das Framework bindet Datensatzspalten an die Adressen dieser Datenmember und setzt sie als Puffer ein. Das Framework stellt die Zuordnungsart zwischen Felddatenmembern und Tabellenspalten fest, und zwar anhand der RFX-Funktionsaufrufe oder RFX-Sammelfunktionsaufrufe der DoFieldExchange-Memberfunktion oder der DoBulkFieldExchange-Memberfunktion des Recordsets.

  • Der Filter des Recordsets, der (falls vorhanden) im m_strFilter-Datenmember angegeben ist. Das Framework konstruiert mit dieser Zeichenfolge eine SQL-WHERE-Klausel.

  • Die Sortierreihenfolge des Recordsets, die (falls vorhanden) im m_strSort-Datenmember angegeben ist. Das Framework konstruiert mit dieser Zeichenfolge eine SQL-ORDER BY-Klausel.

    Tipp

    Wenn Sie eine SQL-GROUP BY-Klausel und möglicherweise eine HAVING-Klausel verwenden möchten, hängen Sie diese Klauseln an das Ende der Filterzeichenfolge an.

  • Die Werte der Parameterdatenmember, die Sie für die Klasse angegeben haben. Parameterwerte stellen Sie unmittelbar vor dem Aufruf von Open oder Requery ein. Das Framework bindet die Parameterwerte an "?"-Platzhalter in der SQL-Zeichenfolge. Zur Kompilierungszeit geben Sie eine Zeichenfolge an, die Platzhalter enthält. Zur Laufzeit trägt das Framework die Details basierend auf den bereitgestellten Parameterwerten ein.

Open konstruiert hieraus eine SQL-SELECT-Anweisung. Details darüber, wie das Framework diese Elemente verarbeitet, finden Sie unter Anpassen der Auswahl.

Nach dem Konstruieren der Anweisung überträgt Open die SQL-Anweisung an den ODBC-Treiber-Manager (und die ODBC-Cursorbibliothek, falls diese geladen ist), der sie an den ODBC-Treiber für ein bestimmtes DBMS weitergibt. Der Treiber kommuniziert mit dem DBMS, um die Auswahl in der Datenquelle durchzuführen, und ruft den ersten Datensatz ab. Das Framework lädt den Datensatz in die Felddatenmember des Recordsets.

Sie können eine Kombination dieser Techniken verwenden, um Tabellen zu öffnen und eine Abfrage zu erstellen, die auf einem Join mehrerer Tabellen basiert. Durch eine erweiterte Anpassung können Sie auch vordefinierte Abfragen (gespeicherte Prozeduren) aufrufen, Tabellenspalten auswählen, die zur Entwurfszeit noch nicht bekannt waren, und diese an Recordsetfelder binden bzw. viele weitere Datenzugriffsaufgaben durchführen. Aufgaben, die Sie durch Anpassen der Recordsets nicht durchführen können, können dennoch durch den Aufruf von ODBC-API-Funktionen oder die direkte Ausführung von SQL-Anweisungen mit CDatabase::ExecuteSQL realisiert werden.

Anpassen der Auswahl

Neben dem Einsatz eines Filters, einer Sortierreihenfolge oder von Parametern können Sie die Auswahl des Recordsets mit folgenden Maßnahmen anpassen:

  • Übergeben Sie in lpszSQL eine benutzerdefinierte SQL-Zeichenfolge, wenn Sie die Open-Funktion für das Recordset aufrufen. Die in lpsqSQL übergebene Zeichenfolge hat eine höhere Priorität als diejenige, die von der GetDefaultSQL-Memberfunktion zurückgegeben wird.

    Weitere Informationen finden Sie unter SQL: Anpassen der SQL-Anweisung eines Recordsets (ODBC). Hier werden die Typen der SQL-Anweisungen (oder teilweisen Anweisungen) beschrieben, die Sie an Open übergeben können, und welche Operationen das Framework mit diesen Typen durchführt.

    Tipp

    Sofern die von Ihnen übergebene benutzerdefinierte Zeichenfolge nicht mit "SELECT" oder "{CALL" beginnt, interpretiert MFC sie als Tabellennamen. Dies gilt auch für das nächste Element in dieser Aufzählung.

  • Ändern Sie die Zeichenfolge, die der Assistent in die GetDefaultSQL-Memberfunktion des Recordsets geschrieben hat. Bearbeiten Sie im Quellcode der Funktion den Rückgabewert. Standardmäßig schreibt der Assistent eine GetDefaultSQL-Funktion, die einen einzigen Tabellennamen zurückgibt.

    Sie können GetDefaultSQL jedes der Elemente zurückgeben lassen, das Sie auch im lpszSQL-Parameter an Open übergeben können. Wenn Sie keine benutzerdefinierte SQL-Zeichenfolge in lpszSQL übergeben, verwendet das Framework die von GetDefaultSQL zurückgegebene Zeichenfolge. GetDefaultSQL muss zumindest den Namen einer einzigen Tabelle zurückgeben. Es können aber auch mehrere Tabellennamen zurückgegeben werden, eine vollständige SELECT-Anweisung, eine ODBC-CALL-Anweisung usw. Eine Liste aller Elemente, die Sie an lpszSQL übergeben können oder die GetDefaultSQL zurückgeben kann, finden Sie unter SQL: Anpassen der SQL-Anweisung eines Recordsets (ODBC).

    Falls Sie einen Join über zwei oder mehr Tabellen ausführen möchten, schreiben Sie GetDefaultSQL um, um die Tabellenliste in der SQL-FROM-Klausel anzupassen. Weitere Informationen hierzu finden Sie unter Recordset: Ausführen eines Joins (ODBC).

  • Binden Sie von Hand zusätzliche Felddatenmember, z. B. anhand von Informationen über das Schema der Datenquelle, die Sie erst zur Laufzeit ermitteln. Fügen Sie der Recordset-Klasse Felddatenmember hinzu, tragen Sie entsprechende RFX-Funktionsaufrufe oder RFX-Sammelfunktionsaufrufe in die DoFieldExchange-Memberfunktion oder DoBulkFieldExchange-Memberfunktion ein, und fügen Sie Initialisierungen der Datenmember im Klassenkonstruktor hinzu. Weitere Informationen finden Sie unter Recordset: Dynamisches Binden von Datenspalten (ODBC).

  • Überschreiben Sie Memberfunktionen der Recordset-Klasse, z. B. OnSetOptions, um anwendungsspezifische Optionen einzustellen oder Standardwerte zu überschreiben.

Wenn das Recordset auf einer komplexen SQL-Anweisung basieren soll, müssen Sie eine Kombination dieser Anpassungsmethoden verwenden. Beispiele für solche Verwendungszwecke sind das Verwenden von SQL-Klauseln und SQL-Schlüsselwörtern, die von Recordsets nicht direkt unterstützt werden, oder ein Join mehrerer Tabellen.

Siehe auch

Konzepte

Recordset (ODBC)

Recordset: Datensatzaktualisierung durch Recordsets (ODBC)

Grundlagen zu ODBC

SQL

Recordset: Sperren von Datensätzen (ODBC)