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::BeforeFirstRowQSql::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)

QVariant 的形式返回当前行中字段index 的数据。只有当结果处于活动状态,且定位在有效记录上,且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。

警告:如果结果尚未执行,句柄可能为 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::OutQSql::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() 。

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