QSqlQuery Class
Die Klasse QSqlQuery bietet eine Möglichkeit zur Ausführung und Bearbeitung von SQL-Anweisungen. Mehr...
Kopfzeile: | #include <QSqlQuery> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake: | QT += sql |
- Liste aller Mitglieder, einschließlich vererbter Mitglieder
- Veraltete Mitglieder
- QSqlQuery ist Teil von Database Classes und Implicitly Shared Classes.
Öffentliche Typen
enum | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
Eigenschaften
(since 6.8)
forwardOnly : bool(since 6.8)
numericalPrecisionPolicy : QSql::NumericalPrecisionPolicy(since 6.8)
positionalBindingEnabled : bool
Ö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) |
Detaillierte Beschreibung
QSqlQuery kapselt die Funktionalität zum Erstellen, Navigieren und Abrufen von Daten aus SQL-Abfragen, die auf einer QSqlDatabase ausgeführt werden. Sie kann zum Ausführen von DML-Anweisungen (Data Manipulation Language), wie SELECT
, INSERT
, UPDATE
und DELETE
, sowie von DDL-Anweisungen (Data Definition Language), wie CREATE
TABLE
, verwendet werden. Sie kann auch verwendet werden, um datenbankspezifische Befehle auszuführen, die kein Standard-SQL sind (z. B. SET DATESTYLE=ISO
für PostgreSQL).
Erfolgreich ausgeführte SQL-Anweisungen setzen den Status der Abfrage auf aktiv, so dass isActive() true
zurückgibt. Andernfalls wird der Status der Abfrage auf inaktiv gesetzt. In beiden Fällen wird die Abfrage beim Ausführen einer neuen SQL-Anweisung auf einem ungültigen Datensatz positioniert. Eine aktive Abfrage muss zu einem gültigen Datensatz navigiert werden (so dass isValid() true
zurückgibt), bevor Werte abgerufen werden können.
Wenn bei einigen Datenbanken eine aktive Abfrage, die eine SELECT
-Anweisung ist, existiert, wenn Sie commit() oder rollback() aufrufen, schlägt die Übertragung oder das Rollback fehl. Siehe isActive() für Details.
Das Navigieren in Datensätzen wird mit den folgenden Funktionen durchgeführt:
Diese Funktionen ermöglichen es dem Programmierer, sich vorwärts, rückwärts oder beliebig durch die von der Abfrage zurückgegebenen Datensätze zu bewegen. Wenn Sie sich nur vorwärts durch die Ergebnisse bewegen müssen (z. B. mit next()), können Sie setForwardOnly() verwenden, was bei einigen Datenbanken eine erhebliche Menge an Speicher-Overhead spart und die Leistung verbessert. Sobald eine aktive Abfrage auf einen gültigen Datensatz positioniert ist, können die Daten mit value() abgerufen werden. Alle Daten werden vom SQL-Backend mit QVariants übertragen.
Zum 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). Auf jedes Feld in den von einer SELECT
-Anweisung zurückgegebenen Daten wird durch Übergabe der Feldposition in der Anweisung, beginnend mit 0, zugegriffen. Dies macht die Verwendung von SELECT *
-Abfragen nicht ratsam, da die Reihenfolge der zurückgegebenen Felder unbestimmt ist.
Aus Gründen der Effizienz gibt es keine Funktionen für den Zugriff auf ein Feld nach Namen (es sei denn, Sie verwenden vorbereitete Abfragen mit Namen, wie 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 Bindung von Parameterwerten an Platzhalter. Einige Datenbanken unterstützen diese Funktionen nicht, daher emuliert Qt für diese Datenbanken die erforderliche Funktionalität. Zum Beispiel haben die Oracle- und ODBC-Treiber die richtige Unterstützung für vorbereitete Abfragen, und Qt macht davon Gebrauch; aber für Datenbanken, die diese Unterstützung nicht haben, implementiert Qt die Funktion selbst, z.B. durch Ersetzen von Platzhaltern mit tatsächlichen Werten, wenn eine Abfrage ausgeführt wird. Verwenden Sie numRowsAffected(), um herauszufinden, wie viele Zeilen von einer nichtSELECT
Abfrage betroffen waren, und size(), um herauszufinden, wie viele von einer SELECT
abgefragt wurden.
Oracle-Datenbanken identifizieren Platzhalter durch die Verwendung einer Doppelpunkt-Namen-Syntax, z. B. :name
. ODBC verwendet einfach ?
Zeichen. Qt unterstützt beide Syntaxen, mit der Einschränkung, dass man sie nicht in der gleichen Abfrage mischen kann.
Sie können die Werte aller Felder in einer einzigen Variablen mit boundValues() abrufen.
Hinweis: Nicht alle SQL-Operationen unterstützen das Binden von Werten. Schauen Sie in der Dokumentation Ihres Datenbanksystems nach, um die Verfügbarkeit zu prüfen.
Ansätze zum Binden von Werten
Im Folgenden wird dasselbe Beispiel unter Verwendung der vier verschiedenen Bindungsansätze sowie ein Beispiel für die Bindung von Werten an eine gespeicherte Prozedur dargestellt.
Benannte Bindung mit benannten Platzhaltern:
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();
Positionale Bindung unter Verwendung von 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();
Bindung von Werten über positionale Platzhalter (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();
Bindung von Werten mit Hilfe 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();
Bindung von Werten an eine gespeicherte Prozedur:
Dieser Code ruft eine gespeicherte Prozedur namens AsciiToInt()
auf, übergibt ihr ein Zeichen über den in-Parameter und nimmt ihr Ergebnis im out-Parameter entgegen.
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.
Stored Procedures, die die return-Anweisung verwenden, um Werte zurückzugeben oder mehrere Ergebnismengen zurückzugeben, werden nicht vollständig unterstützt. Spezifische Details finden Sie unter SQL-Datenbank-Treiber.
Achtung! Sie müssen den SQL-Treiber laden und die Verbindung öffnen, bevor eine QSqlQuery erstellt wird. Außerdem muss die Verbindung geöffnet bleiben, solange die Abfrage existiert; andernfalls ist das Verhalten von QSqlQuery undefiniert.
Siehe auch QSqlDatabase, QSqlQueryModel, QSqlTableModel, und QVariant.
Dokumentation der Mitgliedstypen
enum QSqlQuery::BatchExecutionMode
Konstante | Wert | Beschreibung |
---|---|---|
QSqlQuery::ValuesAsRows | 0 | - Aktualisiert mehrere Zeilen. Behandelt jeden Eintrag in einer QVariantList als Wert für die Aktualisierung der nächsten Zeile. |
QSqlQuery::ValuesAsColumns | 1 | - Aktualisiert eine einzelne Zeile. Behandelt jeden Eintrag in einer QVariantList als einen einzelnen Wert eines Array-Typs. |
Eigenschaft Dokumentation
[since 6.8]
forwardOnly : bool
Diese Eigenschaft bestimmt den Modus "nur vorwärts". Wenn forward wahr ist, sind nur next() und seek() mit positiven Werten für die Navigation in den Ergebnissen zulässig.
Der Modus "Nur Vorwärts" kann (je nach Treiber) speichereffizienter sein, da die Ergebnisse nicht zwischengespeichert werden müssen. Außerdem wird die Leistung bei einigen Datenbanken verbessert. Damit dies der Fall ist, 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 ausführen kann.
Der Nur-Vorwärts-Modus ist standardmäßig ausgeschaltet.
Die Einstellung nur vorwärts auf false ist ein Vorschlag an die Datenbank-Engine, die das letzte Wort darüber hat, ob eine Ergebnismenge nur vorwärts oder scrollbar ist. isForwardOnly() wird immer den korrekten Status der Ergebnismenge zurückgeben.
Hinweis: Der Aufruf von setForwardOnly nach der Ausführung der Abfrage führt im besten Fall zu unerwarteten Ergebnissen und im schlimmsten Fall zu einem Absturz.
Hinweis: Um sicherzustellen, dass die Nur-Vorwärts-Abfrage erfolgreich abgeschlossen wurde, sollte die Anwendung lastError() nicht nur nach der Ausführung der Abfrage, sondern auch nach dem Navigieren in den Abfrageergebnissen auf einen Fehler überprüfen.
Warnung: PostgreSQL: Führen Sie während der Navigation in den Abfrageergebnissen im Forward-Only-Modus keine anderen SQL-Befehle auf derselben Datenbankverbindung aus. Dies führt dazu, dass die Abfrageergebnisse verloren gehen.
Diese Eigenschaft wurde in Qt 6.8 eingeführt.
Zugriffsfunktionen:
bool | isForwardOnly() const |
void | setForwardOnly(bool forward) |
[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 z. B. numerische Werte als Zeichenketten abrufen, um den Verlust der Genauigkeit zu vermeiden. Wenn eine hohe Genauigkeit keine Rolle spielt, können Sie mit dieser Methode die Ausführungsgeschwindigkeit erhöhen, indem Sie die String-Konvertierung umgehen.
Hinweis: Treiber, die das Abrufen von numerischen Werten mit geringer Genauigkeit nicht unterstützen, ignorieren die Präzisionsrichtlinie. Sie können QSqlDriver::hasFeature() verwenden, um herauszufinden, ob ein Treiber diese Funktion unterstützt.
Hinweis: Die Einstellung der Präzisionsrichtlinie hat keinen Einfluss auf die gerade aktive Abfrage. Rufen Sie exec(QString) oder prepare() auf, um die Richtlinie zu aktivieren.
Diese Eigenschaft 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 Positionsbindung binding für diese Abfrage, abhängig von enable (Standard ist true
). Das Deaktivieren von Positionsbindungen ist nützlich, wenn die Abfrage selbst ein '?' enthält, das nicht als Parameter für Positionsbindungen, sondern z.B. 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 hat (siehe auch QSqlDriver::PositionalPlaceholders).
Diese Eigenschaft wurde in Qt 6.8 eingeführt.
Zugriffsfunktionen:
bool | isPositionalBindingEnabled() const |
void | setPositionalBindingEnabled(bool enable) |
Dokumentation der Mitgliedsfunktionen
[explicit]
QSqlQuery::QSqlQuery(QSqlResult *result)
Konstruiert ein QSqlQuery-Objekt, das die QSqlResult result zur Kommunikation mit einer Datenbank verwendet.
[explicit]
QSqlQuery::QSqlQuery(const QSqlDatabase &db)
Konstruiert ein QSqlQuery-Objekt unter Verwendung der Datenbank db. Wenn db ungültig ist, wird die Standarddatenbank der Anwendung verwendet.
Siehe auch QSqlDatabase.
[explicit]
QSqlQuery::QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())
Konstruiert ein QSqlQuery-Objekt unter Verwendung des SQL query und der Datenbank db. Wenn db nicht angegeben wird oder ungültig ist, wird die Standarddatenbank der Anwendung verwendet. Wenn query kein leerer String ist, wird er ausgeführt.
Siehe auch QSqlDatabase.
[noexcept, since 6.2]
QSqlQuery::QSqlQuery(QSqlQuery &&other)
Move-konstruiert eine QSqlQuery aus other.
Diese Funktion wurde in Qt 6.2 eingeführt.
[noexcept]
QSqlQuery::~QSqlQuery()
Zerstört das Objekt und gibt alle zugewiesenen Ressourcen frei.
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
Fügt den Wert val in die Liste der Werte ein, wenn positionale Wertbindung verwendet wird. Die Reihenfolge der addBindValue()-Aufrufe bestimmt, an welchen Platzhalter ein Wert in der vorbereiteten Abfrage gebunden werden soll. Wenn paramType QSql::Out oder QSql::InOut ist, wird der Platzhalter nach dem Aufruf exec() mit Daten aus der Datenbank überschrieben.
Um einen NULL-Wert zu binden, verwenden Sie eine 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 der Position Null. Wenn die Position ungültig ist, gibt die Funktion QSql::BeforeFirstRow oder QSql::AfterLastRow zurück, was spezielle negative Werte sind.
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 den Platzhalter placeholder fest, der in der vorbereiteten Anweisung an den Wert val gebunden werden soll. Beachten Sie, dass die Platzhaltermarkierung (z. B. :
) bei der Angabe des Platzhalternamens enthalten sein muss. Wenn paramType QSql::Out oder QSql::InOut ist, wird der Platzhalter nach dem Aufruf von exec() mit Daten aus der Datenbank überschrieben. In diesem Fall muss im Voraus genügend Platz für die Speicherung des Ergebnisses reserviert werden.
Um einen NULL-Wert zu binden, verwenden Sie eine Null QVariant; verwenden Sie z.B. QVariant(QMetaType::fromType<QString>())
, wenn Sie eine Zeichenkette binden wollen.
Siehe auch addBindValue(), prepare(), exec(), boundValue(), und boundValues().
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
Stellen Sie den Platzhalter an der Position pos so ein, dass er an den Wert val in der vorbereiteten Anweisung gebunden ist. Die Feldnummerierung beginnt bei 0. Wenn paramType QSql::Out oder QSql::InOut ist, 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 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 gebundenen Wert name an der Position pos zurück.
Die Reihenfolge der Liste ist die Bindungsreihenfolge, unabhängig davon, ob benannte oder positionale 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 ist die Bindungsreihenfolge, unabhängig davon, ob eine benannte oder eine positionale Bindung verwendet wird.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch boundValues() und boundValueName().
[since 6.0]
QVariantList QSqlQuery::boundValues() const
Gibt eine Liste von gebundenen Werten zurück.
Die Reihenfolge der Liste entspricht der Reihenfolge der Bindung, unabhängig davon, ob eine benannte oder eine positionale Bindung verwendet wird.
Die gebundenen Werte können auf die folgende Weise untersucht 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 gehaltenen Ressourcen frei. Setzt den Abfragestatus auf inaktiv. Sie sollten diese Funktion selten, wenn überhaupt, aufrufen müssen.
const QSqlDriver *QSqlQuery::driver() const
Gibt den mit der Abfrage verbundenen 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 zurückgesetzt wird, wenn exec() aufgerufen wird.
Siehe auch prepare(), bindValue(), addBindValue(), boundValue(), und boundValues().
bool QSqlQuery::exec(const QString &query)
Führt die SQL 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 befindet sich die Abfrage auf einem ungültigen Datensatz und muss zu einem gültigen Datensatz navigiert werden, bevor Datenwerte abgerufen werden können (z. B. mit next()).
Beachten Sie, dass der letzte Fehler für diese Abfrage zurückgesetzt wird, wenn exec() aufgerufen wird.
Bei SQLite kann der Abfrage-String jeweils nur eine Anweisung enthalten. Wenn mehr als eine Anweisung angegeben wird, 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 in einem Batch aus. Alle gebundenen Parameter müssen Listen von Varianten sein. Wenn die Datenbank keine Batch-Ausführung unterstützt, simuliert der Treiber dies mit herkömmlichen exec()-Aufrufen.
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 eine Null QVariant des entsprechenden Typs zu der gebundenen QVariantList hinzugefügt werden; zum Beispiel sollte QVariant(QMetaType::fromType<QString>())
verwendet werden, wenn Sie Strings verwenden.
Hinweis: Jede gebundene QVariantList muss die gleiche Anzahl von Varianten enthalten.
Hinweis: Der Typ der QVarianten in einer Liste darf sich nicht ändern. Zum Beispiel können Sie keine Integer- und String-Varianten innerhalb einer QVariantList mischen.
Der Parameter mode gibt an, wie die gebundene QVariantList interpretiert werden soll. Wenn mode ValuesAsRows
ist, wird jede Variante innerhalb von 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 von 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 nur aus 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 letzte Abfrage zurück, die erfolgreich ausgeführt wurde.
In den meisten Fällen gibt diese Funktion die gleiche Zeichenkette zurück wie lastQuery(). Wenn eine vorbereitete Abfrage mit Platzhaltern auf einem DBMS ausgeführt wird, das diese nicht unterstützt, wird die Vorbereitung dieser Abfrage emuliert. Die Platzhalter in der ursprünglichen Abfrage werden durch ihre gebundenen Werte ersetzt, um eine neue Abfrage zu bilden. Diese Funktion gibt die geänderte Abfrage zurück. Sie ist vor allem für Debugging-Zwecke nützlich.
Siehe auch lastQuery().
void QSqlQuery::finish()
Weist den Datenbanktreiber an, dass keine weiteren Daten aus dieser Abfrage geholt werden, bis sie erneut ausgeführt wird. Normalerweise ist es nicht notwendig, diese Funktion aufzurufen, aber es kann hilfreich sein, um Ressourcen wie Sperren oder Cursor freizugeben, wenn Sie die Abfrage zu einem späteren Zeitpunkt wieder verwenden wollen.
Setzt die Abfrage auf inaktiv. Gebundene Werte behalten ihre Werte.
Siehe auch prepare(), exec(), und isActive().
bool QSqlQuery::first()
Ruft den ersten Datensatz im Ergebnis ab, falls verfügbar, und positioniert die Abfrage auf dem abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Zustand active befinden muss und isSelect() true zurückgeben muss, bevor Sie diese Funktion aufrufen, da sie sonst nichts tut und false zurückgibt. Gibt bei Erfolg true
zurück. Wenn die Abfrage nicht erfolgreich war, wird die Position 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 ist eine Abfrage, die erfolgreich exec() ausgeführt, aber noch nicht beendet wurde. Wenn Sie mit einer aktiven Abfrage fertig sind, können Sie die Abfrage inaktiv machen, indem Sie finish() oder clear() aufrufen, oder Sie können die Instanz QSqlQuery löschen.
Hinweis: Von besonderem Interesse ist eine aktive Abfrage, die eine SELECT
Anweisung ist. Bei einigen Datenbanken, die Transaktionen unterstützen, kann eine aktive Abfrage, die eine SELECT
-Anweisung ist, dazu führen, dass eine commit() oder eine rollback() fehlschlägt. Bevor Sie also ein Commit oder ein Rollback durchführen, sollten Sie Ihre aktive SELECT
-Anweisungsabfrage auf eine der oben genannten Arten inaktiv machen.
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 ist, die Abfrage nicht auf einen gültigen Datensatz positioniert ist, es keinen solchen field gibt oder field null ist; andernfalls false
. Beachten Sie, dass isNull() bei einigen Treibern erst dann genaue Informationen zurückgibt, wenn ein Versuch unternommen wurde, Daten abzurufen.
Siehe auch isActive(), isValid(), und value().
bool QSqlQuery::isNull(QAnyStringView name) const
Dies ist eine überladene Funktion.
Gibt true
zurück, wenn es kein Feld mit diesem name gibt; 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 und nicht QAnyStringView.
[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 die aktuelle Abfrage eine SELECT
-Anweisung ist; andernfalls gibt sie false
zurück.
bool QSqlQuery::isValid() const
Gibt true
zurück, wenn die Abfrage aktuell auf einem gültigen Datensatz positioniert ist; andernfalls wird false
zurückgegeben.
bool QSqlQuery::last()
Ruft den letzten Datensatz im Ergebnis ab, sofern verfügbar, und positioniert die Abfrage auf den abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Zustand active befinden muss und isSelect() true zurückgeben muss, bevor Sie diese Funktion aufrufen, da sie sonst nichts tut und false zurückgibt. Gibt bei Erfolg true
zurück. Wenn die Abfrage nicht erfolgreich war, wird die Position 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 über den 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, wenn die Datenbank dies unterstützt. Eine ungültige QVariant 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 erstellt wurden. Überprüfen Sie die Konfigurationsvariable default_with_oids
, um sicher zu sein.
Siehe auch QSqlDriver::hasFeature().
QString QSqlQuery::lastQuery() const
Gibt den Text der aktuell verwendeten Abfrage zurück oder eine leere Zeichenkette, wenn es keinen aktuellen Abfragetext gibt.
Siehe auch executedQuery().
bool QSqlQuery::next()
Ruft den nächsten Datensatz im Ergebnis ab, sofern verfügbar, und positioniert die Abfrage auf den abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Zustand active befinden muss und isSelect() true zurückgeben muss, bevor Sie diese Funktion aufrufen, da sie sonst nichts tut und false zurückgibt.
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 nach dem letzten Datensatz, gibt es keine Änderung und es wird false zurückgegeben.
- Befindet sich das Ergebnis irgendwo in der Mitte, wird versucht, den nächsten Datensatz abzurufen.
Konnte der Datensatz nicht abgerufen werden, 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 navigiert zur nächsten, falls verfügbar.
Einige Datenbanken sind in der Lage, mehrere Ergebnismengen für gespeicherte Prozeduren oder SQL-Batches (Abfrage-Strings, die mehrere Anweisungen enthalten) zurückzugeben. Wenn nach der Ausführung einer Abfrage mehrere Ergebnissätze verfügbar sind, kann diese Funktion verwendet werden, um zum nächsten Ergebnissatz bzw. zu den nächsten Ergebnissätzen zu navigieren.
Wenn ein neuer Ergebnissatz verfügbar ist, gibt diese Funktion true zurück. Die Abfrage wird auf einem ungültigen Datensatz in der neuen Ergebnismenge neu positioniert und muss zu einem gültigen Datensatz navigiert werden, bevor Datenwerte abgerufen werden können. Wenn keine neue Ergebnismenge verfügbar ist, gibt die Funktion false
zurück und die Abfrage wird auf inaktiv gesetzt. In jedem Fall wird der alte Ergebnissatz verworfen.
Wenn es sich bei einer der Anweisungen um eine Nicht-Auswahl-Anweisung handelt, kann anstelle einer Ergebnismenge eine Zählung der betroffenen Zeilen verfügbar sein.
Beachten Sie, dass einige Datenbanken, z. B. Microsoft SQL Server, bei der Arbeit mit mehreren Ergebnismengen nicht blätterbare Cursor erfordern. Einige Datenbanken können alle Anweisungen auf einmal ausführen, während andere die Ausführung verzögern, bis tatsächlich auf die Ergebnismenge zugegriffen wird, und einige Datenbanken können Beschränkungen hinsichtlich der Anweisungen haben, 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 sie nicht ermittelt werden kann. Beachten Sie, dass der Wert für SELECT
Anweisungen undefiniert ist; verwenden Sie stattdessen size(). Wenn die Abfrage nicht 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 zur Ausführung vor. Gibt true
zurück, wenn die Abfrage erfolgreich vorbereitet wurde; andernfalls wird false
zurückgegeben.
Die Abfrage kann Platzhalter für Bindungswerte enthalten. Es werden sowohl Platzhalter im Oracle-Stil mit Doppelpunkt (z. B. :surname
) als auch im ODBC-Stil (?
) unterstützt; sie können jedoch nicht in derselben Abfrage gemischt werden. Siehe Detailed Description für Beispiele.
Hinweise zur Portabilität: Einige Datenbanken verzögern die Vorbereitung einer Abfrage, bis sie das erste Mal ausgeführt wird. In diesem Fall ist die Vorbereitung einer syntaktisch falschen Abfrage erfolgreich, aber jede nachfolgende exec() wird fehlschlagen. Wenn die Datenbank benannte Platzhalter nicht direkt unterstützt, kann der Platzhalter nur Zeichen im Bereich [a-zA-Z0-9_] enthalten.
Bei SQLite kann die Abfragezeichenfolge jeweils nur eine Anweisung enthalten. Wenn mehr als eine Anweisung angegeben wird, 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, falls verfügbar, und positioniert die Abfrage auf dem abgerufenen Datensatz. Beachten Sie, dass sich das Ergebnis im Zustand active befinden muss und isSelect() true zurückgeben muss, bevor Sie diese Funktion aufrufen, da sie sonst nichts tut und false zurückgibt.
Es gelten die folgenden Regeln:
- Befindet sich das Ergebnis derzeit vor dem ersten Datensatz, gibt es keine Änderung und false wird zurückgegeben.
- Befindet sich das Ergebnis hinter dem letzten Datensatz, wird versucht, den letzten Datensatz abzurufen.
- Liegt das Ergebnis irgendwo in der Mitte, wird versucht, den vorherigen Datensatz abzurufen.
Konnte der Datensatz nicht abgerufen werden, wird das Ergebnis vor den ersten Datensatz gesetzt 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 eine QSqlRecord zurück, die die Feldinformationen für die aktuelle Abfrage enthält. Wenn die Abfrage auf eine gültige Zeile verweist (isValid() gibt true zurück), wird der Datensatz mit den Werten der Zeile aufgefüllt. Ein leerer Datensatz wird zurückgegeben, wenn es keine aktive Abfrage gibt (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 SELECT * FROM
Abfrage ausgeführt. Da die Reihenfolge der Spalten nicht definiert ist, wird QSqlRecord::indexOf() verwendet, um den Index einer Spalte zu erhalten.
QSqlQuery q("select * from mitarbeiter");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 mit der Abfrage verbundene Ergebnis zurück.
bool QSqlQuery::seek(int index, bool relative = false)
Ruft den Datensatz an der Position index ab, falls verfügbar, und positioniert die Abfrage auf dem abgerufenen Datensatz. Der erste Datensatz befindet sich an Position 0. Beachten Sie, dass sich die Abfrage im Zustand active befinden muss und isSelect() true zurückgeben muss, bevor Sie diese Funktion aufrufen.
Wenn relative falsch ist (die Voreinstellung), gelten die folgenden Regeln:
- Wenn index negativ ist, wird das Ergebnis vor dem ersten Datensatz positioniert und false wird zurückgegeben.
- Andernfalls wird versucht, zu dem 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.
Wenn relative true ist, gelten die folgenden Regeln:
- Wenn das Ergebnis derzeit vor dem ersten Datensatz steht und:
- index negativ oder Null ist, gibt es keine Änderung, und false wird zurückgegeben.
- index positiv ist, wird versucht, das Ergebnis an der absoluten Position index - 1 zu positionieren, wobei dieselbe Regel wie für die nicht relative Suche (siehe oben) gilt.
- Wenn das Ergebnis derzeit hinter dem letzten Datensatz positioniert ist und:
- index positiv oder Null ist, gibt es keine Änderung, und false wird zurückgegeben.
- index negativ ist, wird versucht, das Ergebnis an der Position index + 1 relativ zum letzten Datensatz zu positionieren, gemäß der unten stehenden Regel.
- Befindet sich das Ergebnis derzeit irgendwo in der Mitte und der relative Versatz index verschiebt das Ergebnis unter Null, wird das Ergebnis vor dem ersten Datensatz positioniert und false zurückgegeben.
- Andernfalls wird versucht, zu dem Datensatz index zu gelangen, der vor dem aktuellen Datensatz liegt (oder index, der hinter dem aktuellen Datensatz liegt, wenn index negativ ist). Konnte der Datensatz am Offset index nicht abgerufen werden, wird das Ergebnis nach dem letzten Datensatz positioniert, wenn index >= 0 ist, (oder vor dem ersten Datensatz, wenn index negativ ist), und false wird zurückgegeben. Wenn der Datensatz erfolgreich abgerufen wurde, 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 zurück (Anzahl der zurückgegebenen Zeilen) oder -1, wenn die Größe nicht ermittelt werden kann oder wenn die Datenbank keine Informationen über die Abfragegröße liefert. Beachten Sie, dass bei Anweisungen, die nichtSELECT
sind (isSelect() gibt false
zurück), size() -1 zurückgibt. Wenn die Abfrage nicht aktiv ist (isActive() gibt false
zurück), wird -1 zurückgegeben.
Um die Anzahl der Zeilen zu ermitteln, die von einer nichtSELECT
Anweisung betroffen sind, verwenden Sie numRowsAffected().
Siehe auch isActive(), numRowsAffected(), und QSqlDriver::hasFeature().
[noexcept, since 6.2]
void QSqlQuery::swap(QSqlQuery &other)
Tauscht diese Abfrage mit other aus. Dieser Vorgang ist sehr schnell und schlägt nie 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 nummeriert, wobei der Text der Anweisung SELECT
verwendet wird, 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 undefiniert 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
Dies ist eine überladene Funktion.
Gibt den Wert des Feldes mit dem Namen name im aktuellen Datensatz zurück. Wenn das Feld name nicht existiert, 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 und nicht QAnyStringView.
[noexcept, since 6.2]
QSqlQuery &QSqlQuery::operator=(QSqlQuery &&other)
Move-weist other diesem Objekt zu.
Diese Funktion wurde in Qt 6.2 eingeführt.
© 2025 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.