本页内容

QSqlResult Class

QSqlResult 类提供了一个用于从特定 SQL 数据库中访问数据的抽象接口。更多内容...

头文件: #include <QSqlResult>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql

公共函数

virtual ~QSqlResult()
virtual QVariant handle() const

受保护的类型

enum BindingSyntax { PositionalBinding, NamedBinding }

受保护函数

QSqlResult(const QSqlDriver *db)
void addBindValue(const QVariant &val, QSql::ParamType paramType)
int at() const
virtual void bindValue(int index, const QVariant &val, QSql::ParamType paramType)
virtual void bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType)
QSql::ParamType bindValueType(int index) const
QSql::ParamType bindValueType(const QString &placeholder) const
QSqlResult::BindingSyntax bindingSyntax() const
QVariant boundValue(int index) const
QVariant boundValue(const QString &placeholder) const
int boundValueCount() const
QString boundValueName(int index) const
QStringList boundValueNames() const
QVariantList boundValues() const
QVariantList &boundValues()
void clear()
virtual QVariant data(int index) = 0
const QSqlDriver *driver() const
virtual bool exec()
QString executedQuery() const
virtual bool fetch(int index) = 0
virtual bool fetchFirst() = 0
virtual bool fetchLast() = 0
virtual bool fetchNext()
virtual bool fetchPrevious()
bool hasOutValues() const
bool isActive() const
bool isForwardOnly() const
virtual bool isNull(int index) = 0
bool isSelect() const
bool isValid() const
QSqlError lastError() const
virtual QVariant lastInsertId() const
QString lastQuery() const
virtual int numRowsAffected() = 0
virtual bool prepare(const QString &query)
virtual QSqlRecord record() const
virtual bool reset(const QString &query) = 0
void resetBindCount()
virtual bool savePrepare(const QString &query)
virtual void setActive(bool active)
virtual void setAt(int index)
virtual void setForwardOnly(bool forward)
virtual void setLastError(const QSqlError &error)
virtual void setQuery(const QString &query)
virtual void setSelect(bool select)
virtual int size() = 0

详细说明

通常情况下,您应使用QSqlQuery 代替 QSqlResult,因为QSqlQuery 为 QSqlResult 的特定数据库实现提供了一个通用的封装。

如果您正在实现自己的 SQL 驱动程序(通过继承QSqlDriver ),则需要提供自己的 QSqlResult 子类,该子类应实现所有纯虚函数以及您所需的其他虚函数。

另请参阅 QSqlDriver 。

成员类型文档

enum QSqlResult::BindingSyntax

此枚举类型规定了在预编译查询中指定占位符的各种语法。

常量值描述
QSqlResult::PositionalBinding0使用 ODBC 风格的位置语法,以“?”作为占位符。
QSqlResult::NamedBinding1使用 Oracle 风格的语法,带有名称占位符(例如:“:id”)

另请参阅 bindingSyntax()。

成员函数文档

[explicit protected] QSqlResult::QSqlResult(const QSqlDriver *db)

使用数据库驱动程序db 创建一个 QSqlResult 对象。该对象初始化为非活动状态。

另请参阅 isActive() 和driver()。

[virtual noexcept] QSqlResult::~QSqlResult()

销毁该对象并释放所有已分配的资源。

[protected] void QSqlResult::addBindValue(const QVariant &val, QSql::ParamType paramType)

将参数类型为paramType 的值val 绑定到当前记录(行)中下一个可用的位置。

另请参阅 bindValue()。

[protected] int QSqlResult::at() const

返回结果的当前(从零开始计数)行位置。可能会返回特殊值QSql::BeforeFirstRow 或QSql::AfterLastRow 。

另请参阅 setAt() 和isValid()。

[virtual protected] void QSqlResult::bindValue(int index, const QVariant &val, QSql::ParamType paramType)

将参数类型为paramType 的值val 绑定到当前记录(行)中的位置index 。

另请参阅 addBindValue()。

[virtual protected] void QSqlResult::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType)

