Share via


SQL: Anpassen der SQL-Anweisung ihres Recordsets (ODBC)

In diesem Thema wird Folgendes erläutert:

  • So erstellt das Framework eine SQL-Anweisung

  • So überschreiben Sie die SQL-Anweisung

Hinweis

Diese Informationen gelten für die MFC-ODBC-Klassen. Wenn Sie mit den MFC DAO-Klassen arbeiten, lesen Sie das Thema "Vergleich von Microsoft Jet Datenbank-Engine SQL und ANSI SQL" in der DAO-Hilfe.

SQL-Anweisungskonstruktion

Ihr Recordset basiert auf der Datensatzauswahl in erster Linie auf einer SQL SELECT-Anweisung. Wenn Sie Ihre Klasse mit einem Assistenten deklarieren, schreibt sie eine überschriebene Version der Memberfunktion, die GetDefaultSQL ungefähr wie folgt aussieht (für eine Recordsetklasse namens CAuthors).

CString CAuthors::GetDefaultSQL()
{
    return "AUTHORS";
}

Standardmäßig gibt diese Außerkraftsetzung den Tabellennamen zurück, den Sie mit dem Assistenten angegeben haben. Im Beispiel lautet der Tabellenname "AUTHORS". Wenn Sie die Memberfunktion des Recordsets Open später aufrufen, Open wird eine endgültige SELECT-Anweisung des Formulars erstellt:

SELECT rfx-field-list FROM table-name [WHERE m_strFilter]
       [ORDER BY m_strSort]

wird table-name durch Aufrufen GetDefaultSQL abgerufen und rfx-field-list von den RFX-Funktionsaufrufen in DoFieldExchangeabgerufen. Dies ist das, was Sie für eine SELECT-Anweisung erhalten, es sei denn, Sie ersetzen sie zur Laufzeit durch eine überschriebene Version, obwohl Sie die Standard-Anweisung auch mit Parametern oder einem Filter ändern können.

Hinweis

Wenn Sie einen Spaltennamen angeben, der Leerzeichen enthält (oder enthalten kann), müssen Sie den Namen in eckige Klammern einschließen. Der Name "Vorname" sollte z. B. "[Vorname]" sein.

Zum Überschreiben der SELECT-Standardanweisung übergeben Sie beim Aufrufen Openeine Zeichenfolge mit einer vollständigen SELECT-Anweisung. Anstatt eine eigene Standardzeichenfolge zu erstellen, verwendet das Recordset die von Ihnen angegebenen Zeichenfolge. Wenn Ihre Ersetzungsanweisung eine WHERE-Klausel enthält, geben Sie keinen Filter an m_strFilter , da Sie dann zwei Filteranweisungen haben würden. Wenn Ihre Ersetzungsanweisung eine ORDER BY-Klausel enthält, geben Sie auch keine Sortierung an m_strSort , sodass Sie nicht über zwei Sortieranweisungen verfügen.

Hinweis

Wenn Sie literale Zeichenfolgen in Ihren Filtern (oder anderen Teilen der SQL-Anweisung) verwenden, müssen Sie möglicherweise ein "Anführungszeichen" (eingeschlossen in angegebene Trennzeichen) solche Zeichenfolgen mit einem DBMS-spezifischen Literalpräfix und Literalsuffixzeichen (oder Zeichen) verwenden.

Je nach DBMS können auch spezielle syntaktische Anforderungen für Vorgänge wie äußere Verknüpfungen auftreten. Verwenden Sie ODBC-Funktionen, um diese Informationen von Ihrem Treiber für das DBMS abzurufen. Rufen Sie ::SQLGetTypeInfo z. B. einen bestimmten Datentyp auf, SQL_VARCHARum die LITERAL_PREFIX und LITERAL_SUFFIX Zeichen anzufordern. Wenn Sie datenbankunabhängigen Code schreiben, finden Sie in Anhang C: SQL-Grammatik in der ODBC-Programmierreferenz ausführliche Informationen zur Syntax.

Ein Recordset-Objekt erstellt die SQL-Anweisung, die zum Auswählen von Datensätzen verwendet wird, es sei denn, Sie übergeben eine benutzerdefinierte SQL-Anweisung. Wie dies geschieht, hängt Standard vom Wert ab, den Sie im lpszSQL-Parameter der Open Memberfunktion übergeben.

