QSqlQuery类
QSqlQuery类提供了执行和操作SQL语句的途径。更多信息...
头文件 | #include <QSqlQuery> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake | QT += sql |
- 所有成员列表,包括继承成员
- 弃用成员
- QSqlQuery是数据库类的一部分 Database Classes 和 隐式共享类。
公共类型
枚举 | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
公共函数
QSqlQuery(QSqlResult *result) | |
QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase()) | |
QSqlQuery(const QSqlDatabase &db) | |
(自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 |
(自6.6) QString | boundValueName(int pos) const |
(自6.6) QStringList | boundValueNames() const |
(自6.0) QVariantList | boundValues() const |
void | clear() |
const QSqlDriver * | driver() const |
bool | exec(const QString &query) |
bool | exec() |
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(const QString &name) const |
(自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(const QString &name) const |
(since 6.2) QSqlQuery & | operator=(QSqlQuery &&other) |
详细描述
QSqlQuery 封装了在 QSqlDatabase 上执行 SQL 查询时涉及到的创建、遍历和检索数据的各项功能。它可以用来执行 DML(数据操作语言)语句,如 SELECT
、INSERT
、UPDATE
和 DELETE
,以及 DDL(数据定义语言)语句,如 CREATE
TABLE
。它也可以用来执行特定于数据库的命令,这些命令不是标准 SQL(例如,PostgreSQL 的 SET DATESTYLE=ISO
)。
成功执行的 SQL 语句将查询的状态设置为激活,以便 isActive() 返回 true
。否则,查询的状态将设置为非激活。在两种情况下,执行新的 SQL 语句时,查询将定位到无效的记录。一个激活的查询必须在检索值之前导航到有效的记录(以便 isValid() 返回 true
)。
对于某些数据库,如果在调用 commit() 或 rollback() 时存在作为 SELECT
语句的激活查询,则提交或回滚将失败。有关详细信息,请参阅 isActive()。
通过以下功能执行记录导航
这些函数允许程序员在查询返回的记录中前进、后退或随意移动。如果您只需要向前移动结果(例如,使用 next()),则可以使用 setForwardOnly(),这将节省大量的内存开销,并在某些数据库上提高性能。一旦一个激活的查询对有效的记录进行了定位,则可以使用 value() 检索数据。所有数据都是从 SQL 后端使用 QVariants 传输的。
例如
QSqlQuery query("SELECT country FROM artist"); while (query.next()) { QString country = query.value(0).toString(); doSomething(country); }
要访问查询返回的数据,请使用 value(int)。通过传递字段的起始位置(从 0 开始)来访问由 SELECT 语句返回的数据中的每个字段。因此,不建议使用 SELECT *
查询,因为返回的列的顺序是不确定的。
为了提高效率,没有通过名称访问字段的函数(除非使用下面的准备查询并带有名称,如解释所示)。要将字段名称转换为索引,请使用record(),例如indexOf()。
QSqlQuery query("SELECT * FROM artist"); int fieldNo = query.record().indexOf("country"); while (query.next()) { QString country = query.value(fieldNo).toString(); doSomething(country); }
QSqlQuery支持准备查询执行以及将参数值绑定到占位符。一些数据库不支持这些功能,因此对于这些数据库,Qt模拟所需的功能。例如,Oracle和ODBC驱动程序有合适的准备查询支持,并且Qt利用了它;但是没有这个支持的数据库,Qt会自己实现这个功能,例如通过在执行查询时将占位符替换为实际值。使用numRowsAffected()来确定哪些非SELECT
查询影响了多少行,使用size()来确定多少行被检索。
Oracle数据库使用冒号名称语法来识别占位符,例如:name
。ODBC简单地使用?
字符。Qt支持这两种语法,但限制是您不能在同一个查询中混合使用它们。
您可以使用boundValues()在一个单独的变量中检索所有字段值。
注意:不是所有的SQL操作都支持绑定值。请参考您数据库系统的文档,以检查它们是否可用。
绑定值的途径
以下我们使用四种不同的绑定方式展示相同的示例,包括绑定值到存储过程的示例。
使用带名称的占位符进行命名绑定
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();
使用带名称的占位符进行位置绑定
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();
使用位置占位符绑定值(版本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();
使用位置占位符绑定值(版本2)
QSqlQuery query; query.prepare("INSERT INTO person (id, forename, surname) " "VALUES (?, ?, ?)"); query.addBindValue(1001); query.addBindValue("Bart"); query.addBindValue("Simpson"); query.exec();
将绑定值绑定到存储过程
此代码调用一个名为AsciiToInt()
的存储过程,通过它的in参数传递一个字符,并通过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
请注意,未绑定的参数将保留其值。
使用返回语句返回值或返回多个结果集的存储过程不支持。具体细节请参见SQL数据库驱动程序。
警告:在创建QSqlQuery之前,您必须加载SQL驱动程序并打开连接。此外,连接必须在查询存在期间保持打开状态;否则,QSqlQuery的行为是未定义的。
另请参阅:QSqlDatabase、QSqlQueryModel、QSqlTableModel和QVariant。
成员类型文档
enum QSqlQuery::BatchExecutionMode
常量 | 值 | 描述 |
---|---|---|
QSqlQuery::ValuesAsRows | 0 | - 更新多行。将QVariantList中的每个条目视为更新下一行的值。 |
QSqlQuery::ValuesAsColumns | 1 | - 更新一行。将QVariantList中的每个条目视为数组类型的单个值。 |
成员函数文档
[显式]
QSqlQuery::QSqlQuery(QSqlResult *result)
使用QSqlResult result与数据库通信构造QSqlQuery对象。
[显式]
QSqlQuery::QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())
使用SQL查询query和数据库db构建一个QSqlQuery对象。如果db未指定或无效,将使用应用程序的默认数据库。如果query不是空字符串,它将被执行。
另请参阅 QSqlDatabase。
[显式构造函数]
QSqlQuery::QSqlQuery(const QSqlDatabase &db)
使用数据库db构建一个QSqlQuery对象。如果db无效,将使用应用程序的默认数据库。
另请参阅 QSqlDatabase。
[noexcept, since 6.2]
QSqlQuery::QSqlQuery(QSqlQuery &&other)
从other移动构造一个QSqlQuery。
此功能自Qt 6.2开始引入。
[noexcept]
QSqlQuery::~QSqlQuery()
销毁对象并释放任何分配的资源。
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
在位置参数绑定时将值val添加到值列表中。addBindValue()调用顺序确定值在预编译查询中绑定到的占位符。如果paramType是QSql::Out或QSql::InOut,则占位符将在exec()调用后使用数据库的数据进行覆盖。
要绑定NULL值,请使用null QVariant;例如,如果绑定字符串,则使用QVariant(QMetaType::fromType<QString>())
。
另请参阅 bindValue(),prepare(),exec(),boundValue()和boundValues。
int QSqlQuery::at() const
返回查询的当前内部位置。第一条记录在位置零。如果位置无效,则函数返回QSql::BeforeFirstRow或QSql::AfterLastRow,这些是特殊的负值。
另请参阅 previous(),next(),first(),last(),seek(),isActive()和isValid。
void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
将占位符placeholder设置为绑定到准备语句中的值val。请注意,在指定占位符名称时必须包含占位符标记(例如,:
)。如果paramType是QSql::Out或QSql::InOut,则占位符将在exec()调用后用数据库的数据覆盖。在这种情况下,必须预分配足够的空间以存储结果。
要绑定NULL值,请使用null QVariant;例如,如果绑定字符串,则使用QVariant(QMetaType::fromType<QString>())
。
另请参阅 addBindValue(),prepare(),exec(),boundValue和boundValues。
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
将预处理语句中位置pos的占位符设置为绑定值val。字段编号从0开始。如果paramType是QSql::Out或QSql::InOut,则在exec()调用后,占位符将用数据库中的数据覆盖。
QVariant QSqlQuery::boundValue(const QString &placeholder) const
返回placeholder的值。
另请参阅 boundValues,bindValue和addBindValue。
QVariant QSqlQuery::boundValue(int pos) const
返回位置pos的占位符的值。
另请参阅 boundValues。
[since 6.6]
QString QSqlQuery::boundValueName(int pos) const
返回位置pos的绑定性值名称。
列表的顺序是绑定顺序,无论是否使用命名或位置绑定。
此功能是在Qt 6.6中引入的。
另请参阅 boundValueNames。
[since 6.6]
QStringList QSqlQuery::boundValueNames() const
返回所有绑定值的名称。
列表的顺序是绑定顺序,无论是否使用命名或位置绑定。
此功能是在Qt 6.6中引入的。
另请参阅 boundValues()和boundValueName。
[since 6.0]
QVariantList QSqlQuery::boundValues() const
返回绑定值的列表。
列表的顺序是绑定顺序,无论是否使用命名或位置绑定。
可以通过以下方式检查绑定值。
const QVariantList list = query.boundValues(); for (qsizetype i = 0; i < list.size(); ++i) qDebug() << i << ":" << list.at(i).toString();
此功能是在Qt 6.0中引入的。
另请参阅 boundValue,bindValue,addBindValue和boundValueNames。
void QSqlQuery::clear()
清空结果集并释放查询持有的任何资源。将查询状态设置为不活动。您很少需要甚至根本不需要调用此函数。
const QSqlDriver *QSqlQuery::driver() const
返回与查询关联的数据库驱动程序。
bool QSqlQuery::exec(const QString &query)
在查询(query)中执行SQL语句。如果查询成功,返回 true
并将查询状态设置为 active;否则返回 false
。必须使用被查询SQL数据库适当的语法来书写 query 字符串(例如,标准SQL)。
执行查询后,查询定位在一个无效的记录上,必须在获取数据值之前将其导航到一个有效的记录上(例如,使用 next())。
注意,当调用 exec() 时,该查询的最后错误会被重置。
对于SQLite,查询字符串每次只能包含一个语句。如果提供了多个语句,函数返回 false
。
示例
QSqlQuery query; query.exec("INSERT INTO employee (id, name, salary) " "VALUES (1001, 'Thad Beaumont', 65000)");
另请参见 isActive(),isValid(),next(),previous(),first(),last(),以及 seek()。
bool QSqlQuery::exec()
执行先前准备好的SQL语句。如果查询执行成功,返回 true
;否则返回 false
。
注意,当调用 exec() 时,该查询的最后错误会被重置。
另请参见 prepare(),bindValue(),addBindValue(),boundValue() 以及 boundValues()。
bool QSqlQuery::execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)
以批处理方式执行先前准备好的SQL查询。所有已绑定的参数必须是变体类型的列表。如果数据库不支持批处理执行,驱动程序将使用常规的exec()调用进行模拟。
如果查询执行成功,返回 true
;否则返回 false
。
示例
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();
上述示例将四行新数据插入到 myTable
1 Harald 2 Boris 3 Trond 4 NULL
要绑定NULL值,需要向绑定的 QVariant 中添加相关类型的null值;例如,如果你使用字符串,应使用 QVariant(QMetaType::fromType<QString>())
。
注意:每个绑定的 QVariantList 必须包含相同数量的变体。
注意:列表中 QVariants 的类型不允许更改。例如,你无法在一个 QVariantList 中混合整数和字符串类型的变体。
mode 参数指示如何解释绑定的 QVariantList。如果 mode 是 ValuesAsRows
,则 QVariantList 中的每个变体都将被解释为新行的值。ValuesAsColumns
是针对Oracle驱动程序的特例。在此模式下,QVariantList 中的每个条目都将被解释为存储过程内的IN或OUT值的数组值。请注意,这仅适用于IN或OUT值是由只有一个基本类型列的表类型组成的,例如 TYPE myType IS TABLE OF VARCHAR(64) INDEX BY BINARY_INTEGER;
另请参见 prepare(),bindValue() 以及 addBindValue()。
QString QSqlQuery::executedQuery() const
返回最后成功执行的查询。
在大多数情况下,此函数返回与lastQuery()相同的字符串。如果在不支持占位符的DBMS上执行带有占位符的预编查询,则会模拟此查询的准备工作。将原始查询中的占位符替换为其绑定值,形成新查询。此函数返回修改后的查询。主要用于调试目的。
另请参阅lastQuery。
void QSqlQuery::finish()
指示数据库驱动程序,在重新执行之前不会从此查询中检索更多数据。通常不需要调用此函数,但如果您打算在以后再次使用查询,则可能有助于释放资源,例如锁定或游标。
将查询设置为非活动状态。绑定值保留其值。
另请参阅prepare(),exec()和isActive()。
bool QSqlQuery::first()
如果可用,检索结果中的第一条记录,并将查询定位到检索到的记录。请注意,结果必须处于活动状态,并且在调用此函数之前必须返回 true isSelect(),否则它将不执行任何操作并返回 false。如果成功,则返回 true。如果不成功,则将查询位置设置为无效位置并返回 false。
另请参阅next(),previous(),last(),seek(),at,isActive()和isValid()。
bool QSqlQuery::isActive() const
如果查询是活动的,则返回 true。一个活动的QSqlQuery是已成功执行exec()但尚未完成的查询。当您完成一个活动的查询时,您可以调用finish()或clear(),或者删除QSqlQuery实例,使查询变为非活动状态。
注意:特别值得注意的是一个活动查询是SELECT
语句。对于某些支持事务的数据库,一个活动查询是SELECT
语句可以导致commit()或rollback()失败,因此在提交或回滚之前,您应该使用上面列出的方法之一,使您的活动SELECT
语句查询变为非活动状态。
另请参阅isSelect()。
bool QSqlQuery::isForwardOnly() const
如果您只能向前滚动通过结果集,则返回 true;否则返回 false。
另请参阅setForwardOnly()和next。
bool QSqlQuery::isNull(int field) const
如果查询未处于活动状态,或者查询未定位在有效的记录上,不存在这样的字段,或者该字段为空;否则返回false
。注意,对于某些驱动程序,在尝试检索数据之后,isNull()才会返回准确信息。
另请参阅isActive(),isValid()和value()。
bool QSqlQuery::isNull(const QString &name) const
这是一个重载函数。
如果没有字段具有此名称,返回true
;否则返回对应字段索引的isNull(int index)。
此重载函数比isNull()效率低。
[since 6.7]
bool QSqlQuery::isPositionalBindingEnabled() const
如果当前启用了位置绑定,返回true
。
此函数是在Qt 6.7中引入的。
另请参阅setPositionalBindingEnabled()。
bool QSqlQuery::isSelect() const
如果当前查询是SELECT
语句,返回true
;否则返回false
。
bool QSqlQuery::isValid() const
如果查询目前位于有效的记录上,返回true
;否则返回false
。
bool QSqlQuery::last()
在结果中检索最后一条记录(如果有的话),并将查询定位在检索到的记录上。注意,结果必须处于活动状态,并且调用此函数之前必须调用isSelect()并返回true,否则什么也不做并返回false。如果成功,返回true
。如果失败,查询位置设为无效位置,并返回false。
另请参阅next(),previous(),first(),seek(),at(),isActive()和isValid()。
QSqlError QSqlQuery::lastError() const
返回此查询发生的最后错误(如果有)的错误信息。
另请参阅QSqlError和QSqlDatabase::lastError。
QVariant QSqlQuery::lastInsertId() const
如果数据库支持,返回最近插入行的对象ID。如果没有插入任何值或数据库没有返回id,将返回无效的QVariant。如果插入操作影响了多行,行为是未定义的。
对于MySQL数据库,将返回行的自增字段。
注意:要在PSQL中使用此函数,表必须包含OID,这可能是默认没有创建的。确保检查default_with_oids
配置变量。
QString QSqlQuery::lastQuery() const
返回当前使用的查询文本,如果没有当前查询文本,则返回空字符串。
另请参阅 executedQuery。
bool QSqlQuery::next()
如果可用,检索结果中的下一个记录,并将查询定位到检索到的记录。请注意,结果必须在活动状态,并且在调用此函数之前必须返回 true,否则它将什么都不做并返回 false。
以下规则适用
- 如果结果目前位于第一条记录之前,例如查询执行后立即,则尝试检索第一条记录。
- 如果结果目前位于最后一条记录之后,则没有变化,返回 false。
- 如果结果位于中间某个位置,则尝试检索下一条记录。
如果无法检索记录,则将结果定位到最后一条记录之后并返回 false。如果成功检索到记录,则返回 true。
另请参阅 previous(),first(),last(),seek(),at(),isActive()和isValid()。
bool QSqlQuery::nextResult()
丢弃当前结果集并导航到下一个(如果可用)。
某些数据库可以对存储过程或 SQL 批量(包含多个语句的查询字符串)返回多个结果集。执行查询后,如果可用多个结果集,则可以使用此函数导航到下一个结果集(s)。
如果有一个新的结果集可用,此函数将返回 true。查询将重置到新结果集中的一无效记录,在可以检索数据值之前必须导航到一个有效记录。如果没有新的结果集可用,函数返回 code translate="no">false并将查询设置为非活动状态。在任何情况下,旧的结果集都将被丢弃。
当其中一个语句是非选择语句时,可能可以获得受影响的行数,而不是结果集。
请注意,某些数据库,例如 Microsoft SQL Server,在处理多个结果集时需要非滚动游标。某些数据库可能会一次性执行所有语句,而其他数据库可能会延迟执行,直到结果集实际上被访问,并且某些数据库可能对 SQL 批量中允许使用的语句有约束。
另请参阅 QSqlDriver::hasFeature(),setForwardOnly(),next(),isSelect(),numRowsAffected(),isActive()和lastError。
int QSqlQuery::numRowsAffected() const
返回结果 SQL 语句影响的行数,如果无法确定则返回 -1。请注意,对于 SELECT
语句,该值是未定义的;请使用 size()。如果查询非 活性,则返回 -1。
另请参阅 size() 和 QSqlDriver::hasFeature。
QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const
返回当前精度策略。
另请参阅 QSql::NumericalPrecisionPolicy 和 setNumericalPrecisionPolicy。
bool QSqlQuery::prepare(const QString &query)
准备执行 SQL 查询 query。如果成功准备查询,则返回 true
;否则返回 false
。
查询可能包含用于绑定值的占位符。支持 Oracle样式的点名称(例如,:surname
)和 ODBC样式的(?
)占位符;但在同一查询中不能混合使用。有关示例,请参阅 详细描述。
兼容性说明:某些数据库选择在第一次执行前延迟准备查询。在这种情况下,准备语法错误的查询会成功,但随后的每个 exec() 都将失败。如果数据库不支持直接支持命名占位符,占位符只能包含字符范围 [a-zA-Z0-9_]。
对于SQLite,查询字符串每次只能包含一个语句。如果提供了多个语句,函数返回 false
。
示例
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();
另请参阅 exec()、bindValue() 和 addBindValue。
bool QSqlQuery::previous()
如果可用,检索结果中的上一条记录,并将查询定位在检索的记录上。注意,结果必须处于 active 状态,并且 isSelect() 必须在调用此函数之前返回 true,否则它将不执行任何操作并返回 false。
以下规则适用
- 如果结果当前位于第一条记录之前,则没有变化,返回 false。
- 如果结果当前位于最后一条记录之后,将尝试检索最后一条记录。
- 如果结果在中间,将尝试检索上一条记录。
如果无法检索记录,结果将定位在第一条记录之前并返回 false。如果成功检索记录,则返回 true。
另请参阅 next()、first()、last()、seek()、at()、isActive() 和 isValid。
QSqlRecord QSqlQuery::record() const
返回一个包含当前查询字段信息的 QSqlRecord。如果查询指向一个有效的行(isValid() 返回 true),记录将填充行的值。如果没有活动查询(isActive() 返回 false),则返回一个空的记录。
要从查询中检索值,应使用 value(),因为它基于索引的查找更快。
在以下示例中,执行了一个 SELECT * FROM
查询。由于列的顺序未定义,因此使用 QSqlRecord::indexOf() 来获取列的索引。
QSqlQuery q("select * from employees"); QSqlRecord rec = q.record(); qDebug() << "Number of columns: " << rec.count(); int nameCol = rec.indexOf("name"); // index of the field "name" while (q.next()) qDebug() << q.value(nameCol).toString(); // output all names
另请参阅 value。
const QSqlResult *QSqlQuery::result() const
返回与查询关联的结果。
bool QSqlQuery::seek(int index, bool relative = false)
检索位置为 index 的记录,如果存在,并将查询定位到检索到的记录。第一条记录位于位置 0。注意,查询必须处于一个 活动 状态,并且 isSelect() 必须在调用此函数之前返回 true。
如果 relative 为假(默认值),则适用以下规则
- 如果 index 为负数,结果将定位到第一条记录之前,并返回 false。
- 否则,将尝试移动到位置为 index 的记录。如果无法检索到位置为 index 的记录,结果将定位到最后一条记录之后,并返回 false。如果成功检索到记录,则返回 true。
如果 relative 为真,则适用以下规则
- 如果当前结果定位在第一条记录之前,并且
- index 为负数或零,则不进行任何更改,并返回 false。
- index 为正数,将尝试将结果定位到绝对位置 index - 1,遵循上面非相对定位的同一条规则。
- 如果当前结果定位在最后一条记录之后,并且
- index 为正数或零,则不进行任何更改,并返回 false。
- index 为负数,则尝试将结果定位到最后记录的 index 相对位置。
- 如果当前结果位于中间某个位置,并且相对偏移 index 将结果移动到零以下,则结果将定位到第一条记录之前,并返回 false。
- 否则,将尝试将记录移动到当前记录前方 index 条(如果 index 为负数,则为当前记录后方 index 条记录)。如果无法检索到偏移 index 的记录,如果 index >= 0,则结果将定位到最后一条记录之后,如果 index 为负数,则结果将定位到第一条记录之前,并返回 false。如果成功检索到记录,则返回 true。
请参阅next(),previous(),first(),last(),at(),isActive() 和 isValid()。
void QSqlQuery::setForwardOnly(bool forward)
将只向前进模式设置为 forward。如果 forward 为真,则只允许使用 next() 和正数值的 seek() 来导航结果。
只向前进模式(取决于驱动程序)可以更节省内存,因为不需要缓存结果。它还会提高某些数据库的性能。为了实现这一点,必须在查询准备或执行之前调用 setForwardOnly()
。注意,接受查询和数据库的构造函数可能会执行查询。
默认情况下,只向前进模式是关闭的。
将只向前进设置为假是对数据库引擎的建议,数据库引擎有权决定结果集是只向前进的还是可滚动。函数 isForwardOnly() 总是返回结果集的正确状态。
注意:在执行查询后调用 setForwardOnly 可能会产生意外的结果,最坏的情况下可能会崩溃。
注意:为了确保唯向前查询执行成功,应用程序应该在执行查询和导航查询结果后都检查 lastError() 是否存在错误。
警告:在 PostgreSQL 中,以唯向前模式导航查询结果时,不要在同一个数据库连接上执行任何其他的 SQL 命令。这会导致查询结果丢失。
另请参阅:isForwardOnly()、next()、seek()、和 QSqlResult::setForwardOnly。
void QSqlQuery::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
指导数据库驱动以由 precisionPolicy 指定的精度返回数值。
例如,Oracle 驱动可以以字符串形式检索数值以防止精度丢失。如果高精度并不重要,可以使用此方法通过跳过字符串转换来提高执行速度。
注意:不支持以低精度获取数值的驱动将忽略精度策略。您可以使用 QSqlDriver::hasFeature() 来检查驱动是否支持此功能。
注意:设置精度策略不会影响当前活动的查询。请调用 exec(QString) 或 prepare() 以激活策略。
另请参阅:QSql::NumericalPrecisionPolicy 和 numericalPrecisionPolicy。
[since 6.7]
void QSqlQuery::setPositionalBindingEnabled(bool enable)
根据 enable(默认值为 true
)启用或禁用此查询的定位 绑定。禁用定位绑定很有用,如果查询本身包含一个 '?',则不应将其处理为定位绑定参数,例如,作为 PostgreSQL 数据库的 JSON 运算符。
当数据库具有对带有问号的位置绑定的本地支持时(另请参阅 QSqlDriver::PositionalPlaceholders),此函数将不会产生任何效果。
此函数是在Qt 6.7中引入的。
另请参阅:isPositionalBindingEnabled。
int QSqlQuery::size() const
返回结果的大小(返回的行数),如果无法确定大小或数据库不支持报告查询大小信息,则返回 -1。注意,对于非 SELECT
语句(isSelect() 返回 false
),size() 将返回 -1。如果查询不是活跃的(isActive() 返回 false
),则返回 -1。
要确定非 SELECT
语句影响的行数,请使用 numRowsAffected。
另请参阅:isActive()、numRowsAffected 和 QSqlDriver::hasFeature。
[noexcept, since 6.2]
void QSqlQuery::swap(QSqlQuery &other)
将 other 交换到该对象。此操作非常快,从不失败。
此功能自Qt 6.2开始引入。
QVariant QSqlQuery::value(int index) const
返回当前记录中 index 字段的值。
字段按从左至右的顺序使用 SELECT
语句中的文本编号,例如,在
SELECT forename, surname FROM people;
字段 0 是 forename
,字段 1 是 surname
。使用 SELECT *
不推荐,因为查询中字段的顺序是未定义的。
如果字段 index 不存在、查询无效或查询定位到无效记录,则返回一个无效的 QVariant。
另请参阅 previous(),next(),first(),last(),seek(),isActive()和isValid。
QVariant QSqlQuery::value(const QString &name) const
这是一个重载函数。
返回当前记录中名为 name 的字段的值。如果字段 name 不存在,则返回一个无效的变体。
此重载比 value() 效率低。
[noexcept, since 6.2]
QSqlQuery &QSqlQuery::operator=(QSqlQuery &&other)
将 other 移动分配给此对象。
此功能自Qt 6.2开始引入。
© 2024 Qt 公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会发布的 GNU自由文档许可证1.3版 的条款授权。Qt 和相关的标识是芬兰的 Qt 公司及全球的商标。所有其他商标均为其各自所有者的财产。