Auf dieser Seite

QSqlQuery Class

Die Klasse `QSqlQuery` bietet Möglichkeiten zur Ausführung und Bearbeitung von SQL-Anweisungen. Mehr...

Überschrift: #include <QSqlQuery>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql

Öffentliche Typen

enum BatchExecutionMode { ValuesAsRows, ValuesAsColumns }

Eigenschaften

Öffentliche Funktionen

QSqlQuery(QSqlResult *result)
QSqlQuery(const QSqlDatabase &db)
QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())
(since 6.2) QSqlQuery(QSqlQuery &&other)
~QSqlQuery()
void addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
int at() const
void bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
void bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
QVariant boundValue(const QString &placeholder) const
QVariant boundValue(int pos) const
(since 6.6) QString boundValueName(int pos) const
(since 6.6) QStringList boundValueNames() const
(since 6.0) QVariantList boundValues() const
void clear()
const QSqlDriver *driver() const
bool exec()
bool exec(const QString &query)
bool execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)
QString executedQuery() const
void finish()
bool first()
bool isActive() const
bool isForwardOnly() const
bool isNull(int field) const
bool isNull(QAnyStringView name) const
(since 6.7) bool isPositionalBindingEnabled() const
bool isSelect() const
bool isValid() const
bool last()
QSqlError lastError() const
QVariant lastInsertId() const
QString lastQuery() const
bool next()
bool nextResult()
int numRowsAffected() const
QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const
bool prepare(const QString &query)
bool previous()
QSqlRecord record() const
const QSqlResult *result() const
bool seek(int index, bool relative = false)
void setForwardOnly(bool forward)
void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
(since 6.7) void setPositionalBindingEnabled(bool enable)
int size() const
(since 6.2) void swap(QSqlQuery &other)
QVariant value(int index) const
QVariant value(QAnyStringView name) const
(since 6.2) QSqlQuery &operator=(QSqlQuery &&other)

Ausführliche Beschreibung

QSqlQuery kapselt die Funktionen zum Erstellen, Durchsuchen und Abrufen von Daten aus SQL-Abfragen, die auf einem QSqlDatabase ausgeführt werden. Es kann zur Ausführung von DML-Anweisungen (Data Manipulation Language) wie „ SELECT “, „ INSERT “, „ UPDATE “ und „ DELETE “ sowie von DDL-Anweisungen (Data Definition Language) wie „ CREATE “ und „ TABLE “ verwendet werden. Außerdem können damit datenbankspezifische Befehle ausgeführt werden, die nicht zum Standard-SQL gehören (z. B. „ SET DATESTYLE=ISO “ für PostgreSQL).

Erfolgreich ausgeführte SQL-Anweisungen setzen den Status der Abfrage auf „aktiv“, sodass isActive() den Wert true zurückgibt. Andernfalls wird der Status der Abfrage auf „inaktiv“ gesetzt. In beiden Fällen wird die Abfrage bei der Ausführung einer neuen SQL-Anweisung auf einen ungültigen Datensatz gesetzt. Eine aktive Abfrage muss zu einem gültigen Datensatz navigiert werden (sodass ` isValid()` den Wert ` true` zurückgibt), bevor Werte abgerufen werden können.

Bei einigen Datenbanken schlägt der Commit oder Rollback fehl, wenn beim Aufruf von ` commit()` oder ` rollback()` eine aktive Abfrage vorliegt, bei der es sich um eine ` SELECT `-Anweisung handelt. Weitere Informationen finden Sie unter ` isActive()`.

Die Navigation durch Datensätze erfolgt mit den folgenden Funktionen:

Diese Funktionen ermöglichen es dem Programmierer, vorwärts, rückwärts oder beliebig durch die von der Abfrage zurückgegebenen Datensätze zu navigieren. Wenn Sie sich nur vorwärts durch die Ergebnisse bewegen müssen (z. B. mithilfe von ` next()`), können Sie ` setForwardOnly()` verwenden, was bei einigen Datenbanken erheblichen Speicherplatz spart und die Leistung verbessert. Sobald eine aktive Abfrage auf einem gültigen Datensatz positioniert ist, können Daten mit ` value()` abgerufen werden. Alle Daten werden mithilfe von `QVariants` aus dem SQL-Backend übertragen.

Beispiel:

    QSqlQuery query("SELECT country FROM artist");
    while (query.next()) {
        QString country = query.value(0).toString();
        doSomething(country);
    }

Um auf die von einer Abfrage zurückgegebenen Daten zuzugreifen, verwenden Sie `value(int)`. Der Zugriff auf jedes Feld in den von einer ` SELECT `-Anweisung zurückgegebenen Daten erfolgt durch Übergabe der Feldposition in der Anweisung, beginnend bei 0. Daher ist die Verwendung von ` SELECT * `-Abfragen nicht empfehlenswert, da die Reihenfolge der zurückgegebenen Felder unbestimmt ist.

Aus Effizienzgründen gibt es keine Funktionen, um auf ein Feld anhand seines Namens zuzugreifen (es sei denn, Sie verwenden vorbereitete Abfragen mit Namen, wie weiter unten erläutert). Um einen Feldnamen in einen Index umzuwandeln, verwenden Sie ` record()`. `indexOf()`, zum Beispiel:

    QSqlQuery query("SELECT * FROM artist");
    int fieldNo = query.record().indexOf("country");
    while (query.next()) {
        QString country = query.value(fieldNo).toString();
        doSomething(country);
    }