Die allgemeine Form einer SQL SELECT-Anweisung lautet:

SELECT [ALL | DISTINCT] column-list FROM table-list
    [WHERE search-condition][ORDER BY column-list [ASC | DESC]]

Eine Möglichkeit, die DISTINCT-Schlüsselwort (keyword) der SQL-Anweisung Ihres Recordsets hinzuzufügen, besteht darin, den Schlüsselwort (keyword) in den ersten RFX-Funktionsaufruf einzubettenDoFieldExchange. Beispiel:

...
    RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...

Hinweis

Verwenden Sie diese Technik nur bei einem Recordset, das schreibgeschützt geöffnet wird.

Überschreiben der SQL-Anweisung

In der folgenden Tabelle sind die Möglichkeiten für den lpszSQL-Parameter zu Opensehen. Die Fälle in der Tabelle werden nach der Tabelle erläutert.

Der lpszSQL-Parameter und die resultierende SQL-Zeichenfolge

Fall Was Sie in lpszSQL übergeben Die resultierende SELECT-Anweisung
1 NULL SELECTrfx-field-listFROMtable-name

CRecordset::Open Aufrufe GetDefaultSQL zum Abrufen des Tabellennamens. Die resultierende Zeichenfolge ist einer der Fälle 2 bis 5, je nachdem, was GetDefaultSQL zurückgegeben wird.
2 Ein Tabellenname SELECTrfx-field-listFROMtable-name

Die Feldliste stammt aus den RFX-Anweisungen in DoFieldExchange. Wenn m_strFilter und nicht leer sind, werden die WHERE- m_strSort und/oder ORDER BY-Klauseln hinzugefügt.
3 * Eine vollständige SELECT-Anweisung, jedoch ohne eine WHERE- oder ORDER BY-Klausel Wie übergeben. Wenn m_strFilter und nicht leer sind, werden die WHERE- m_strSort und/oder ORDER BY-Klauseln hinzugefügt.
4 * Eine vollständige SELECT-Anweisung mit einer WHERE- und/oder ORDER BY-Klausel Wie übergeben. m_strFilterund/oder m_strSort muss erneut Standard leere oder zwei Filter- und/oder Sortieranweisungen erstellt werden.
5 * Ein Aufruf einer gespeicherten Prozedur Wie übergeben.

* m_nFields muss kleiner oder gleich der Anzahl von Spalten sein, die in der SELECT-Anweisung angegeben sind. Der Datentyp jeder in der SELECT-Anweisung angegebenen Spalte muss mit dem Datentyp der entsprechenden RFX-Ausgabespalte übereinstimmen.

Case 1 lpszSQL = NULL

Die Recordsetauswahl hängt davon ab, was GetDefaultSQL beim CRecordset::Open Aufrufen zurückgegeben wird. Die Fälle 2 bis 5 beschreiben die möglichen Zeichenfolgen.

Case 2 lpszSQL = a Table Name

The recordset uses record field exchange (RFX) to build the column list from the column names provided in the RFX function calls in the recordset class's override of DoFieldExchange. Wenn Sie einen Assistenten zum Deklarieren der Recordset-Klasse verwendet haben, hat dieser Fall dasselbe Ergebnis wie fall 1 (vorausgesetzt, Sie übergeben den gleichen Tabellennamen, den Sie im Assistenten angegeben haben). Wenn Sie zum Schreiben ihrer Klasse keinen Assistenten verwenden, ist Case 2 die einfachste Möglichkeit, die SQL-Anweisung zu erstellen.

Im folgenden Beispiel wird eine SQL-Anweisung erstellt, die Datensätze aus einer MFC-Datenbankanwendung auswählt. Wenn das Framework die GetDefaultSQL Memberfunktion aufruft, gibt die Funktion den Namen der Tabelle zurück. SECTION

CString CEnrollSet::GetDefaultSQL()
{
    return "SECTION";
}

Um die Namen der Spalten für die SQL SELECT-Anweisung abzurufen, ruft das Framework die DoFieldExchange Memberfunktion auf.

