QSqlQuery Class
La clase QSqlQuery proporciona un medio para ejecutar y manipular sentencias SQL. Más...
| Cabecera: | #include <QSqlQuery> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql)target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
- Lista de todos los miembros, incluidos los heredados
- Miembros obsoletos
- QSqlQuery es parte de Clases de Bases de Datos y Clases Implícitamente Compartidas.
Tipos Públicos
| enum | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
Propiedades
(since 6.8)forwardOnly : bool(since 6.8)numericalPrecisionPolicy : QSql::NumericalPrecisionPolicy(since 6.8)positionalBindingEnabled : bool
Funciones públicas
| 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) |
Descripción detallada
QSqlQuery encapsula la funcionalidad implicada en la creación, navegación y recuperación de datos de consultas SQL que se ejecutan en un QSqlDatabase. Puede utilizarse para ejecutar sentencias DML (lenguaje de manipulación de datos), como SELECT, INSERT, UPDATE y DELETE, así como sentencias DDL (lenguaje de definición de datos), como CREATE TABLE . También puede utilizarse para ejecutar comandos específicos de bases de datos que no sean SQL estándar (por ejemplo, SET DATESTYLE=ISO para PostgreSQL).
Las sentencias SQL ejecutadas correctamente establecen el estado de la consulta en activo, de modo que isActive() devuelve true. En caso contrario, el estado de la consulta pasa a inactivo. En cualquier caso, al ejecutar una nueva sentencia SQL, la consulta se posiciona en un registro no válido. Una consulta activa debe desplazarse a un registro válido (de modo que isValid() devuelva true) antes de poder recuperar los valores.
En algunas bases de datos, si existe una consulta activa que es una sentencia SELECT cuando se llama a commit() o rollback(), el commit o rollback fallará. Consulte isActive() para obtener más información.
La navegación por los registros se realiza con las siguientes funciones:
Estas funciones permiten al programador avanzar, retroceder o desplazarse arbitrariamente por los registros devueltos por la consulta. Si sólo necesita avanzar por los resultados (por ejemplo, utilizando next()), puede utilizar setForwardOnly(), que ahorrará una cantidad significativa de memoria y mejorará el rendimiento en algunas bases de datos. Una vez que una consulta activa se sitúa en un registro válido, los datos pueden recuperarse utilizando value(). Todos los datos se transfieren desde el backend SQL utilizando QVariants.
Por ejemplo:
QSqlQuery query("SELECT country FROM artist"); while (query.next()) { QString country = query.value(0).toString(); doSomething(country); }
Para acceder a los datos devueltos por una consulta, utilice value(int). Se accede a cada campo de los datos devueltos por una sentencia SELECT pasando la posición del campo en la sentencia, empezando por 0. Esto desaconseja el uso de consultas SELECT * porque el orden de los campos devueltos es indeterminado.
En aras de la eficacia, no existen funciones para acceder a un campo por su nombre (a menos que se utilicen consultas preparadas con nombres, como se explica más adelante). Para convertir un nombre de campo en un índice, utilice record().indexOf(), por ejemplo:
QSqlQuery query("SELECT * FROM artist"); int fieldNo = query.record().indexOf("country"); while (query.next()) { QString country = query.value(fieldNo).toString(); doSomething(country); }
QSqlQuery admite la ejecución de consultas preparadas y la vinculación de valores de parámetros a marcadores de posición. Algunas bases de datos no soportan estas características, por lo que para ellas, Qt emula la funcionalidad requerida. Por ejemplo, los controladores Oracle y ODBC tienen soporte para consultas preparadas, y Qt hace uso de él; pero para las bases de datos que no tienen este soporte, Qt implementa la característica por sí mismo, por ejemplo, mediante la sustitución de los marcadores de posición con los valores reales cuando se ejecuta una consulta. Utilice numRowsAffected() para averiguar cuántas filas se vieron afectadas por una consulta que no eraSELECT, y size() para averiguar cuántas fueron recuperadas por una SELECT.
Las bases de datos Oracle identifican los marcadores de posición utilizando una sintaxis de dos puntos, por ejemplo :name. ODBC utiliza simplemente los caracteres ?. Qt admite ambas sintaxis, con la restricción de que no se pueden mezclar en la misma consulta.
Puedes recuperar los valores de todos los campos de una única variable utilizando boundValues().
Nota: No todas las operaciones SQL admiten la vinculación de valores. Consulte la documentación de su sistema de base de datos para comprobar su disponibilidad.
Métodos para vincular valores
A continuación presentamos el mismo ejemplo utilizando cada uno de los cuatro enfoques de vinculación diferentes, así como un ejemplo de vinculación de valores a un procedimiento almacenado.
Vinculación con nombre utilizando marcadores de posición con nombre:
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();
Vinculación posicional utilizando marcadores de posición con nombre:
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();
Vinculación de valores mediante marcadores de posición (versión 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();
Vinculación de valores mediante marcadores de posición (versión 2):
QSqlQuery query; query.prepare("INSERT INTO person (id, forename, surname) " "VALUES (?, ?, ?)"); query.addBindValue(1001); query.addBindValue("Bart"); query.addBindValue("Simpson"); query.exec();
Vinculación de valores a un procedimiento almacenado:
Este código llama a un procedimiento almacenado llamado AsciiToInt(), pasándole un carácter a través de su parámetro in, y tomando su resultado en el parámetro out.
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
Tenga en cuenta que los parámetros no vinculados conservarán sus valores.
Los procedimientos almacenados que utilizan la sentencia return para devolver valores, o devolver múltiples conjuntos de resultados, no están totalmente soportados. Para obtener más información, consulte Controladores de bases de datos SQL.
Advertencia: Debe cargar el controlador SQL y abrir la conexión antes de crear una QSqlQuery. Además, la conexión debe permanecer abierta mientras exista la consulta; de lo contrario, el comportamiento de QSqlQuery es indefinido.
Ver también QSqlDatabase, QSqlQueryModel, QSqlTableModel, y QVariant.
Documentación de tipos de miembros
enum QSqlQuery::BatchExecutionMode
| Constante | Valor | Descripción |
|---|---|---|
QSqlQuery::ValuesAsRows | 0 | - Actualiza varias filas. Trata cada entrada de QVariantList como un valor para actualizar la siguiente fila. |
QSqlQuery::ValuesAsColumns | 1 | - Actualiza una sola fila. Trata cada entrada de QVariantList como un único valor de tipo array. |
Documentación de la propiedad
[since 6.8] forwardOnly : bool
Esta propiedad mantiene el modo sólo hacia adelante. Si forward es verdadero, sólo next() y seek() con valores positivos, se permiten para navegar por los resultados.
El modo sólo hacia adelante puede ser (dependiendo del controlador) más eficiente en memoria ya que los resultados no necesitan ser almacenados en caché. También mejorará el rendimiento en algunas bases de datos. Para que esto sea así, debe llamar a setForwardOnly() antes de que se prepare o ejecute la consulta. Tenga en cuenta que el constructor que toma una consulta y una base de datos puede ejecutar la consulta.
El modo forward only está desactivado por defecto.
Establecer forward only a false es una sugerencia al motor de la base de datos, que tiene la última palabra sobre si un conjunto de resultados es forward only o scrollable. isForwardOnly() siempre devolverá el estado correcto del conjunto de resultados.
Nota: Si se llama a setForwardOnly después de la ejecución de la consulta, en el mejor de los casos se obtendrán resultados inesperados y, en el peor, se producirá un error.
Nota: Para asegurarse de que la consulta sólo hacia adelante se ha completado con éxito, la aplicación debe comprobar lastError() en busca de un error no sólo después de ejecutar la consulta, sino también después de navegar por los resultados de la consulta.
Advertencia: PostgreSQL: Mientras navega por los resultados de la consulta en modo forward-only, no ejecute ningún otro comando SQL en la misma conexión de base de datos. Esto hará que se pierdan los resultados de la consulta.
Esta propiedad se introdujo en Qt 6.8.
Funciones de acceso:
| bool | isForwardOnly() const |
| void | setForwardOnly(bool forward) |
Véase también next() y seek().
[since 6.8] numericalPrecisionPolicy : QSql::NumericalPrecisionPolicy
Indica al controlador de la base de datos que devuelva valores numéricos con una precisión especificada por precisionPolicy.
El controlador de Oracle, por ejemplo, puede recuperar valores numéricos como cadenas para evitar la pérdida de precisión. Si la alta precisión no importa, utilice este método para aumentar la velocidad de ejecución evitando las conversiones de cadenas.
Nota: Los controladores que no soportan la obtención de valores numéricos con baja precisión ignorarán la política de precisión. Puede utilizar QSqlDriver::hasFeature() para averiguar si un controlador admite esta función.
Nota: Establecer la política de precisión no afecta a la consulta activa en ese momento. Llame a exec(QString) o prepare() para activar la política.
Esta propiedad se introdujo en Qt 6.8.
Funciones de acceso:
| QSql::NumericalPrecisionPolicy | numericalPrecisionPolicy() const |
| void | setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) |
Véase también QSql::NumericalPrecisionPolicy, QSqlDriver::numericalPrecisionPolicy, y QSqlDatabase::numericalPrecisionPolicy.
[since 6.8] positionalBindingEnabled : bool
Esta propiedad habilita o deshabilita los enlaces posicionales binding para esta consulta, dependiendo de enable (por defecto es true). Deshabilitar las vinculaciones posicionales es útil si la propia consulta contiene un '?' que no debe ser manejado como un parámetro de vinculación posicional sino, por ejemplo, como un operador JSON para una base de datos PostgreSQL.
Esta propiedad no tendrá efecto cuando la base de datos tenga soporte nativo para enlaces posicionales con signos de interrogación (véase también QSqlDriver::PositionalPlaceholders).
Esta propiedad se introdujo en Qt 6.8.
Funciones de acceso:
| bool | isPositionalBindingEnabled() const |
| void | setPositionalBindingEnabled(bool enable) |
Documentación de funciones miembro
[explicit] QSqlQuery::QSqlQuery(QSqlResult *result)
Construye un objeto QSqlQuery que utiliza QSqlResult result para comunicarse con una base de datos.
[explicit] QSqlQuery::QSqlQuery(const QSqlDatabase &db)
Construye un objeto QSqlQuery utilizando la base de datos db. Si db no es válida, se utilizará la base de datos por defecto de la aplicación.
Véase también QSqlDatabase.
[explicit] QSqlQuery::QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())
Construye un objeto QSqlQuery utilizando el SQL query y la base de datos db. Si db no se especifica, o no es válido, se utiliza la base de datos por defecto de la aplicación. Si query no es una cadena vacía, se ejecutará.
Véase también QSqlDatabase.
[noexcept, since 6.2] QSqlQuery::QSqlQuery(QSqlQuery &&other)
Move-construye una QSqlQuery a partir de other.
Esta función se introdujo en Qt 6.2.
[noexcept] QSqlQuery::~QSqlQuery()
Destruye el objeto y libera los recursos asignados.
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
Añade el valor val a la lista de valores cuando se utiliza la vinculación posicional de valores. El orden de las llamadas a addBindValue() determina a qué marcador de posición se vinculará un valor en la consulta preparada. Si paramType es QSql::Out o QSql::InOut, el marcador de posición se sobrescribirá con datos de la base de datos después de la llamada a exec().
Para vincular un valor NULL, utilice un valor nulo QVariant; por ejemplo, utilice QVariant(QMetaType::fromType<QString>()) si está vinculando una cadena.
Véase también bindValue(), prepare(), exec(), boundValue() y boundValues().
int QSqlQuery::at() const
Devuelve la posición interna actual de la consulta. El primer registro está en la posición cero. Si la posición no es válida, la función devuelve QSql::BeforeFirstRow o QSql::AfterLastRow, que son valores negativos especiales.
Véase también previous(), next(), first(), last(), seek(), isActive() y isValid().
void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
Establezca el marcador de posición placeholder para que se vincule al valor val en la sentencia preparada. Tenga en cuenta que la marca del marcador de posición (por ejemplo, :) debe incluirse al especificar el nombre del marcador de posición. Si paramType es QSql::Out o QSql::InOut, el marcador de posición se sobrescribirá con datos de la base de datos después de la llamada a exec(). En este caso, debe preasignarse espacio suficiente para almacenar el resultado.
Para vincular un valor NULL, utilice un valor nulo QVariant; por ejemplo, utilice QVariant(QMetaType::fromType<QString>()) si está vinculando una cadena.
Véase también addBindValue(), prepare(), exec(), boundValue() y boundValues().
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
Establezca el marcador de posición en la posición pos para que se vincule al valor val en la sentencia preparada. La numeración de campos comienza en 0. Si paramType es QSql::Out o QSql::InOut, el marcador de posición se sobrescribirá con datos de la base de datos después de la llamada a exec().
QVariant QSqlQuery::boundValue(const QString &placeholder) const
Devuelve el valor de placeholder.
Véase también boundValues(), bindValue() y addBindValue().
QVariant QSqlQuery::boundValue(int pos) const
Devuelve el valor del marcador de posición en la posición pos.
Véase también boundValues().
[since 6.6] QString QSqlQuery::boundValueName(int pos) const
Devuelve el nombre del valor vinculado en la posición pos.
El orden de la lista es el orden de vinculación, independientemente de si se utiliza la vinculación por nombre o posicional.
Esta función se introdujo en Qt 6.6.
Véase también boundValueNames().
[since 6.6] QStringList QSqlQuery::boundValueNames() const
Devuelve los nombres de todos los valores vinculados.
El orden de la lista es el orden de vinculación, independientemente de si se utiliza la vinculación por nombre o posicional.
Esta función se introdujo en Qt 6.6.
Véase también boundValues() y boundValueName().
[since 6.0] QVariantList QSqlQuery::boundValues() const
Devuelve una lista de valores vinculados.
El orden de la lista es el orden de vinculación, independientemente de si se utiliza la vinculación por nombre o por posición.
Los valores vinculados pueden examinarse de la siguiente manera:
const QVariantList list = query.boundValues(); for (qsizetype i = 0; i < list.size(); ++i) qDebug() << i << ":" << list.at(i).toString();
Esta función se introdujo en Qt 6.0.
Véase también boundValue(), bindValue(), addBindValue() y boundValueNames().
void QSqlQuery::clear()
Borra el conjunto de resultados y libera los recursos retenidos por la consulta. Establece el estado de la consulta como inactivo. Rara vez o nunca debería necesitar llamar a esta función.
const QSqlDriver *QSqlQuery::driver() const
Devuelve el controlador de base de datos asociado a la consulta.
bool QSqlQuery::exec()
Ejecuta una consulta SQL previamente preparada. Devuelve true si la consulta se ejecutó correctamente; en caso contrario devuelve false.
Tenga en cuenta que el último error de esta consulta se restablece cuando se llama a exec().
Véase también prepare(), bindValue(), addBindValue(), boundValue() y boundValues().
bool QSqlQuery::exec(const QString &query)
Ejecuta el SQL en query. Devuelve true y establece el estado de la consulta en active si la consulta se ha realizado correctamente; en caso contrario, devuelve false. La cadena query debe utilizar la sintaxis adecuada para la base de datos SQL consultada (por ejemplo, SQL estándar).
Una vez ejecutada la consulta, ésta se posiciona en un registro no válido y debe navegarse hasta un registro válido antes de poder recuperar los valores de los datos (por ejemplo, utilizando next()).
Tenga en cuenta que el último error de esta consulta se restablece cuando se llama a exec().
En SQLite, la cadena de consulta sólo puede contener una sentencia cada vez. Si se proporciona más de una sentencia, la función devuelve false.
Ejemplo:
QSqlQuery query; query.exec("INSERT INTO employee (id, name, salary) " "VALUES (1001, 'Thad Beaumont', 65000)");
Véase también isActive(), isValid(), next(), previous(), first(), last() y seek().
bool QSqlQuery::execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)
Ejecuta por lotes una consulta SQL previamente preparada. Todos los parámetros vinculados deben ser listas de variantes. Si la base de datos no admite ejecuciones por lotes, el controlador lo simulará utilizando llamadas convencionales a exec().
Devuelve true si la consulta se ejecuta correctamente; en caso contrario devuelve false.
Ejemplo:
QSqlQuery q; q.prepare("insertar en miTabla valores (?, ?)");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();
El ejemplo anterior inserta cuatro nuevas filas en myTable:
1 Harald 2 Boris 3 Trond 4 NULL
Para vincular valores NULL, debe añadirse un QVariant nulo del tipo correspondiente al QVariantList vinculado; por ejemplo, debe utilizarse QVariant(QMetaType::fromType<QString>()) si se utilizan cadenas.
Nota: Cada QVariantList vinculado debe contener la misma cantidad de variantes.
Nota : El tipo de las QVariants de una lista no debe cambiar. Por ejemplo, no se pueden mezclar variantes enteras y de cadena dentro de un QVariantList.
El parámetro mode indica cómo se interpretará el campo QVariantList. Si mode es ValuesAsRows, cada variante dentro de QVariantList se interpretará como un valor para una nueva fila. ValuesAsColumns es un caso especial para el controlador de Oracle. En este modo, cada entrada dentro de QVariantList se interpretará como valor de matriz para un valor IN o OUT dentro de un procedimiento almacenado. Tenga en cuenta que esto sólo funcionará si el valor IN o OUT es de tipo tabla y consta de una sola columna de tipo básico, por ejemplo TYPE myType IS TABLE OF VARCHAR(64) INDEX BY BINARY_INTEGER;
Véase también prepare(), bindValue() y addBindValue().
QString QSqlQuery::executedQuery() const
Devuelve la última consulta ejecutada correctamente.
En la mayoría de los casos, esta función devuelve la misma cadena que lastQuery(). Si se ejecuta una consulta preparada con marcadores de posición en un SGBD que no lo soporta, se emula la preparación de esta consulta. Los marcadores de posición de la consulta original se sustituyen por sus valores ligados para formar una nueva consulta. Esta función devuelve la consulta modificada. Es útil sobre todo para depurar errores.
Véase también lastQuery().
void QSqlQuery::finish()
Indica al controlador de la base de datos que no se obtendrán más datos de esta consulta hasta que se vuelva a ejecutar. Normalmente no es necesario llamar a esta función, pero puede ser útil para liberar recursos como bloqueos o cursores si se pretende reutilizar la consulta más adelante.
Pone la consulta en inactiva. Los valores vinculados conservan sus valores.
Véase también prepare(), exec() y isActive().
bool QSqlQuery::first()
Recupera el primer registro del resultado, si está disponible, y posiciona la consulta en el registro recuperado. Tenga en cuenta que el resultado debe estar en el estado active y isSelect() debe devolver true antes de llamar a esta función o no hará nada y devolverá false. Devuelve true si tiene éxito. Si no tiene éxito, la posición de consulta se establece en una posición no válida y se devuelve false.
Véase también next(), previous(), last(), seek(), at(), isActive() y isValid().
bool QSqlQuery::isActive() const
Devuelve true si la consulta está activa. Una QSqlQuery activa es aquella que ha sido exec()'d con éxito pero con la que aún no se ha terminado. Cuando haya terminado con una consulta activa, puede desactivarla llamando a finish() o clear(), o puede borrar la instancia QSqlQuery.
Nota: De particular interés es una consulta activa que es una sentencia SELECT. En algunas bases de datos que soportan transacciones, una consulta activa que sea una sentencia SELECT puede hacer que falle una consulta commit() o rollback(), por lo que antes de hacer un commit o un rolling back, debe hacer que su consulta activa de la sentencia SELECT sea inactiva utilizando una de las formas listadas anteriormente.
Véase también isSelect().
bool QSqlQuery::isForwardOnly() const
Devuelve forwardOnly.
Nota: Función Getter para la propiedad forwardOnly.
Véase también forwardOnly, next(), y seek().
bool QSqlQuery::isNull(int field) const
Devuelve true si la consulta no es active, la consulta no está posicionada en un registro válido, no existe tal field, o el field es nulo; en caso contrario false. Tenga en cuenta que para algunos controladores, isNull() no devolverá información precisa hasta después de que se haya intentado recuperar los datos.
Véase también isActive(), isValid(), y value().
bool QSqlQuery::isNull(QAnyStringView name) const
Devuelve true si no hay ningún campo con este name; en caso contrario devuelve isNull(int index) para el índice de campo correspondiente.
Esta sobrecarga es menos eficiente que isNull()
Nota: En versiones de Qt anteriores a la 6.8, esta función tomaba QString, no QAnyStringView.
Se trata de una función sobrecargada.
[since 6.7] bool QSqlQuery::isPositionalBindingEnabled() const
Devuelve positionalBindingEnabled.
Nota: Función Getter para la propiedad positionalBindingEnabled.
Esta función se introdujo en Qt 6.7.
Véase también positionalBindingEnabled.
bool QSqlQuery::isSelect() const
Devuelve true si la consulta actual es una sentencia SELECT; en caso contrario devuelve false.
bool QSqlQuery::isValid() const
Devuelve true si la consulta está posicionada actualmente en un registro válido; en caso contrario devuelve false.
bool QSqlQuery::last()
Recupera el último registro del resultado, si está disponible, y posiciona la consulta en el registro recuperado. Tenga en cuenta que el resultado debe estar en el estado active y isSelect() debe devolver true antes de llamar a esta función o no hará nada y devolverá false. Devuelve true si tiene éxito. Si no tiene éxito, la posición de consulta se establece en una posición no válida y se devuelve false.
Véase también next(), previous(), first(), seek(), at(), isActive() y isValid().
QSqlError QSqlQuery::lastError() const
Devuelve información sobre el último error (si lo hubo) que se produjo con esta consulta.
Véase también QSqlError y QSqlDatabase::lastError().
QVariant QSqlQuery::lastInsertId() const
Devuelve el ID del objeto de la fila insertada más reciente si la base de datos lo admite. Se devolverá un QVariant inválido si la consulta no insertó ningún valor o si la base de datos no devuelve el id. Si la inserción ha afectado a más de una fila, el comportamiento es indefinido.
Para bases de datos MySQL se devolverá el campo de autoincremento de la fila.
Nota: Para que esta función funcione en PSQL, la tabla debe contener OIDs, que pueden no haber sido creados por defecto. Compruebe la variable de configuración default_with_oids para estar seguro.
Véase también QSqlDriver::hasFeature().
QString QSqlQuery::lastQuery() const
Devuelve el texto de la consulta actual que se está utilizando, o una cadena vacía si no hay texto de consulta actual.
Véase también executedQuery().
bool QSqlQuery::next()
Recupera el siguiente registro en el resultado, si está disponible, y posiciona la consulta en el registro recuperado. Tenga en cuenta que el resultado debe estar en el estado active y isSelect() debe devolver true antes de llamar a esta función o no hará nada y devolverá false.
Se aplican las siguientes reglas:
- Si el resultado se encuentra actualmente antes del primer registro, por ejemplo, inmediatamente después de ejecutar una consulta, se intenta recuperar el primer registro.
- Si el resultado se encuentra después del último registro, no se produce ningún cambio y se devuelve false.
- Si el resultado se encuentra en algún punto intermedio, se intenta recuperar el siguiente registro.
Si no se ha podido recuperar el registro, el resultado se sitúa después del último registro y se devuelve false. Si el registro se recupera correctamente, se devuelve true.
Véase también previous(), first(), last(), seek(), at(), isActive() y isValid().
bool QSqlQuery::nextResult()
Descarta el conjunto de resultados actual y navega al siguiente si está disponible.
Algunas bases de datos son capaces de devolver múltiples conjuntos de resultados para procedimientos almacenados o lotes SQL (una cadena de consulta que contiene múltiples sentencias). Si hay varios conjuntos de resultados disponibles después de ejecutar una consulta, esta función puede utilizarse para navegar al siguiente conjunto de resultados.
Si hay un nuevo conjunto de resultados disponible, esta función devolverá true. La consulta se reposicionará en un registro no válido del nuevo conjunto de resultados y se deberá navegar hasta un registro válido antes de poder recuperar los valores de los datos. Si no hay disponible un nuevo conjunto de resultados, la función devuelve false y la consulta se establece como inactiva. En cualquier caso, se descartará el antiguo conjunto de resultados.
Cuando una de las sentencias es una sentencia no select, puede estar disponible un recuento de filas afectadas en lugar de un conjunto de resultados.
Tenga en cuenta que algunas bases de datos, como Microsoft SQL Server, requieren cursores no desplazables cuando se trabaja con varios conjuntos de resultados. Algunas bases de datos pueden ejecutar todas las sentencias a la vez, mientras que otras pueden retrasar la ejecución hasta que se acceda realmente al conjunto de resultados, y algunas bases de datos pueden tener restricciones sobre qué sentencias pueden utilizarse en un lote SQL.
Véase también QSqlDriver::hasFeature(), forwardOnly, next(), isSelect(), numRowsAffected(), isActive(), y lastError().
int QSqlQuery::numRowsAffected() const
Devuelve el número de filas afectadas por la sentencia SQL del resultado, o -1 si no se puede determinar. Tenga en cuenta que para las sentencias SELECT, el valor es indefinido; utilice size() en su lugar. Si la consulta no es active, se devuelve -1.
Véase también size() y QSqlDriver::hasFeature().
QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const
Devuelve la numericalPrecisionPolicy.
Nota: Función Getter para la propiedad numericalPrecisionPolicy.
Véase también setNumericalPrecisionPolicy().
bool QSqlQuery::prepare(const QString &query)
Prepara la consulta SQL query para su ejecución. Devuelve true si la consulta se ha preparado correctamente; en caso contrario, devuelve false.
La consulta puede contener marcadores de posición para valores de enlace. Se admiten tanto los marcadores de posición de dos puntos estilo Oracle (por ejemplo, :surname), como los de estilo ODBC (?); pero no pueden mezclarse en la misma consulta. Véanse ejemplos en Detailed Description.
Notas sobre portabilidad: Algunas bases de datos deciden retrasar la preparación de una consulta hasta que se ejecuta por primera vez. En este caso, la preparación de una consulta sintácticamente incorrecta tiene éxito, pero todas las exec() consecutivas fallarán. Cuando la base de datos no admite marcadores de posición con nombre directamente, el marcador de posición sólo puede contener caracteres del rango [a-zA-Z0-9_].
En SQLite, la cadena de consulta sólo puede contener una sentencia cada vez. Si se proporciona más de una sentencia, la función devuelve false.
Ejemplo:
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();
Véase también exec(), bindValue() y addBindValue().
bool QSqlQuery::previous()
Recupera el registro anterior en el resultado, si está disponible, y posiciona la consulta en el registro recuperado. Tenga en cuenta que el resultado debe estar en el estado active y isSelect() debe devolver true antes de llamar a esta función o no hará nada y devolverá false.
Se aplican las siguientes reglas:
- Si el resultado se encuentra antes del primer registro, no se produce ningún cambio y se devuelve false.
- Si el resultado se encuentra después del último registro, se intenta recuperar el último registro.
- Si el resultado se encuentra en algún punto intermedio, se intenta recuperar el registro anterior.
Si no se ha podido recuperar el registro, el resultado se sitúa antes del primer registro y se devuelve false. Si el registro se recupera correctamente, se devuelve true.
Véase también next(), first(), last(), seek(), at(), isActive() y isValid().
QSqlRecord QSqlQuery::record() const
Devuelve un QSqlRecord que contiene la información de campo de la consulta actual. Si la consulta apunta a una fila válida (isValid() devuelve true), el registro se rellena con los valores de la fila. Se devuelve un registro vacío cuando no hay ninguna consulta activa (isActive() devuelve false).
Para recuperar valores de una consulta, debe utilizarse value(), ya que su búsqueda basada en índices es más rápida.
En el siguiente ejemplo, se ejecuta una consulta SELECT * FROM. Como el orden de las columnas no está definido, se utiliza QSqlRecord::indexOf() para obtener el índice de una columna.
QSqlQuery q("select * from empleados");QSqlRecord rec = q.record(); qDebug() << "Number of columns: " << rec.count(); int nombreCol = rec.indexOf("nombre"); // índice del campo "nombre"while (q.next()) qDebug() << q.value(nameCol).toString(); // output all names
Véase también value().
const QSqlResult *QSqlQuery::result() const
Devuelve el resultado asociado a la consulta.
bool QSqlQuery::seek(int index, bool relative = false)
Recupera el registro en la posición index, si está disponible, y posiciona la consulta en el registro recuperado. El primer registro está en la posición 0. Tenga en cuenta que la consulta debe estar en un estado active y isSelect() debe devolver true antes de llamar a esta función.
Si relative es falso (por defecto), se aplican las siguientes reglas:
- Si index es negativo, el resultado se posiciona antes del primer registro y se devuelve false.
- En caso contrario, se intenta pasar al registro en la posición index. Si no se ha podido recuperar el registro en la posición index, el resultado se posiciona después del último registro y se devuelve false. Si el registro se recupera correctamente, se devuelve true.
Si relative es verdadero, se aplican las siguientes reglas:
- Si el resultado está situado antes del primer registro y :
- index es negativo o cero, no hay cambio y se devuelve false.
- index es positivo, se intenta posicionar el resultado en la posición absoluta index - 1, siguiendo la misma regla para la búsqueda no relativa, arriba.
- Si el resultado se encuentra después del último registro y :
- index es positivo o cero, no hay cambio y se devuelve false.
- index es negativo, se intenta posicionar el resultado en index + 1 posición relativa desde el último registro, siguiendo la siguiente regla.
- Si el resultado se encuentra actualmente en algún lugar en el medio, y el desplazamiento relativo index mueve el resultado por debajo de cero, el resultado se posiciona antes del primer registro y se devuelve false.
- En caso contrario, se intenta mover al registro index registros por delante del registro actual (o index registros por detrás del registro actual si index es negativo). Si no se pudo recuperar el registro en el desplazamiento index, el resultado se posiciona después del último registro si index >= 0, (o antes del primer registro si index es negativo), y se devuelve false. Si el registro se recupera correctamente, se devuelve true.
Véase también next(), previous(), first(), last(), at(), isActive() y isValid().
void QSqlQuery::setForwardOnly(bool forward)
Establece forwardOnly en forward.
Nota: Función Setter para la propiedad forwardOnly.
Véase también isForwardOnly(), forwardOnly, next(), y seek().
void QSqlQuery::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
Establece numericalPrecisionPolicy en precisionPolicy.
Nota: Función Setter para la propiedad numericalPrecisionPolicy.
Véase también numericalPrecisionPolicy().
[since 6.7] void QSqlQuery::setPositionalBindingEnabled(bool enable)
Establece positionalBindingEnabled en enable.
Nota: Función Setter para la propiedad positionalBindingEnabled.
Esta función se introdujo en Qt 6.7.
Véase también isPositionalBindingEnabled() y positionalBindingEnabled.
int QSqlQuery::size() const
Devuelve el tamaño del resultado (número de filas devueltas), o -1 si no se puede determinar el tamaño o si la base de datos no admite información sobre el tamaño de las consultas. Tenga en cuenta que para sentencias que no seanSELECT (isSelect() devuelve false), size() devolverá -1. Si la consulta no está activa (isActive() devuelve false), se devuelve -1.
Para determinar el número de filas afectadas por una sentencia que no seaSELECT, utilice numRowsAffected().
Véase también isActive(), numRowsAffected() y QSqlDriver::hasFeature().
[noexcept, since 6.2] void QSqlQuery::swap(QSqlQuery &other)
Intercambia esta consulta con other. Esta operación es muy rápida y nunca falla.
Esta función se introdujo en Qt 6.2.
QVariant QSqlQuery::value(int index) const
Devuelve el valor del campo index en el registro actual.
Los campos se numeran de izquierda a derecha utilizando el texto de la declaración SELECT, por ejemplo, en
SELECT forename, surname FROM people;el campo 0 es forename y el campo 1 es surname. No se recomienda utilizar SELECT * porque el orden de los campos en la consulta es indefinido.
Se devuelve un QVariant no válido si el campo index no existe, si la consulta está inactiva o si la consulta se sitúa en un registro no válido.
Véase también previous(), next(), first(), last(), seek(), isActive() y isValid().
QVariant QSqlQuery::value(QAnyStringView name) const
Devuelve el valor del campo llamado name en el registro actual. Si el campo name no existe, se devuelve una variante no válida.
Esta sobrecarga es menos eficiente que value()
Nota: En versiones de Qt anteriores a la 6.8, esta función tomaba QString, no QAnyStringView.
Se trata de una función sobrecargada.
[noexcept, since 6.2] QSqlQuery &QSqlQuery::operator=(QSqlQuery &&other)
Mover-asigna other a este objeto.
Esta función se introdujo en Qt 6.2.
© 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.