QSqlQuery Class
QSqlQuery 类提供了一种执行和操作 SQL 语句的方法。更多
Header: | #include <QSqlQuery> |
CMake.QSqlQuery | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake: | QT += sql |
- 所有成员(包括继承成员)的列表
- 已废弃成员
- QSqlQuery 属于数据库类和隐式共享类。
公共类型
enum | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
属性
(since 6.8)
forwardOnly : bool(since 6.8)
numericalPrecisionPolicy : QSql::NumericalPrecisionPolicy(since 6.8)
positionalBindingEnabled : bool
公共职能
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) |
详细说明
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() 来检索数据。所有数据都是通过 QVariants 从 SQL 后端传输的。
例如
QSqlQuery query("SELECT country FROM artist"); while (query.next()) { QString country = query.value(0).toString(); doSomething(country); }
要访问查询返回的数据,请使用 value(int)。访问SELECT
语句返回的数据中的每个字段时,都要传递字段在语句中的位置,从 0 开始。这使得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() 可以了解SELECT
查询检索了多少行。
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()
的存储过程,通过输入参数传递一个字符,并在输出参数中获取结果。
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
请注意,未绑定的参数将保留其值。
不完全支持使用 return 语句返回值或返回多个结果集的存储过程。有关具体详情,请参阅SQL 数据库驱动程序。
警告 在创建 QSqlQuery 之前,必须加载 SQL 驱动程序并打开连接。此外,在查询存在时,连接必须保持打开状态;否则,QSqlQuery 的行为将是未定义的。
另请参阅 QSqlDatabase,QSqlQueryModel,QSqlTableModel 和QVariant 。
成员类型文档
enum QSqlQuery::BatchExecutionMode
常数 | 值 | 说明 |
---|---|---|
QSqlQuery::ValuesAsRows | 0 | - 更新多行。将QVariantList 中的每个条目都视为更新下一行的值。 |
QSqlQuery::ValuesAsColumns | 1 | - 更新单行。将QVariantList 中的每个条目都视为数组类型的单个值。 |
属性文档
[since 6.8]
forwardOnly : bool
该属性只保留向前模式。如果forward 为 true,则只允许使用正值的next() 和seek() 浏览结果。
只向前模式(取决于驱动程序)可以提高内存效率,因为结果不需要缓存。它还能提高某些数据库的性能。为此,必须在准备或执行查询之前调用setForwardOnly()
。请注意,接收查询和数据库的构造函数可以执行查询。
仅向前模式默认为关闭。
将只向前模式设置为 false 是对数据库引擎的建议,数据库引擎对结果集是只向前模式还是可滚动模式有最终决定权。isForwardOnly() 将始终返回结果集的正确状态。
注意: 在执行查询后调用setForwardOnly ,最好的结果是出乎意料,最坏的结果是导致崩溃。
注意: 为确保只向前查询成功完成,应用程序不仅要在执行查询后检查lastError() 是否出错,还要在浏览查询结果后检查 () 是否出错。
警告: PostgreSQL:在只向前模式下浏览查询结果时,不要在同一数据库连接上执行任何其他 SQL 命令。这将导致查询结果丢失。
此属性在 Qt 6.8 中引入。
访问函数:
bool | isForwardOnly() const |
void | setForwardOnly(bool forward) |
[since 6.8]
numericalPrecisionPolicy : QSql::NumericalPrecisionPolicy
指示数据库驱动程序以precisionPolicy 指定的精度返回数值。
例如,Oracle 驱动程序可以以字符串形式检索数值,以避免精度损失。如果高精度并不重要,可以使用这种方法绕过字符串转换来提高执行速度。
注意:不支持以低精度获取数值的驱动程序将忽略精度策略。可以使用QSqlDriver::hasFeature() 查看驱动程序是否支持此功能。
注意:设置精度策略不会影响当前活动查询。调用exec(QString) 或prepare() 才能激活该策略。
此属性在 Qt 6.8 中引入。
访问函数:
QSql::NumericalPrecisionPolicy | numericalPrecisionPolicy() const |
void | setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) |
另请参阅 QSql::NumericalPrecisionPolicy,QSqlDriver::numericalPrecisionPolicy, 和QSqlDatabase::numericalPrecisionPolicy 。
[since 6.8]
positionalBindingEnabled : bool
该属性启用或禁用该查询的位置binding ,取决于enable (默认为true
)。如果查询本身包含一个"?",而这个"? "不能作为位置绑定参数处理,而是作为 PostgreSQL 数据库的 JSON 操作符处理,则禁用位置绑定非常有用。
如果数据库原生支持带问号的位置绑定,该属性将不起作用(另请参阅QSqlDriver::PositionalPlaceholders )。
此属性在 Qt 6.8 中引入。
访问函数:
bool | isPositionalBindingEnabled() const |
void | setPositionalBindingEnabled(bool enable) |
成员函数文档
[explicit]
QSqlQuery::QSqlQuery(QSqlResult *result)
构造一个 QSqlQuery 对象,该对象使用QSqlResult result 与数据库通信。
[explicit]
QSqlQuery::QSqlQuery(const QSqlDatabase &db)
使用数据库db 构建 QSqlQuery 对象。如果db 无效,将使用应用程序的默认数据库。
另请参阅 QSqlDatabase 。
[explicit]
QSqlQuery::QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())
使用 SQLquery 和数据库db 构造一个 QSqlQuery 对象。如果db 未指定或无效,则使用应用程序的默认数据库。如果query 不是空字符串,则将执行该查询。
另请参阅 QSqlDatabase 。
[noexcept, since 6.2]
QSqlQuery::QSqlQuery(QSqlQuery &&other)
Move-从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 值,请使用空QVariant ;例如,如果要绑定字符串,请使用QVariant(QMetaType::fromType<QString>())
。
另请参阅 bindValue(),prepare(),exec(),boundValue() 和boundValues().
int QSqlQuery::at() const
返回查询的当前内部位置。第一条记录位于 0 位置。如果位置无效,函数将返回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 值,请使用空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
返回绑定值列表。
无论使用的是命名绑定还是位置绑定,列表的顺序都是按绑定顺序排列的。
绑定值可按以下方式检查:
常量QVariantListlist=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()
执行事先准备好的 SQL 查询。如果查询成功执行,则返回true
;否则返回false
。
请注意,在调用 exec() 时,该查询的最后一次错误会被重置。
另请参阅 prepare()、bindValue()、addBindValue()、boundValue() 和boundValues()。
bool QSqlQuery::exec(const QString &query)
执行query 中的 SQL。如果查询成功,则返回true
并将查询状态设置为active ;否则返回false
。query 字符串必须使用适合所查询 SQL 数据库的语法(例如,标准 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::execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)
批量执行事先准备好的 SQL 查询。所有绑定参数必须是变量列表。如果数据库不支持批量执行,驱动程序将使用传统的exec() 调用来模拟批量执行。
如果查询成功执行,则返回true
;否则返回false
。
示例
QSqlQueryq; q.prepare("insert into myTable values (?, ?)");QVariantListints; ints<< 1<< 2<< 3<< 4; q.addBindValue(ints);QVariantListnames;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 值,必须在绑定的QVariantList 中添加相关类型的 nullQVariant ;例如,如果使用字符串,则应使用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()
检索结果中的第一条记录(如果有的话),并将查询定位在检索到的记录上。请注意,在调用此函数前,结果必须处于active 状态,且isSelect() 必须返回 true,否则将不起作用并返回 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
返回forwardOnly 。
注: 属性forwardOnly 的获取函数。
另请参阅 forwardOnly,next() 和seek() 。
bool QSqlQuery::isNull(int field) const
如果查询不是active 、查询未定位在有效记录上、没有这样的field 或field 为空,则返回true
;否则返回false
。请注意,对于某些驱动程序,isNull() 在尝试检索数据后才会返回准确信息。
另请参阅 isActive()、isValid() 和value()。
bool QSqlQuery::isNull(QAnyStringView name) const
这是一个重载函数。
如果name 中没有字段,则返回true
;否则返回相应字段索引的 isNull(int index)。
此重载函数的效率低于isNull()
注: 在 6.8 之前的 Qt XML 版本中,此函数使用QString ,而非QAnyStringView 。
[since 6.7]
bool QSqlQuery::isPositionalBindingEnabled() const
注: 属性positionalBindingEnabled 的获取函数。
此函数在 Qt 6.7 中引入。
另请参阅 positionalBindingEnabled 。
bool QSqlQuery::isSelect() const
如果当前查询是SELECT
语句,则返回true
;否则返回false
。
bool QSqlQuery::isValid() const
如果查询当前位于有效记录上,则返回true
;否则返回false
。
bool QSqlQuery::last()
检索结果中的最后一条记录(如果有的话),并将查询定位在检索到的记录上。请注意,在调用此函数前,结果必须处于active 状态,且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,而默认情况下可能尚未创建 OID。请检查default_with_oids
配置变量以确定。
另请参阅 QSqlDriver::hasFeature().
QString QSqlQuery::lastQuery() const
返回当前使用的查询文本,如果没有当前查询文本,则返回空字符串。
另请参阅 executedQuery()。
bool QSqlQuery::next()
检索结果中的下一条记录(如果有的话),并将查询定位在检索到的记录上。需要注意的是,在调用此函数之前,结果必须处于active 状态,且isSelect() 必须返回 true,否则它将什么也不做并返回 false。
以下规则适用:
- 如果结果当前位于第一条记录之前,例如在执行查询后,会立即尝试检索第一条记录。
- 如果结果当前位于最后一条记录之后,则不会有任何变化,并返回 false。
- 如果结果位于中间位置,则会尝试检索下一条记录。
如果无法检索到记录,结果将位于最后一条记录之后,并返回 false。如果成功检索到记录,则返回 true。
另请参阅 previous()、first()、last()、seek()、at()、isActive() 和isValid()。
bool QSqlQuery::nextResult()
丢弃当前结果集,如果可用,则跳转到下一个结果集。
某些数据库能够为存储过程或 SQL 批量(包含多条语句的查询字符串)返回多个结果集。如果执行查询后有多个结果集可用,则可使用此函数导航到下一个或多个结果集。
如果有新的结果集可用,该函数将返回 true。查询将被重新定位到新结果集中的一条无效记录上,必须在检索数据值之前导航到一条有效记录。如果没有新的结果集,函数将返回false
,查询将被设置为非活动。无论如何,旧的结果集将被丢弃。
当其中一条语句是非选择语句时,可能会提供受影响行的计数,而不是结果集。
请注意,某些数据库(如 Microsoft SQL Server)在处理多个结果集时要求使用不可滚动游标。有些数据库可能会一次性执行所有语句,而有些数据库可能会延迟执行,直到实际访问结果集时才执行,有些数据库可能对允许在 SQL 批次中使用的语句有限制。
另请参阅 QSqlDriver::hasFeature(),forwardOnly,next(),isSelect(),numRowsAffected(),isActive() 和lastError() 。
int QSqlQuery::numRowsAffected() const
返回受结果 SQL 语句影响的行数,如果无法确定,则返回-1。请注意,对于SELECT
语句,该值是未定义的;请使用size() 代替。如果查询不是active ,则返回-1。
另请参阅 size() 和QSqlDriver::hasFeature()。
QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const
返回数值精度策略。
注: numericalPrecisionPolicy 属性的获取函数。
另请参阅 setNumericalPrecisionPolicy().
bool QSqlQuery::prepare(const QString &query)
准备执行 SQL 查询query 。如果查询准备成功,则返回true
;否则返回false
。
查询可能包含绑定值占位符。支持 Oracle 样式的冒号名称(如:surname
)和 ODBC 样式的占位符 (?
),但不能在同一查询中混合使用。有关示例,请参阅Detailed Description 。
可移植性说明:有些数据库会将准备查询的时间推迟到第一次执行查询时。在这种情况下,准备语法错误的查询会成功,但每个连续的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() 用于获取列的索引。
QSqlQueryq("select * from employees");QSqlRecordrec=q.record(); qDebug() << "Number of columns: " << rec.count(); intnameCol=rec.indexOf("name");// 字段 "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。请注意,在调用此函数前,查询必须处于active 状态,且isSelect() 必须返回 true。
如果relative 为 false(默认值),则适用以下规则:
- 如果index 为负数,查询结果将被放置在第一条记录之前,并返回 false。
- 否则,将尝试移动到位置index 的记录。如果无法检索到位置index 的记录,则将结果置于最后一条记录之后,并返回 false。如果成功检索到记录,则返回 true。
如果relative 为 true,则适用以下规则:
- 如果结果当前位于第一条记录之前,且
- index 为负数或零,则没有变化,并返回 false。
- index 为正值,则会尝试将结果定位在绝对位置 - 1,并遵循上述非相对查找的相同规则。index
- 如果结果当前位于最后一条记录之后,且
- index 为正值或零,则不会有任何变化,并返回 false。
- index 为负数,则会尝试将结果定位在 + 1 的相对位置,与最后一条记录保持一致,具体规则如下。index
- 如果结果当前位于中间位置,且相对偏移量index 将结果移动到零以下,则将结果定位到第一条记录之前,并返回 false。
- 否则,将尝试移动到当前记录前面的记录index (如果index 为负数,则移动到当前记录后面的记录index )。如果无法检索到偏移量index 处的记录,如果index >= 0,则将结果定位在最后一条记录之后(如果index 为负数,则定位在第一条记录之前),并返回 false。如果成功检索到记录,则返回 true。
另请参阅 next(),previous(),first(),last(),at(),isActive() 和isValid() 。
void QSqlQuery::setForwardOnly(bool forward)
将forwardOnly 设置为forward 。
注: 属性forwardOnly 的设置函数。
另请参阅 isForwardOnly(),forwardOnly,next() 和seek() 。
void QSqlQuery::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
将numericalPrecisionPolicy 设置为precisionPolicy 。
注: 属性numericalPrecisionPolicy 的设置函数。
另请参阅 numericalPrecisionPolicy() 。
[since 6.7]
void QSqlQuery::setPositionalBindingEnabled(bool enable)
将positionalBindingEnabled 设置为enable 。
注: 属性positionalBindingEnabled 的设置函数。
该函数在 Qt 6.7 中引入。
另请参阅 isPositionalBindingEnabled() 和positionalBindingEnabled 。
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(QAnyStringView name) const
这是一个重载函数。
返回当前记录中名为name 的字段的值。如果字段name 不存在,则返回无效变量。
此重载函数的效率低于value()
注意: 在 6.8 之前的 Qt XML 版本中,此函数使用QString ,而不是QAnyStringView 。
[noexcept, since 6.2]
QSqlQuery &QSqlQuery::operator=(QSqlQuery &&other)
Move-assignsother 到此对象。
此函数在 Qt 6.2 中引入。
© 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.