void CEnrollSet::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, "CourseID", m_strCourseID);
    RFX_Text(pFX, "InstructorID", m_strInstructorID);
    RFX_Text(pFX, "RoomNo", m_strRoomNo);
    RFX_Text(pFX, "Schedule", m_strSchedule);
    RFX_Text(pFX, "SectionNo", m_strSectionNo);
}

Nach Abschluss sieht die SQL-Anweisung wie folgt aus:

SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo
    FROM SECTION

Case 3 lpszSQL = a SELECT/FROM Statement

Sie geben die Spaltenliste manuell an, anstatt sich auf RFX zu verlassen, um sie automatisch zu erstellen. Sie können dies in folgenden Fällen tun:

  • Sie möchten die DISTINCT-Schlüsselwort (keyword) nach SELECT angeben.

    Die Spaltenliste sollte mit den Spaltennamen und -typen in der gleichen Reihenfolge übereinstimmen, in DoFieldExchangeder sie aufgelistet sind.

  • Sie müssen Spaltenwerte manuell mithilfe der ODBC-Funktion ::SQLGetData abrufen, anstatt sich auf RFX zu verlassen, um Spalten für Sie zu binden und abzurufen.

    Sie können z. B. neue Spalten aufnehmen, die ein Kunde Ihrer Anwendung den Datenbanktabellen hinzugefügt hat, nachdem die Anwendung verteilt wurde. Sie müssen diese zusätzlichen Felddatenmember hinzufügen, die zum Zeitpunkt der Deklaration der Klasse mit einem Assistenten nicht bekannt waren.

    Die Spaltenliste sollte den Spaltennamen und -typen in der gleichen Reihenfolge entsprechen, in DoFieldExchangeder sie aufgelistet sind, gefolgt von den Namen der manuell gebundenen Spalten. Weitere Informationen finden Sie unter Recordset: Dynamically Binding Data Columns (ODBC).

  • Sie möchten Tabellen verknüpfen, indem Sie mehrere Tabellen in der FROM-Klausel angeben.

    Weitere Informationen und ein Beispiel finden Sie unter Recordset: Ausführen einer Verknüpfung (ODBC).For information and an example, see Recordset: Performing a Join (ODBC).

Case 4 lpszSQL = SELECT/FROM Plus WHERE und/oder ORDER BY

Sie geben alles an: die Spaltenliste (basierend auf den RFX-Aufrufen in DoFieldExchange), die Tabellenliste und den Inhalt einer WHERE - und/oder ORDER BY-Klausel . Wenn Sie Ihre WHERE- und/oder ORDER BY-Klauseln auf diese Weise angeben, verwenden m_strFilter Und/oder m_strSort.

Case 5 lpszSQL = ein Aufruf einer gespeicherten Prozedur

Wenn Sie eine vordefinierte Abfrage aufrufen müssen (z. B. eine gespeicherte Prozedur in einer Microsoft SQL Server-Datenbank), müssen Sie eine CALL-Anweisung in der Zeichenfolge schreiben, die Sie an lpszSQL übergeben. Die Assistenten unterstützen das Deklarieren einer Recordsetklasse zum Aufrufen einer vordefinierten Abfrage nicht. Nicht alle vordefinierten Abfragen geben Datensätze zurück.

Wenn eine vordefinierte Abfrage keine Datensätze zurückgibt, können Sie die CDatabase Memberfunktion ExecuteSQL direkt verwenden. Bei einer vordefinierten Abfrage, die Datensätze zurückgibt, müssen Sie die RFX-Aufrufe DoFieldExchange auch manuell für alle Spalten schreiben, die die Prozedur zurückgibt. Die RFX-Aufrufe müssen sich in derselben Reihenfolge befinden und dieselben Typen zurückgeben, wie die vordefinierte Abfrage. Weitere Informationen finden Sie unter Recordset: Deklarieren einer Klasse für eine vordefinierte Abfrage (ODBC).For more information, see Recordset: Declaring a Class for a Predefined Query (ODBC).

Siehe auch

SQL: SQL- und C++-Datentypen (ODBC)
SQL: Durchführen direkter SQL-Aufrufe (ODBC)