Share via


Recordset: Parametrisieren eines Recordsets (ODBC)

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

Manchmal möchten Sie in der Lage sein, zur Laufzeit Datensätze mit Informationen auszuwählen, die Sie berechnet oder von Ihrem Endbenutzer erhalten haben. Dies können Sie mit Recordset-Parametern erreichen.

In diesem Thema wird Folgendes erläutert:

Parametrisierte Recordsets

Ein parametrisiertes Recordset ermöglicht es Ihnen, Parameterinformationen zur Laufzeit zu übergeben. Dies hat zwei nützliche Auswirkungen:

  • Es kann sich eine bessere Ausführungsgeschwindigkeit ergeben.

  • Sie können zur Laufzeit eine Abfrage erstellen, die auf Informationen basiert, die Ihnen zur Entwurfszeit nicht zur Verfügung stehen, etwa Informationen, die Sie zur Laufzeit von einem Benutzer erhalten oder die Sie berechnet haben.

Wenn Sie Open aufrufen, um die Abfrage auszuführen, verwendet das Recordset die Parameterinformationen, um seine SELECT-SQL-Anweisung zu vervollständigen. Sie können jedes Recordset parametrisieren.

Gründe für die Verwendung von Parametern

Typische Verwendungen für Parameter sind:

  • Übergeben von Argumenten an eine vordefinierte Abfrage zur Laufzeit

    Um Parameter an eine gespeicherte Prozedur zu übergeben, müssen Sie eine vollständige benutzerdefinierte CALL-ODBC-Anweisung – mit Parameterplatzhaltern – angeben, wenn Sie Open aufrufen. Dabei wird die Standard-SQL-Anweisung des Recordsets überschrieben. Weitere Informationen finden Sie unter CRecordset::Open in the Class Library Reference and SQL: Customizing Your Recordset's SQL Statement (ODBC) and Recordset: Declaring a Class for a Predefined Query (ODBC).

  • Effizientes Ausführen zahlreicher erneuter Abfragen mit unterschiedlichen Parameterinformationen

    Beispielsweise können Sie jedes Mal, wenn ein Endbenutzer Informationen zu einem bestimmten Schüler in der Registrierungsdatenbank für Schüler nachschlägt, den Namen oder die ID des Schülers als Parameter angeben, den Sie vom Benutzer erhalten haben. Dann wird, wenn Sie die Requery-Memberfunktion des Recordsets aufrufen, nur der Datensatz dieses Schülers für die Abfrage ausgewählt.

    Die für Ihren Recordset verwendete Filterzeichenfolge, die in m_strFilter gespeichert ist, könnte wie folgt aussehen:

    "StudentID = ?"
    

    Angenommen, Sie erhalten die Schüler-ID in der Variablen strInputID. Wenn Sie einen Parameter auf strInputID festlegen(z. B. die Schüler-ID 100), wird der Wert der Variablen an den Parameterplatzhalter gebunden, der durch das „?“ in der Filterzeichenfolge dargestellt ist.

    Weisen Sie den Parameterwert wie folgt zu:

    strInputID = "100";
    ...
    m_strParam = strInputID;
    

    Eine Filterzeichenfolge können Sie auf folgende Weise einrichten:

    m_strFilter = "StudentID = 100";   // 100 is incorrectly quoted
                                       // for some drivers
    

    Eine Erläuterung der korrekten Verwendung von Anführungszeichen für Filterzeichenfolgen finden Sie unter Recordset: Filtering Records (ODBC).

    Der Parameterwert ist jedes Mal anders, wenn Sie das Recordset nach einer neuen Schüler-ID abfragen.

    Tipp

    Ein Verwenden von Parametern ist effizienter, als einfach einen Filter zu nutzen. Für ein parametrisiertes Recordset muss die Datenbank eine SELECT-SQL-Anweisung nur einmal verarbeiten. Für ein gefiltertes Recordset ohne Parameter muss die SELECT-Anweisung jedes Mal verarbeitet werden, wenn Sie über Requery mit einem neuen Filterwert abfragen.

Weitere Informationen zu Filtern finden Sie unter "Recordset: Filtering Records (ODBC)".

Parametrisieren der Recordset-Klasse

Hinweis

Dieser Abschnitt bezieht sich auf aus CRecordset abgeleitete Objekte, in denen das gesammelte Abrufen (Massenabrufen) von Zeilen nicht implementiert wurde. Wenn Sie Massenabrufen von Zeilen verwenden, erfolgt das Implementieren von Parametern in einem ähnlichen Vorgang. Weitere Informationen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).

Bevor Sie Ihre Recordset-Klasse erstellen, müssen Sie bestimmen, welche Parameter Sie benötigen, welche Datentypen diese Parameter haben sollen und wie sie vom Recordset verwendet werden sollen.

Parametrisieren einer Recordset-Klasse

Hinweis