将参数类型为paramType 的值val 绑定到当前记录(行)中的placeholder 名称。

注意:将 未定义的占位符进行绑定 将导致未定义的行为。

这是一个重载函数。

另请参阅 QSqlQuery::bindValue()。

[protected] QSql::ParamType QSqlResult::bindValueType(int index) const

返回绑定在位置index 处的值的参数类型。

另请参阅 boundValue()。

[protected] QSql::ParamType QSqlResult::bindValueType(const QString &placeholder) const

返回与给定placeholder 名称绑定的值的参数类型。

这是一个重载函数。

[protected] QSqlResult::BindingSyntax QSqlResult::bindingSyntax() const

返回预编译查询所使用的绑定语法。

[protected] QVariant QSqlResult::boundValue(int index) const

返回当前记录(行)中位置为index 处的绑定值。

另请参阅 bindValue() 和boundValues()。

[protected] QVariant QSqlResult::boundValue(const QString &placeholder) const

返回当前记录(行)中由给定的placeholder 名称所绑定的值。

这是一个重载函数。

另请参阅 bindValueType()。

[protected] int QSqlResult::boundValueCount() const

返回结果中绑定值的个数。

另请参阅 boundValues()。

[protected] QString QSqlResult::boundValueName(int index) const

返回当前记录(行)中位于位置index 的绑定值的名称。

另请参阅 boundValue() 和boundValueNames()。

[protected] QStringList QSqlResult::boundValueNames() const

返回所有绑定值的名称。

另请参阅 boundValue() 和boundValueName()。

[protected] QVariantList QSqlResult::boundValues() const

返回当前记录(行)的结果绑定值列表。

另请参阅 boundValueCount()。

[protected] QVariantList &QSqlResult::boundValues()

返回指向当前记录(行)结果绑定值列表的可变引用。

这是一个重载函数。

另请参阅 boundValueCount()。

[protected] void QSqlResult::clear()

清除整个结果集,并释放所有相关资源。

[pure virtual protected] QVariant QSqlResult::data(int index)

返回当前行中字段index 的数据,格式为QVariant 。只有当结果处于活动状态、定位在有效记录上,且index 为非负数时,才会调用此函数。派生类必须重写此函数,并返回字段index 的值;如果无法确定该值,则返回 QVariant()。

[protected] const QSqlDriver *QSqlResult::driver() const

返回与结果关联的驱动程序。该对象即为传递给构造函数的对象。

[virtual protected] bool QSqlResult::exec()

执行该查询,若成功则返回 true;否则返回 false。

另请参阅 prepare()。

[protected] QString QSqlResult::executedQuery() const

返回实际执行的查询。这可能与传入的查询不同,例如,当在预编译查询中使用了绑定值,而底层数据库不支持预编译查询时。

另请参阅 exec() 和setQuery()。

[pure virtual protected] bool QSqlResult::fetch(int index)

将结果定位到任意(从零开始计数)的行index 。

仅当结果处于活动状态时才会调用此函数。派生类必须重写此函数,将结果定位到行index ,并使用适当的值调用setAt()。返回 true 表示成功,返回 false 表示失败。

另请参阅 isActive()、fetchFirst()、fetchLast()、fetchNext() 以及fetchPrevious()。

[pure virtual protected] bool QSqlResult::fetchFirst()

将结果定位到结果集中的第一条记录(第 0 行)。

仅当结果处于活动状态时,才会调用此函数。派生类必须重写此函数,将结果定位到第一个记录,并传入适当的值调用setAt()。返回 true 表示成功,返回 false 表示失败。

另请参阅 fetch() 和fetchLast()。

[pure virtual protected] bool QSqlResult::fetchLast()

将结果定位到结果集的最后一条记录(最后一行)。

仅当结果处于活动状态时,才会调用此函数。派生类必须重写此函数,并将结果定位到最后一条记录,同时使用适当的值调用setAt()。返回true表示成功,返回false表示失败。

另请参阅 fetch() 和fetchFirst()。

[virtual protected] bool QSqlResult::fetchNext()