QSqlQuery unterstützt die Ausführung vorbereiteter Abfragen und die Zuordnung von Parameterwerten zu Platzhaltern. Einige Datenbanken unterstützen diese Funktionen nicht; für diese emuliert Qt die erforderliche Funktionalität. Beispielsweise verfügen die Oracle- und ODBC-Treiber über eine ordnungsgemäße Unterstützung für vorbereitete Abfragen, und Qt nutzt diese; bei Datenbanken, die diese Unterstützung nicht bieten, implementiert Qt die Funktion jedoch selbst, z. B. durch das Ersetzen von Platzhaltern durch tatsächliche Werte bei der Ausführung einer Abfrage. Verwenden Sie ` numRowsAffected()``, um herauszufinden, wie viele Zeilen von einer Abfrage ohne `SELECT ` betroffen waren, und ` size()`, um festzustellen, wie viele durch eine ` SELECT` abgerufen wurden.

Oracle-Datenbanken identifizieren Platzhalter mithilfe einer Doppelpunkt-Name-Syntax, z. B. ` :name`. ODBC verwendet lediglich die Zeichen ` ? `. Qt unterstützt beide Syntaxen, mit der Einschränkung, dass Sie diese nicht in derselben Abfrage mischen können.

Mit ` boundValues()` können Sie die Werte aller Felder in einer einzigen Variablen abrufen.

Hinweis: Nicht alle SQL-Operationen unterstützen die Bindung von Werten. Informieren Sie sich in der Dokumentation Ihres Datenbanksystems über deren Verfügbarkeit.

Ansätze zur Wertbindung

Im Folgenden stellen wir dasselbe Beispiel unter Verwendung der vier verschiedenen Bindungsansätze sowie ein Beispiel für die Wertbindung in einer gespeicherten Prozedur vor.

Benannte Bindung unter Verwendung benannter Platzhalter:

    QSqlQuery query;
    query.prepare("INSERT INTO person (id, forename, surname) "
                  "VALUES (:id, :forename, :surname)");
    query.bindValue(":id", 1001);
    query.bindValue(":forename", "Bart");
    query.bindValue(":surname", "Simpson");
    query.exec();

Positionsgebundene Zuordnung mit benannten Platzhaltern:

    QSqlQuery query;
    query.prepare("INSERT INTO person (id, forename, surname) "
                  "VALUES (:id, :forename, :surname)");
    query.bindValue(0, 1001);
    query.bindValue(1, "Bart");
    query.bindValue(2, "Simpson");
    query.exec();

Zuordnung von Werten mithilfe von Positionsplatzhaltern (Version 1):

    QSqlQuery query;
    query.prepare("INSERT INTO person (id, forename, surname) "
                  "VALUES (?, ?, ?)");
    query.bindValue(0, 1001);
    query.bindValue(1, "Bart");
    query.bindValue(2, "Simpson");
    query.exec();

Zuordnung von Werten mithilfe von Positionsplatzhaltern (Version 2):

    QSqlQuery query;
    query.prepare("INSERT INTO person (id, forename, surname) "
                  "VALUES (?, ?, ?)");
    query.addBindValue(1001);
    query.addBindValue("Bart");
    query.addBindValue("Simpson");
    query.exec();

Werte an eine gespeicherte Prozedur binden:

Dieser Code ruft eine gespeicherte Prozedur namens „ AsciiToInt() “ auf, übergibt ihr über den „in“-Parameter ein Zeichen und empfängt das Ergebnis über den „out“-Parameter.

    QSqlQuery query;
    query.prepare("CALL AsciiToInt(?, ?)");
    query.bindValue(0, "A");
    query.bindValue(1, 0, QSql::Out);
    query.exec();
    int i = query.boundValue(1).toInt(); // i is 65

Beachten Sie, dass ungebundene Parameter ihre Werte beibehalten.

Gespeicherte Prozeduren, die die „RETURN“-Anweisung zum Zurückgeben von Werten verwenden oder mehrere Ergebnismengen zurückgeben, werden nicht vollständig unterstützt. Weitere Einzelheiten finden Sie unter „SQL-Datenbanktreiber“.

Warnung: Sie müssen den SQL-Treiber laden und die Verbindung öffnen, bevor eine `QSqlQuery` erstellt wird. Außerdem muss die Verbindung offen bleiben, solange die Abfrage besteht; andernfalls ist das Verhalten von `QSqlQuery` undefiniert.

Siehe auch QSqlDatabase, QSqlQueryModel, QSqlTableModel und QVariant.

Dokumentation zu den Mitgliedstypen

enum QSqlQuery::BatchExecutionMode

KonstanteWertBeschreibung
QSqlQuery::ValuesAsRows0- Aktualisiert mehrere Zeilen. Behandelt jeden Eintrag in einem „ QVariantList “ als Wert für die Aktualisierung der nächsten Zeile.
QSqlQuery::ValuesAsColumns1- Aktualisiert eine einzelne Zeile. Behandelt jeden Eintrag in einem „ QVariantList “ als einen einzelnen Wert vom Typ Array.

Dokumentation zur Eigenschaft

[since 6.8] forwardOnly : bool

Diese Eigenschaft legt den „Forward-Only“-Modus fest. Wenn „ forward “ auf „true“ gesetzt ist, sind für die Navigation durch die Ergebnisse nur „ next()“ und „ seek()“ mit positiven Werten zulässig.

Der „Forward-Only“-Modus kann (je nach Treiber) speichereffizienter sein, da die Ergebnisse nicht zwischengespeichert werden müssen. Außerdem verbessert er bei einigen Datenbanken die Leistung. Damit dies gilt, müssen Sie „ setForwardOnly() “ aufrufen, bevor die Abfrage vorbereitet oder ausgeführt wird. Beachten Sie, dass der Konstruktor, der eine Abfrage und eine Datenbank entgegennimmt, die Abfrage möglicherweise ausführt.

Der „Forward-Only“-Modus ist standardmäßig deaktiviert.

Die Einstellung von „forward only“ auf „false“ ist eine Empfehlung an die Datenbank-Engine, die letztendlich entscheidet, ob eine Ergebnismenge „forward only“ oder scrollbar ist. ` isForwardOnly()` gibt immer den korrekten Status der Ergebnismenge zurück.

Hinweis: Der Aufruf von ` setForwardOnly ` nach Ausführung der Abfrage führt im besten Fall zu unerwarteten Ergebnissen, im schlimmsten Fall zu Abstürzen.

Hinweis: Um sicherzustellen, dass die „Forward-Only“-Abfrage erfolgreich abgeschlossen wurde, sollte die Anwendung lastError() nicht nur nach Ausführung der Abfrage, sondern auch nach dem Durchlaufen der Abfrageergebnisse auf Fehler überprüfen.

Warnung: PostgreSQL : Führen Sie beim Durchlaufen der Abfrageergebnisse im „Forward-Only“-Modus keine anderen SQL-Befehle über dieselbe Datenbankverbindung aus. Dies führt zum Verlust der Abfrageergebnisse.

Diese Aufzählung wurde in Qt 6.8 eingeführt.

Zugriffsfunktionen:

bool isForwardOnly() const
void setForwardOnly(bool forward)

Siehe auch ` next()` und ` seek()`.

[since 6.8] numericalPrecisionPolicy : QSql::NumericalPrecisionPolicy

Weisen Sie den Datenbanktreiber an, numerische Werte mit einer durch „ precisionPolicy “ festgelegten Genauigkeit zurückzugeben.

Der Oracle-Treiber kann beispielsweise numerische Werte als Zeichenfolgen abrufen, um einen Präzisionsverlust zu vermeiden. Wenn eine hohe Präzision keine Rolle spielt, nutzen Sie diese Methode, um die Ausführungsgeschwindigkeit durch das Umgehen von Zeichenfolgenkonvertierungen zu erhöhen.

Hinweis: Treiber, die das Abrufen von numerischen Werten mit geringer Genauigkeit nicht unterstützen, ignorieren die Genauigkeitsrichtlinie. Mit ` QSqlDriver::hasFeature()` können Sie feststellen, ob ein Treiber diese Funktion unterstützt.

Hinweis: Das Festlegen der Genauigkeitsrichtlinie hat keine Auswirkungen auf die aktuell aktive Abfrage. Rufen Sie ` exec(QString)` oder ` prepare()` auf, um die Richtlinie zu aktivieren.

Diese Aufzählung wurde in Qt 6.8 eingeführt.

Zugriffsfunktionen:

QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const
void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)

Siehe auch „ QSql::NumericalPrecisionPolicy “, „ QSqlDriver::numericalPrecisionPolicy “ und „ QSqlDatabase::numericalPrecisionPolicy “.

[since 6.8] positionalBindingEnabled : bool

Diese Eigenschaft aktiviert oder deaktiviert die Positions binding en für diese Abfrage, abhängig von enable (Standard ist true). Das Deaktivieren von Positions en ist sinnvoll, wenn die Abfrage selbst ein „?“ enthält, das nicht als Positions -Parameter, sondern beispielsweise als JSON-Operator für eine PostgreSQL-Datenbank behandelt werden muss.

Diese Eigenschaft hat keine Auswirkung, wenn die Datenbank native Unterstützung für positionale Bindungen mit Fragezeichen bietet (siehe auch QSqlDriver::PositionalPlaceholders).

Diese Aufzählung wurde in Qt 6.8 eingeführt.

Zugriffsfunktionen:

Dokumentation zu Mitgliedsfunktionen

[explicit] QSqlQuery::QSqlQuery(QSqlResult *result)

Erstellt ein QSqlQuery-Objekt, das über die Schnittstelle „ QSqlResult “ result mit einer Datenbank kommuniziert.

[explicit] QSqlQuery::QSqlQuery(const QSqlDatabase &db)

Erstellt ein QSqlQuery-Objekt unter Verwendung der Datenbank db. Ist db ungültig, wird die Standarddatenbank der Anwendung verwendet.

Siehe auch ` QSqlDatabase`.

[explicit] QSqlQuery::QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())

Erstellt ein QSqlQuery-Objekt unter Verwendung der SQL- query und der Datenbank- db. Wenn db nicht angegeben oder ungültig ist, wird die Standarddatenbank der Anwendung verwendet. Wenn query keine leere Zeichenkette ist, wird diese ausgeführt.

Siehe auch QSqlDatabase.

[noexcept, since 6.2] QSqlQuery::QSqlQuery(QSqlQuery &&other)

Erstellt ein QSqlQuery-Objekt aus „ other “ mithilfe von „move-construct“.

Diese Funktion wurde in Qt 6.2 eingeführt.

[noexcept] QSqlQuery::~QSqlQuery()

Löscht das Objekt und gibt alle zugewiesenen Ressourcen frei.

void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)

Fügt bei Verwendung der positionellen Wertbindung den Wert „ val “ zur Werteliste hinzu. Die Reihenfolge der Aufrufe von `addBindValue()` bestimmt, an welchen Platzhalter ein Wert in der vorbereiteten Abfrage gebunden wird. Wenn ` paramType ` auf ` QSql::Out ` oder ` QSql::InOut` gesetzt ist, wird der Platzhalter nach dem Aufruf von ` exec()` mit Daten aus der Datenbank überschrieben.

Um einen NULL-Wert zu binden, verwenden Sie einen Null- QVariant; verwenden Sie beispielsweise QVariant(QMetaType::fromType<QString>()), wenn Sie eine Zeichenkette binden.

Siehe auch bindValue(), prepare(), exec(), boundValue() und boundValues().

int QSqlQuery::at() const

Gibt die aktuelle interne Position der Abfrage zurück. Der erste Datensatz befindet sich an Position Null. Ist die Position ungültig, gibt die Funktion „ QSql::BeforeFirstRow “ oder „ QSql::AfterLastRow “ zurück, bei denen es sich um spezielle negative Werte handelt.

Siehe auch previous(), next(), first(), last(), seek(), isActive() und isValid().

void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)

Legen Sie fest, dass der Platzhalter „ placeholder “ in der vorbereiteten Anweisung an den Wert „ val “ gebunden wird. Beachten Sie, dass das Platzhalterzeichen (z. B. :) bei der Angabe des Platzhalternamens enthalten sein muss. Wenn paramType entweder QSql::Out oder QSql::InOut lautet, wird der Platzhalter nach dem Aufruf von exec() mit Daten aus der Datenbank überschrieben. In diesem Fall muss ausreichend Speicherplatz vorab reserviert werden, um das Ergebnis zu speichern.

Um einen NULL-Wert zu binden, verwenden Sie ein Null- QVariant; verwenden Sie beispielsweise QVariant(QMetaType::fromType<QString>()), wenn Sie eine Zeichenkette binden.

Siehe auch addBindValue(), prepare(), exec(), boundValue() und boundValues().

void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)

Legen Sie fest, dass der Platzhalter an der Position pos mit dem Wert val in der vorbereiteten Anweisung verknüpft wird. Die Feldnummerierung beginnt bei 0. Wenn paramType entweder QSql::Out oder QSql::InOut lautet, wird der Platzhalter nach dem Aufruf von exec() mit Daten aus der Datenbank überschrieben.

QVariant QSqlQuery::boundValue(const QString &placeholder) const

Gibt den Wert für die „ placeholder “ zurück.

Siehe auch „ boundValues()“, „ bindValue()“ und „ addBindValue()“.

QVariant QSqlQuery::boundValue(int pos) const

Gibt den Wert für den Platzhalter an der Position pos zurück.

Siehe auch boundValues().

[since 6.6] QString QSqlQuery::boundValueName(int pos) const

Gibt den Namen des gebundenen Werts an der Position „ pos “ zurück.

Die Reihenfolge der Liste entspricht der Bindungsreihenfolge, unabhängig davon, ob eine benannte oder eine positionelle Bindung verwendet wird.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch ` boundValueNames()`.

[since 6.6] QStringList QSqlQuery::boundValueNames() const

Gibt die Namen aller gebundenen Werte zurück.

Die Reihenfolge der Liste entspricht der Bindungsreihenfolge, unabhängig davon, ob es sich um eine benannte oder eine positionelle Bindung handelt.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch „ boundValues()“ und „ boundValueName()“.

[since 6.0] QVariantList QSqlQuery::boundValues() const

Gibt eine Liste der gebundenen Werte zurück.

Die Reihenfolge der Liste entspricht der Bindungsreihenfolge, unabhängig davon, ob es sich um eine benannte oder eine positionelle Bindung handelt.

Die gebundenen Werte können auf folgende Weise überprüft werden:

   const QVariantList list = query.boundValues();
    for (qsizetype i = 0; i < list.size();++i)
        qDebug() << i << ":" << list.at(i).toString();

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch „ boundValue()“, „ bindValue()“, „ addBindValue()“ und „ boundValueNames()“.

void QSqlQuery::clear()

Löscht die Ergebnismenge und gibt alle von der Abfrage belegten Ressourcen frei. Setzt den Status der Abfrage auf „inaktiv“. Sie sollten diese Funktion nur selten, wenn überhaupt, aufrufen müssen.

const QSqlDriver *QSqlQuery::driver() const

Gibt den der Abfrage zugeordneten Datenbanktreiber zurück.

bool QSqlQuery::exec()

Führt eine zuvor vorbereitete SQL-Abfrage aus. Gibt „ true “ zurück, wenn die Abfrage erfolgreich ausgeführt wurde; andernfalls wird „ false “ zurückgegeben.

Beachten Sie, dass der letzte Fehler für diese Abfrage beim Aufruf von `exec()` zurückgesetzt wird.

Siehe auch prepare(), bindValue(), addBindValue(), boundValue() und boundValues().

bool QSqlQuery::exec(const QString &query)

Führt die SQL-Anweisung in ` query` aus. Gibt ` true ` zurück und setzt den Abfragestatus auf ` active `, wenn die Abfrage erfolgreich war; andernfalls wird ` false` zurückgegeben. Die Zeichenfolge ` query ` muss eine für die abgefragte SQL-Datenbank geeignete Syntax verwenden (z. B. Standard-SQL).

Nach der Ausführung der Abfrage wird der Cursor auf einen ungültigen Datensatz gesetzt und muss zu einem gültigen Datensatz navigiert werden, bevor Datenwerte abgerufen werden können (beispielsweise mit ` next()`).

Beachten Sie, dass der letzte Fehler für diese Abfrage beim Aufruf von `exec()` zurückgesetzt wird.

Bei SQLite darf die Abfragezeichenfolge jeweils nur eine Anweisung enthalten. Werden mehrere Anweisungen angegeben, gibt die Funktion ` false` zurück.

Beispiel:

    QSqlQuery query;
    query.exec("INSERT INTO employee (id, name, salary) "
               "VALUES (1001, 'Thad Beaumont', 65000)");

Siehe auch isActive(), isValid(), next(), previous(), first(), last() und seek().

bool QSqlQuery::execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)

Führt eine zuvor vorbereitete SQL-Abfrage im Batch-Modus aus. Alle gebundenen Parameter müssen Listen von Varianten sein. Falls die Datenbank keine Batch-Ausführungen unterstützt, simuliert der Treiber diese mithilfe herkömmlicher exec()-Aufrufe.

Gibt ` true ` zurück, wenn die Abfrage erfolgreich ausgeführt wurde; andernfalls wird ` false` zurückgegeben.

Beispiel:

QSqlQuery q;
q.prepare("insert into myTable values (?, ?)");

QVariantList ints;
ints << 1 << 2 << 3 << 4;
q.addBindValue(ints);

QVariantList names;
names << "Harald" << "Boris" << "Trond" << QVariant(QMetaType::fromType<QString>());
q.addBindValue(names);

if (!q.execBatch())
    qDebug() << q.lastError();

Das obige Beispiel fügt vier neue Zeilen in „ myTable “ ein:

1  Harald
2  Boris
3  Trond
4  NULL

Um NULL-Werte zu binden, muss ein null- QVariant des entsprechenden Typs zum gebundenen QVariantList hinzugefügt werden; beispielsweise sollte QVariant(QMetaType::fromType<QString>()) verwendet werden, wenn Sie Zeichenfolgen verwenden.

Hinweis: Jede gebundene ` QVariantList ` muss die gleiche Anzahl an Varianten enthalten.

Hinweis: Der Typ der QVariants in einer Liste darf sich nicht ändern. So können Sie beispielsweise keine Ganzzahl- und Zeichenfolgen-Varianten innerhalb eines „ QVariantList “ mischen.

Der Parameter „ mode “ gibt an, wie die gebundene „ QVariantList “ interpretiert wird. Wenn „ mode “ auf „ ValuesAsRows “ gesetzt ist, wird jede Variante innerhalb der „ QVariantList “ als Wert für eine neue Zeile interpretiert. „ ValuesAsColumns “ ist ein Sonderfall für den Oracle-Treiber. In diesem Modus wird jeder Eintrag innerhalb einer „ QVariantList “ als Array-Wert für einen IN- oder OUT-Wert innerhalb einer gespeicherten Prozedur interpretiert. Beachten Sie, dass dies nur funktioniert, wenn der IN- oder OUT-Wert ein Tabellentyp ist, der aus nur einer Spalte eines Basistyps besteht, zum Beispiel TYPE myType IS TABLE OF VARCHAR(64) INDEX BY BINARY_INTEGER;

Siehe auch prepare(), bindValue() und addBindValue().

QString QSqlQuery::executedQuery() const

Gibt die zuletzt erfolgreich ausgeführte Abfrage zurück.

In den meisten Fällen gibt diese Funktion denselben String zurück wie ` lastQuery()`. Wird eine vorbereitete Abfrage mit Platzhaltern auf einem DBMS ausgeführt, das diese nicht unterstützt, wird die Vorbereitung dieser Abfrage emuliert. Die Platzhalter in der ursprünglichen Abfrage werden durch ihre zugewiesenen Werte ersetzt, um eine neue Abfrage zu bilden. Diese Funktion gibt die modifizierte Abfrage zurück. Sie ist vor allem für Debugging-Zwecke nützlich.

Siehe auch ` lastQuery()`.

void QSqlQuery::finish()

Weist den Datenbanktreiber an, dass aus dieser Abfrage keine weiteren Daten mehr abgerufen werden, bis sie erneut ausgeführt wird. Normalerweise ist es nicht erforderlich, diese Funktion aufzurufen, doch sie kann hilfreich sein, um Ressourcen wie Sperren oder Cursor freizugeben, falls Sie die Abfrage zu einem späteren Zeitpunkt wiederverwenden möchten.

Setzt die Abfrage auf inaktiv. Gebundene Werte behalten ihre Werte bei.

Siehe auch prepare(), exec() und isActive().

bool QSqlQuery::first()

Ruft den ersten Datensatz im Ergebnis ab, sofern vorhanden, und positioniert die Abfrage auf dem abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Status „ active “ befinden muss und „ isSelect()“ den Wert „true“ zurückgeben muss, bevor diese Funktion aufgerufen wird; andernfalls führt sie keine Aktion aus und gibt „false“ zurück. Gibt bei Erfolg „ true “ zurück. Bei Misserfolg wird die Abfrageposition auf eine ungültige Position gesetzt und „false“ zurückgegeben.

Siehe auch „ next()“, „ previous()“, „ last()“, „ seek()“, „ at()“, „ isActive()“ und „ isValid()“.

bool QSqlQuery::isActive() const

Gibt „ true “ zurück, wenn die Abfrage aktiv ist. Eine aktive „ QSqlQuery “-Instanz ist eine, die erfolgreich mit „ exec()“ gestartet, aber noch nicht abgeschlossen wurde. Wenn Sie mit einer aktiven Abfrage fertig sind, können Sie die Abfrage inaktivieren, indem Sie „ finish()“ oder „ clear()“ aufrufen, oder Sie können die „ QSqlQuery “-Instanz löschen.

Hinweis: Von besonderem Interesse ist eine aktive Abfrage, bei der es sich um eine ` SELECT `-Anweisung handelt. Bei einigen Datenbanken, die Transaktionen unterstützen, kann eine aktive Abfrage, bei der es sich um eine ` SELECT `-Anweisung handelt, dazu führen, dass ein Aufruf von ` commit()` oder ` rollback()` fehlschlägt. Bevor Sie also ein Commit oder Rollback durchführen, sollten Sie Ihre aktive ` SELECT `-Anweisung auf eine der oben genannten Weisen inaktivieren.

Siehe auch ` isSelect()`.

bool QSqlQuery::isForwardOnly() const

Gibt „ forwardOnly “ zurück.

Hinweis: Getter -Funktion für die Eigenschaft ` forwardOnly`.

Siehe auch „ forwardOnly“ , „ next()“ und „ seek()“.

bool QSqlQuery::isNull(int field) const

Gibt „ true “ zurück, wenn die Abfrage nicht „ active “ lautet, die Abfrage nicht auf einem gültigen Datensatz positioniert ist, es kein „ field “ gibt oder „ field “ null ist; andernfalls „ false “. Beachten Sie, dass bei einigen Treibern „isNull()“ erst nach einem Versuch, Daten abzurufen, genaue Informationen liefert.

Siehe auch „ isActive()“, „ isValid()“ und „ value()“.

bool QSqlQuery::isNull(QAnyStringView name) const

Gibt „ true “ zurück, wenn kein Feld mit dem Namen „ name “ vorhanden ist; andernfalls wird „isNull(int index)“ für den entsprechenden Feldindex zurückgegeben.

Diese Überladung ist weniger effizient als ` isNull()`

Hinweis: In Qt-Versionen vor 6.8 nahm diese Funktion „ QString “ als Argument entgegen, nicht „ QAnyStringView “.

Dies ist eine überladene Funktion.

[since 6.7] bool QSqlQuery::isPositionalBindingEnabled() const

Gibt „ positionalBindingEnabled “ zurück.

Hinweis: Getter -Funktion für die Eigenschaft ` positionalBindingEnabled`.

Diese Funktion wurde in Qt 6.7 eingeführt.

Siehe auch „ positionalBindingEnabled “.

bool QSqlQuery::isSelect() const

Gibt „ true “ zurück, wenn es sich bei der aktuellen Abfrage um eine „ SELECT “-Anweisung handelt; andernfalls wird „ false “ zurückgegeben.

bool QSqlQuery::isValid() const

Gibt „ true “ zurück, wenn sich die Abfrage derzeit auf einem gültigen Datensatz befindet; andernfalls wird „ false “ zurückgegeben.

bool QSqlQuery::last()

Ruft den letzten Datensatz im Ergebnis ab, sofern vorhanden, und positioniert die Abfrage auf dem abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Status „ active “ befinden muss und „ isSelect()“ den Wert „true“ zurückgeben muss, bevor diese Funktion aufgerufen wird; andernfalls führt sie keine Aktion aus und gibt „false“ zurück. Gibt bei Erfolg „ true “ zurück. Bei Fehlschlag wird die Abfrageposition auf eine ungültige Position gesetzt und „false“ zurückgegeben.

Siehe auch „ next()“, „ previous()“, „ first()“, „ seek()“, „ at()“, „ isActive()“ und „ isValid()“.

QSqlError QSqlQuery::lastError() const

Gibt Fehlerinformationen zum letzten Fehler (falls vorhanden) zurück, der bei dieser Abfrage aufgetreten ist.

Siehe auch „ QSqlError “ und „ QSqlDatabase::lastError()“.

QVariant QSqlQuery::lastInsertId() const

Gibt die Objekt-ID der zuletzt eingefügten Zeile zurück, sofern die Datenbank dies unterstützt. Ein ungültiger „ QVariant “-Wert wird zurückgegeben, wenn die Abfrage keinen Wert eingefügt hat oder wenn die Datenbank die ID nicht zurückmeldet. Wenn mehr als eine Zeile von der Einfügung betroffen war, ist das Verhalten undefiniert.

Bei MySQL-Datenbanken wird das Auto-Increment-Feld der Zeile zurückgegeben.

Hinweis: Damit diese Funktion in PSQL funktioniert, muss die Tabelle OIDs enthalten, die möglicherweise nicht standardmäßig angelegt wurden. Überprüfen Sie zur Sicherheit die Konfigurationsvariable ` default_with_oids `.

Siehe auch QSqlDriver::hasFeature().

QString QSqlQuery::lastQuery() const

Gibt den Text der aktuell verwendeten Abfrage zurück oder eine leere Zeichenkette, wenn kein aktueller Abfragetext vorhanden ist.

Siehe auch ` executedQuery()`.

bool QSqlQuery::next()

Ruft den nächsten Datensatz im Ergebnis ab, sofern vorhanden, und positioniert die Abfrage auf dem abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Status „ active “ befinden muss und die Funktion „ isSelect()“ den Wert „true“ zurückgeben muss, bevor diese Funktion aufgerufen wird; andernfalls führt sie keine Aktion aus und gibt „false“ zurück.

Es gelten die folgenden Regeln:

  • Befindet sich das Ergebnis derzeit vor dem ersten Datensatz, z. B. unmittelbar nach der Ausführung einer Abfrage, wird versucht, den ersten Datensatz abzurufen.
  • Befindet sich das Ergebnis derzeit hinter dem letzten Datensatz, erfolgt keine Änderung und es wird „false“ zurückgegeben.
  • Befindet sich das Ergebnis irgendwo in der Mitte, wird versucht, den nächsten Datensatz abzurufen.

Wenn der Datensatz nicht abgerufen werden konnte, wird das Ergebnis hinter dem letzten Datensatz positioniert und „false“ zurückgegeben. Wenn der Datensatz erfolgreich abgerufen wurde, wird „true“ zurückgegeben.

Siehe auch previous(), first(), last(), seek(), at(), isActive() und isValid().

bool QSqlQuery::nextResult()

Verwirft die aktuelle Ergebnismenge und wechselt zur nächsten, sofern vorhanden.

Einige Datenbanken können für gespeicherte Prozeduren oder SQL-Batches (eine Abfrage, die mehrere Anweisungen enthält) mehrere Ergebnismengen zurückgeben. Wenn nach der Ausführung einer Abfrage mehrere Ergebnismengen verfügbar sind, kann diese Funktion verwendet werden, um zur nächsten Ergebnismenge bzw. zu den nächsten Ergebnismengen zu wechseln.

Wenn ein neuer Ergebnissatz verfügbar ist, gibt diese Funktion „true“ zurück. Die Abfrage wird auf einen ungültigen Datensatz im neuen Ergebnissatz positioniert und muss zu einem gültigen Datensatz navigiert werden, bevor Datenwerte abgerufen werden können. Ist kein neuer Ergebnissatz verfügbar, gibt die Funktion „ false “ zurück und die Abfrage wird in den inaktiven Zustand versetzt. In jedem Fall wird der alte Ergebnissatz verworfen.

Wenn es sich bei einer der Anweisungen um eine Nicht-SELECT-Anweisung handelt, steht möglicherweise anstelle einer Ergebnismenge die Anzahl der betroffenen Zeilen zur Verfügung.

Beachten Sie, dass einige Datenbanken, z. B. Microsoft SQL Server, bei der Arbeit mit mehreren Ergebnismengen nicht scrollbare Cursor erfordern. Einige Datenbanken führen möglicherweise alle Anweisungen auf einmal aus, während andere die Ausführung verzögern, bis tatsächlich auf die Ergebnismenge zugegriffen wird, und bei einigen Datenbanken gelten möglicherweise Einschränkungen hinsichtlich der Anweisungen, die in einem SQL-Batch verwendet werden dürfen.

Siehe auch QSqlDriver::hasFeature(), forwardOnly, next(), isSelect(), numRowsAffected(), isActive() und lastError().

int QSqlQuery::numRowsAffected() const

Gibt die Anzahl der Zeilen zurück, die von der SQL-Anweisung des Ergebnisses betroffen sind, oder -1, wenn dies nicht ermittelt werden kann. Beachten Sie, dass der Wert bei Anweisungen vom Typ „ SELECT “ undefiniert ist; verwenden Sie stattdessen „ size()“. Wenn die Abfrage nicht vom Typ „ active “ ist, wird -1 zurückgegeben.

Siehe auch ` size()` und ` QSqlDriver::hasFeature()`.

QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const

Gibt die „numericalPrecisionPolicy“ zurück.

Hinweis: Getter -Funktion für die Eigenschaft „numericalPrecisionPolicy“.

Siehe auch „ setNumericalPrecisionPolicy()“.

bool QSqlQuery::prepare(const QString &query)

Bereitet die SQL-Abfrage „ query “ für die Ausführung vor. Gibt „ true “ zurück, wenn die Abfrage erfolgreich vorbereitet wurde; andernfalls wird „ false “ zurückgegeben.

Die Abfrage kann Platzhalter für die Einbindung von Werten enthalten. Es werden sowohl Platzhalter im Oracle-Stil mit Doppelpunkt und Name (z. B. ` :surname`) als auch im ODBC-Stil (`?`) unterstützt; sie dürfen jedoch nicht in derselben Abfrage gemischt werden. Beispiele finden Sie unter ` Detailed Description `.

Hinweise zur Portabilität: Einige Datenbanken verzögern die Vorbereitung einer Abfrage, bis sie zum ersten Mal ausgeführt wird. In diesem Fall schlägt die Vorbereitung einer syntaktisch falschen Abfrage zwar erfolgreich an, aber jeder nachfolgende Aufruf von ` exec()` schlägt fehl. Wenn die Datenbank benannte Platzhalter nicht direkt unterstützt, darf der Platzhalter nur Zeichen im Bereich [a-zA-Z0-9_] enthalten.

Bei SQLite darf die Abfragezeichenfolge jeweils nur eine Anweisung enthalten. Werden mehrere Anweisungen angegeben, gibt die Funktion „ false “ zurück.

Beispiel:

    QSqlQuery query;
    query.prepare("INSERT INTO person (id, forename, surname) "
                  "VALUES (:id, :forename, :surname)");
    query.bindValue(":id", 1001);
    query.bindValue(":forename", "Bart");
    query.bindValue(":surname", "Simpson");
    query.exec();

Siehe auch exec(), bindValue() und addBindValue().

bool QSqlQuery::previous()

Ruft den vorherigen Datensatz im Ergebnis ab, sofern vorhanden, und positioniert die Abfrage auf dem abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Status „ active “ befinden muss und die Funktion ` isSelect()` den Wert „true“ zurückgeben muss, bevor diese Funktion aufgerufen wird; andernfalls führt sie keine Aktion aus und gibt „false“ zurück.

Es gelten die folgenden Regeln:

  • Befindet sich das Ergebnis derzeit vor dem ersten Datensatz, erfolgt keine Änderung und es wird „false“ zurückgegeben.
  • Befindet sich das Ergebnis derzeit hinter dem letzten Datensatz, wird versucht, den letzten Datensatz abzurufen.
  • Befindet sich das Ergebnis irgendwo in der Mitte, wird versucht, den vorherigen Datensatz abzurufen.

Wenn der Datensatz nicht abgerufen werden konnte, wird das Ergebnis vor dem ersten Datensatz positioniert und „false“ zurückgegeben. Wenn der Datensatz erfolgreich abgerufen wurde, wird „true“ zurückgegeben.

Siehe auch next(), first(), last(), seek(), at(), isActive() und isValid().

QSqlRecord QSqlQuery::record() const

Gibt ein „ QSqlRecord “ zurück, das die Feldinformationen für die aktuelle Abfrage enthält. Wenn die Abfrage auf eine gültige Zeile verweist (isValid() gibt „true“ zurück), wird das Objekt mit den Werten der Zeile gefüllt. Es wird ein leeres Objekt zurückgegeben, wenn keine aktive Abfrage vorliegt (isActive() gibt „false“ zurück).

Um Werte aus einer Abfrage abzurufen, sollte ` value()` verwendet werden, da die indexbasierte Suche schneller ist.

Im folgenden Beispiel wird eine Abfrage mit ` SELECT * FROM ` ausgeführt. Da die Reihenfolge der Spalten nicht definiert ist, wird ` QSqlRecord::indexOf()` verwendet, um den Index einer Spalte zu ermitteln.

QSqlQuery q("select * from employees");
QSqlRecord rec = q.record();

qDebug() << "Number of columns: " << rec.count();

int nameCol = rec.indexOf("name"); // Index des Feldes „name“
while (q.next())
    qDebug() << q.value(nameCol).toString(); // output all names

Siehe auch value().

const QSqlResult *QSqlQuery::result() const

Gibt das Ergebnis der Abfrage zurück.

bool QSqlQuery::seek(int index, bool relative = false)

Ruft den Datensatz an Position index ab, sofern vorhanden, und positioniert die Abfrage auf dem abgerufenen Datensatz. Der erste Datensatz befindet sich an Position 0. Beachten Sie, dass sich die Abfrage im Status „ active “ befinden muss und isSelect() den Wert „true“ zurückgeben muss, bevor diese Funktion aufgerufen wird.

Ist relative falsch (Standard), gelten die folgenden Regeln:

  • Ist ` index ` negativ, wird das Ergebnis vor dem ersten Datensatz positioniert und `false` zurückgegeben.
  • Andernfalls wird versucht, zum Datensatz an der Position „ index “ zu springen. Konnte der Datensatz an der Position „ index “ nicht abgerufen werden, wird das Ergebnis hinter dem letzten Datensatz positioniert und „false“ zurückgegeben. Wurde der Datensatz erfolgreich abgerufen, wird „true“ zurückgegeben.

Ist „ relative “ „true“, gelten die folgenden Regeln:

  • Befindet sich der Cursor derzeit vor dem ersten Datensatz und:
    • index negativ oder Null ist, erfolgt keine Änderung und „false“ wird zurückgegeben.
    • index ist positiv, wird versucht, das Ergebnis an der absoluten Position „ index - 1“ zu positionieren, wobei die gleichen Regeln wie oben für den nicht-relativen Suchvorgang gelten.
  • Wenn sich das Ergebnis derzeit hinter dem letzten Datensatz befindet und:
    • index ist positiv oder null, erfolgt keine Änderung, und es wird „false“ zurückgegeben.
    • index negativ ist, wird versucht, das Ergebnis an der relativen Position „ index + 1“ ab dem letzten Datensatz zu positionieren, wobei die untenstehende Regel gilt.
  • Befindet sich das Ergebnis derzeit irgendwo in der Mitte und führt der relative Versatz „ index “ dazu, dass das Ergebnis unter Null rückt, wird das Ergebnis vor den ersten Datensatz positioniert und „false“ zurückgegeben.
  • Andernfalls wird versucht, zum Datensatz „ index “ vor dem aktuellen Datensatz zu springen (oder zu „ index “ hinter dem aktuellen Datensatz, falls „ index “ negativ ist). Wenn der Datensatz am Offset index nicht abgerufen werden konnte, wird die Position hinter den letzten Datensatz gesetzt, sofern index >= 0 ist (oder vor den ersten Datensatz, sofern index negativ ist), und es wird „false“ zurückgegeben. Wird der Datensatz erfolgreich abgerufen, wird „true“ zurückgegeben.

Siehe auch next(), previous(), first(), last(), at(), isActive() und isValid().

void QSqlQuery::setForwardOnly(bool forward)

Setzt „ forwardOnly “ auf „ forward “.

Hinweis: Setter -Funktion für die Eigenschaft „ forwardOnly “.

Siehe auch isForwardOnly(), forwardOnly, next() und seek().

void QSqlQuery::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)

Setzt „ numericalPrecisionPolicy “ auf „ precisionPolicy “.

Hinweis: Setter -Funktion für die Eigenschaft ` numericalPrecisionPolicy`.

Siehe auch numericalPrecisionPolicy().

[since 6.7] void QSqlQuery::setPositionalBindingEnabled(bool enable)

Setzt „ positionalBindingEnabled “ auf „ enable “.

Hinweis: Setter -Funktion für die Eigenschaft „ positionalBindingEnabled “.

Diese Funktion wurde in Qt 6.7 eingeführt.

Siehe auch „ isPositionalBindingEnabled()“ und „ positionalBindingEnabled “.

int QSqlQuery::size() const

Gibt die Größe des Ergebnisses (Anzahl der zurückgegebenen Zeilen) zurück oder -1, wenn die Größe nicht ermittelt werden kann oder wenn die Datenbank keine Informationen zur Abfragegröße bereitstellt. Beachten Sie, dass bei Nicht-SELECT -Anweisungen (isSelect() gibt „ false “ zurück) die Funktion size() den Wert -1 zurückgibt. Ist die Abfrage nicht aktiv (isActive() gibt „ false “ zurück), wird -1 zurückgegeben.

Um die Anzahl der von einer Nicht-SELECT -Anweisung betroffenen Zeilen zu ermitteln, verwenden Sie numRowsAffected().

Siehe auch „ isActive()“, „ numRowsAffected()“ und „ QSqlDriver::hasFeature()“.

[noexcept, since 6.2] void QSqlQuery::swap(QSqlQuery &other)

Ersetzt diese Abfrage durch „ other “. Dieser Vorgang ist sehr schnell und schlägt niemals fehl.

Diese Funktion wurde in Qt 6.2 eingeführt.

QVariant QSqlQuery::value(int index) const

Gibt den Wert des Feldes „ index “ im aktuellen Datensatz zurück.

Die Felder werden von links nach rechts anhand des Textes der Anweisung „ SELECT “ nummeriert, z. B. in

SELECT forename, surname FROM people;

Feld 0 ist „ forename “ und Feld 1 ist „ surname “. Die Verwendung von „ SELECT * “ wird nicht empfohlen, da die Reihenfolge der Felder in der Abfrage nicht definiert ist.

Ein ungültiges ` QVariant ` wird zurückgegeben, wenn das Feld ` index ` nicht existiert, wenn die Abfrage inaktiv ist oder wenn die Abfrage auf einem ungültigen Datensatz positioniert ist.

Siehe auch previous(), next(), first(), last(), seek(), isActive() und isValid().

QVariant QSqlQuery::value(QAnyStringView name) const

Gibt den Wert des Feldes „ name “ im aktuellen Datensatz zurück. Wenn das Feld „ name “ nicht vorhanden ist, wird eine ungültige Variante zurückgegeben.

Diese Überladung ist weniger effizient als „ value()“.

Hinweis: In Qt-Versionen vor 6.8 nahm diese Funktion „ QString “ als Argument entgegen, nicht „ QAnyStringView “.

Dies ist eine überladene Funktion.

[noexcept, since 6.2] QSqlQuery &QSqlQuery::operator=(QSqlQuery &&other)

Weist diesem Objekt „ other “ per Move-Zuweisung zu.

Diese Funktion wurde in Qt 6.2 eingeführt.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.