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:
Wann und warum ein Recordset möglicherweise parametrisiert werden soll
Deklarieren von Parameterdatenmembern in Ihrer Recordset-Klasse
Übergeben von Parameterinformationen an ein Recordset-Objekt zur Laufzeit.
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 aufstrInputID
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.
Führen Sie den MFC-ODBC-Consumer-Assistenten über Klasse hinzufügen aus, um die Klasse zu erstellen.
Geben Sie die Felddatenmember für die Spalten des Recordsets an.
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.
Ä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
Inkrementieren Sie im Konstruktor Ihrer Recordset-Klasse die Anzahl der Parameter,
m_nParams
.Weitere Informationen finden Sie unter Datensatzfeldaustausch: Arbeiten mit dem Assistentencode.
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
Erstellen Sie das Recordset-Objekt.
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.Weisen Sie jedem Parameterdatenmember des Objekts einen Laufzeitparameterwert zu.
Rufen Sie die
Open
-Memberfunktion auf (oderRequery
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)