Der MFC-ODBC-Consumer-Assistent ist in Visual Studio 2019 und höher nicht verfügbar. Sie können diese Funktionalität weiterhin manuell erstellen.

  1. Führen Sie den MFC-ODBC-Consumer-Assistenten über Klasse hinzufügen aus, um die Klasse zu erstellen.

  2. Geben Sie die Felddatenmember für die Spalten des Recordsets an.

  3. Nachdem der Assistent die Klasse in eine Datei in Ihrem Projekt geschrieben hat, öffnen Sie die .h-Datei, und fügen Sie manuell die entsprechenden Parameterdatenmember zur Klassendeklaration hinzu. Die Hinzufügung könnte in etwa wie das folgende Beispiel aussehen als Bestandteil einer Momentaufnahme-Klasse zur Beantwortung der Frage „Welche Schüler sind in der Oberstufe?“.

    class CStudentSet : public CRecordset
    {
    // Field/Param Data
        CString m_strFirstName;
        CString m_strLastName;
        CString m_strStudentID;
        CString m_strGradYear;
    
        CString m_strGradYrParam;
    };
    

    Fügen Sie Ihre Parameterdatenmember hinzu, nachdem der Assistent Felddatenmember generiert hat. Die Konvention besteht darin, dass an jeden benutzerdefinierten Parameternamen das Wort „param“ angefügt wird.

  4. Ändern Sie die DoFieldExchange-Memberfunktionsdefinition in der CPP-Datei. Fügen Sie einen RFX-Funktionsaufruf für jeden Parameterdatenmember hinzu, den Sie der Klasse hinzugefügt haben. Informationen zum Schreiben Ihrer RFX-Funktionen finden Sie unter Record Field Exchange: How RFX Works. Setzen Sie vor die RFX-Aufrufe für die Parameter folgenden einzelnen Aufruf:

    pFX->SetFieldType( CFieldExchange::param );
    // RFX calls for parameter data members
    
  5. Inkrementieren Sie im Konstruktor Ihrer Recordset-Klasse die Anzahl der Parameter, m_nParams.

    Weitere Informationen finden Sie unter Datensatzfeldaustausch: Arbeiten mit dem Assistentencode.

  6. Wenn Sie den Code schreiben, in dem ein Recordset-Objekt dieser Klasse erstellt wird, platzieren Sie ein „?“ (Fragezeichen) an jeder Stelle in Ihren SQL-Anweisungzeichenfolgen, an der ein Parameter ersetzt werden muss.

    Zur Laufzeit werden die „?“-Platzhalter in der vorliegenden Reihenfolge durch die Parameterwerte ersetzt, die Sie übergeben. Der erste Parameterdatenmember, der nach dem SetFieldType-Aufruf festgelegt ist, ersetzt das erste „?“ in der SQL-Zeichenfolge, der zweite Parameterdatenmember ersetzt das zweite „?“ und so weiter.

Hinweis

Die Parameterreihenfolge ist wichtig: Die Reihenfolge der RFX-Aufrufe für Parameter in Ihrer DoFieldExchange-Funktion muss mit der Reihenfolge der Parameterplatzhalter in Ihrer SQL-Zeichenfolge übereinstimmen.

Tipp

Die wahrscheinlichste Zeichenfolge, mit der gearbeitet wird, ist die Zeichenfolge (sofern vorhanden), die Sie für den m_strFilter-Datenmember der Klasse angeben, es kann aber sein, dass einige ODBC-Treiber Parameter in anderen SQL-Klauseln unterstützen.

Übergeben von Parameterwerten zur Laufzeit

Sie müssen die Parameterwerte angeben, bevor Sie Open (für ein neues Recordset-Objekt) oder Requery (für eine vorhandene Ressourcengruppe) aufrufen.

So übergeben Sie Parameterwerte zur Laufzeit an ein Recordset-Objekt

  1. Erstellen Sie das Recordset-Objekt.

  2. Bereiten Sie Zeichenfolgen vor, z. B. die m_strFilter-Zeichenfolge, die die SQL-Anweisung oder Teile dieser Anweisung enthalten. Setzen Sie „?“-Platzhalter an die Stellen, an denen die Parameterinformationen eingefügt werden sollen.

  3. Weisen Sie jedem Parameterdatenmember des Objekts einen Laufzeitparameterwert zu.

  4. Rufen Sie die Open-Memberfunktion auf (oder Requery für ein vorhandenes Recordset).

Angenommen, Sie möchten eine Filterzeichenfolge für Ihr Recordset mit Informationen angeben, die zur Laufzeit bereitgestellt werden. Nehmen Sie weiterhin an, dass Sie bereits ein Recordset der Klasse CStudentSet namens rsStudents erstellt haben und nun dieses Recordset erneut hinsichtlich einer bestimmten Art von Schülerinformationen abfragen möchten.

// Set up a filter string with
// parameter placeholders
rsStudents.m_strFilter = "GradYear <= ?";

// Obtain or calculate parameter values
// to pass--simply assigned here
CString strGradYear = GetCurrentAcademicYear( );

// Assign the values to parameter data members
rsStudents.m_strGradYrParam = strGradYear;

// Run the query
if( !rsStudents.Requery( ) )
    return FALSE;

Das Recordset enthält Datensätze für die Schüler, deren Datensätze die Bedingungen erfüllen, die durch den Filter angegeben sind, der aus den Laufzeitparametern erstellt wurde. In diesem Fall enthält das Recordset Datensätze für alle Oberstufenschüler.

Hinweis

Bei Bedarf können Sie den Wert eines Parameterdatenmembers mit SetParamNull auf den Nullwert festlegen. Mit IsFieldNull können Sie entsprechend prüfen, ob ein Parameterdatenmember den Nullwert hat.

Siehe auch

Recordset (ODBC)
Recordset: Hinzufügen, Aktualisieren und Löschen von Datensätzen (ODBC)
Recordset: Wie Recordsets Datensätze auswählen (ODBC)