将结果定位到结果集中的下一个可用记录(行)。

只有当结果处于活动状态时,才会调用此函数。默认实现会使用下一个索引调用 `fetch()`。派生类可以重写此函数,通过其他方式将结果定位到下一个记录,并使用适当的值调用 `setAt()`。返回 `true` 表示成功,返回 `false` 表示失败。

另请参阅 fetch() 和fetchPrevious()。

[virtual protected] bool QSqlResult::fetchPrevious()

将结果定位到结果集中的上一条记录(行)。

仅当结果处于活动状态时才会调用此函数。默认实现会使用上一个索引调用fetch()。派生类可以重写此函数,通过其他方式将结果定位到下一个记录,并使用适当的值调用setAt()。返回 true 表示成功,返回 false 表示失败。

[virtual] QVariant QSqlResult::handle() const

返回该结果集的低级数据库句柄,该句柄由QVariant 对象封装;若不存在句柄,则返回无效的QVariant 对象。

警告:请 极其谨慎地使用 此函数,且仅在您清楚自己在做什么的情况下才使用。

警告: 如果结果集被修改(例如,您清空了结果集),此处返回的句柄 可能会变成一个过期的指针。

警告: 如果结果尚未执行,该 句柄可能为 NULL。

警告:PostgreSQL :在仅向前模式下,调用fetch()、fetchFirst()、fetchLast()、fetchNext()、fetchPrevious() 或 nextResult() 之后,QSqlResult 的句柄可能会发生变化。

此处返回的句柄取决于数据库,在访问它之前,应先查询该变体的类型名称。

此示例检索 sqlite 结果的句柄:

QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);

QVariant v = query.result()->handle();
if (v.isValid() && qstrcmp(v.typeName(), "sqlite3_stmt*") == 0) {
    // v.data() returns a pointer to the handle
    sqlite3_stmt *handle = *static_cast<sqlite3_stmt **>(v.data());
    if (handle) {
        // ...
    }
}

以下代码片段返回 PostgreSQL 或 MySQL 的句柄:

if (qstrcmp(v.typeName(), "PGresult*") == 0) {
    PGresult *handle = *static_cast<PGresult **>(v.data());
    if (handle) {
        // ...
        }
}

if (qstrcmp(v.typeName(), "MYSQL_STMT*") == 0) {
    MYSQL_STMT *handle = *static_cast<MYSQL_STMT **>(v.data());
    if (handle) {
        // ...
        }
    }

另请参阅 QSqlDriver::handle()。

[protected] bool QSqlResult::hasOutValues() const

如果查询的绑定值中至少有一个是 `QSql::Out ` 或 `QSql::InOut`,则返回 `true `;否则返回 `false`。

另请参阅 bindValueType()。

[protected] bool QSqlResult::isActive() const

如果结果中有待检索的记录,则返回true ;否则返回false 。

[protected] bool QSqlResult::isForwardOnly() const

如果只能向前滚动结果集,则返回true ;否则返回false 。

另请参阅 setForwardOnly()。

[pure virtual protected] bool QSqlResult::isNull(int index)

如果当前行中位置为index 的字段为空,则返回true ;否则返回false 。

[protected] bool QSqlResult::isSelect() const

如果当前结果来自SELECT 语句,则返回true ;否则返回false 。

另请参阅 setSelect()。

[protected] bool QSqlResult::isValid() const

如果结果位于有效记录上(即结果既不在第一个记录之前,也不在最后一个记录之后),则返回true ;否则返回false 。

另请参阅 at()。

[protected] QSqlError QSqlResult::lastError() const

返回与该结果相关的最后一个错误。

另请参阅 ` setLastError()`。

[virtual protected] QVariant QSqlResult::lastInsertId() const

如果数据库支持,则返回最近插入行对应的对象 ID。如果查询未插入任何值,或者数据库未返回 ID,则会返回一个无效的QVariant 。如果插入操作涉及多行,则行为未定义。

请注意,对于 Oracle 数据库,将返回该行的 ROWID;而对于 MySQL 数据库,将返回该行的自动递增字段。

另请参阅 QSqlDriver::hasFeature()。

[protected] QString QSqlResult::lastQuery() const

返回当前的 SQL 查询语句,如果不存在则返回空字符串。

另请参阅 setQuery()。

[pure virtual protected] int QSqlResult::numRowsAffected()

返回上次执行的查询所影响的行数;如果无法确定,或者该查询是SELECT 语句,则返回-1。

另请参阅 size()。

[virtual protected] bool QSqlResult::prepare(const QString &query)

将给定的query 进行预处理以供执行;该查询通常会使用占位符,以便能够重复执行。如果查询预处理成功,则返回true;否则返回false 。

另请参阅 exec()。

[virtual protected] QSqlRecord QSqlResult::record() const

如果查询处于活动状态,则返回当前记录;否则返回一个空的QSqlRecord 。

默认实现始终返回一个空的 `QSqlRecord`。

另请参阅 isActive()。

[pure virtual protected] bool QSqlResult::reset(const QString &query)

将结果设置为在后续数据检索中使用 SQL 语句 `query `。

派生类必须重写此函数,并将query 应用于数据库。此函数仅在结果集被设置为非活动状态,且光标定位在新结果集的首条记录之前时才会被调用。如果查询成功且结果集已准备就绪,派生类应返回 true;否则应返回 false。

另请参阅 setQuery()。

[protected] void QSqlResult::resetBindCount()

重置绑定参数的数量。

[virtual protected] bool QSqlResult::savePrepare(const QString &query)

准备给定的query ,并在可能的情况下使用底层数据库功能。如果查询准备成功,则返回true ;否则返回false 。

注意:此方法本应命名为“safePrepare()”。

另请参阅 prepare()。

[virtual protected] void QSqlResult::setActive(bool active)

提供此函数供派生类将内部活动状态设置为active 。

另请参阅 isActive()。

[virtual protected] void QSqlResult::setAt(int index)

提供此函数供派生类将内部(从零开始计数)的行位置设置为index 。

另请参阅 at()。

[virtual protected] void QSqlResult::setForwardOnly(bool forward)

将“仅向前”模式设置为forward 。如果forward 为true,则仅允许使用fetchNext()来遍历结果集。“仅向前”模式由于无需缓存结果集,因此所需内存大幅减少。默认情况下,此功能处于禁用状态。

将“仅向前”设置为false仅是对数据库引擎的建议,最终是否将结果集设为“仅向前”或“可滚动”由数据库引擎决定。isForwardOnly() 将始终返回结果集的正确状态。

注意: 在查询执行完成后调用 setForwardOnly,轻则导致结果异常,重则导致程序崩溃。

注意:为确保 “仅向前”查询成功完成,应用程序不仅应在执行查询后,还应在遍历查询结果后,通过lastError() 检查是否存在错误。

警告:PostgreSQL :在仅向前模式下遍历查询结果时,请勿在同一数据库连接上执行任何其他 SQL 命令。否则将导致查询结果丢失。

另请参阅 isForwardOnly()、fetchNext() 和QSqlQuery::setForwardOnly()。

[virtual protected] void QSqlResult::setLastError(const QSqlError &error)

提供此函数供派生类将最后一个错误设置为error 。

另请参阅 lastError()。

[virtual protected] void QSqlResult::setQuery(const QString &query)

将结果的当前查询设置为query 。您必须调用reset() 方法才能在数据库上执行该查询。

另请参阅 reset() 和lastQuery()。

[virtual protected] void QSqlResult::setSelect(bool select)

提供此函数供派生类使用,用于指示当前语句是否为 SQLSELECT 语句。如果语句是SELECT 语句,则select 参数应为 true;否则应为 false。

另请参阅 isSelect()。

[pure virtual protected] int QSqlResult::size()

返回SELECT 结果的大小;如果无法确定该大小,或者查询不是SELECT 语句,则返回-1。

另请参阅 numRowsAffected()。

© 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.