class QSqlQuery#

QSqlQuery 类提供了一种执行和操作 SQL 语句的途径。 更多...

概述#

方法#

注意

本文档可能包含自动从C++翻译到Python的代码片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译存在问题,您也可以通过在https:/bugreports.qt.io个项目/PYSIDE上创建工单来告诉我们。

详细描述#

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

QSqlQuery 封装了在 QSqlDatabase 上执行的SQL查询创建、导航和检索数据所涉及的功能。它可以用来执行DML(数据操作语言)语句,如 SELECTINSERTUPDATEDELETE,以及DDL(数据定义语言)语句,如 CREATE TABLE。它还可以用来执行非标准SQL的数据库特定命令(例如,PostgreSQL的 SET DATESTYLE=ISO)。

成功执行的SQL语句将查询的状态设置为活动状态,所以 isActive() 返回 true。否则,查询的状态设置为非活动状态。在两种情况下,当执行新的SQL语句时,查询都会定位到一个无效的记录。活动查询必须定位到一个有效记录(以便 isValid() 返回 true),然后才能检索值。

对于某些数据库,如果在调用 commit() 或者 rollback() 时存在一个包含 SELECT 语句的活跃查询,则提交或回滚将失败。有关详细信息,请参阅 isActive()

记录导航是通过以下函数进行的

这些函数允许程序员在查询返回的记录中向前、向后或任意移动。如果您只需要向前移动结果(例如,通过使用 next() ),则可以使用 setForwardOnly() ,这将显著减少内存开销并提高某些数据库的性能。一旦活跃查询定位到有效记录,可以使用 value() 获取数据。所有数据均通过 QVariants 从 SQL 后端传输。

例如

query = QSqlQuery("SELECT country FROM artist")
while query.next():
    country = query.value(0).toString()
    doSomething(country)

要访问查询返回的数据,请使用 value(int)。通过传递字段的索引来访问 SELECT 语句返回的数据中的每个字段,索引从 0 开始。这使得使用 SELECT * 查询不可取,因为返回字段的顺序是不确定的。

为了提高效率,没有按名称访问字段的函数(除非您使用预定义查询并按名称绑定参数,如下所述)。为了将字段名称转换为索引,请使用 record()。例如 indexOf()

query = QSqlQuery("SELECT * FROM artist")
fieldNo = query.record().indexOf("country")
while query.next():
    country = query.value(fieldNo).toString()
    doSomething(country)

QSqlQuery 支持预定义查询执行和参数值绑定到占位符。某些数据库不支持这些功能,因此对于这些数据库,Qt 对所需功能进行仿真。例如,Oracle 和 ODBC 驱动程序具有适当的预定义查询支持,Qt 也利用了它;但是对于没有这种支持的数据库,Qt 实现了该功能,例如,通过在执行查询时用实际值替换占位符来执行此操作。使用 numRowsAffected() 查找受非 SELECT 查询影响的行数,使用 size() 查找受 SELECT 影响的行数。

Oracle 数据库使用冒号名称语法来标识占位符,例如::name。ODBC 仅仅使用 ? 字符。Qt 支持这两种语法,但限制是您不能在同一个查询中混合它们。

您可以使用boundValues() 获取单个变量中所有字段的值。

注意

并非所有SQL操作都支持绑定值。请参考数据库系统文档以检查它们的可用性。

绑定值的方法#

以下是使用四种不同的绑定方法的相同示例,以及将值绑定到存储过程的示例。

名为绑定使用命名占位符

query = QSqlQuery()
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()

位置绑定使用命名占位符

query = QSqlQuery()
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)

query = QSqlQuery()
query.prepare("INSERT INTO person (id, forename, surname) "
              "VALUES (?, ?, ?)")
query.bindValue(0, 1001)
query.bindValue(1, "Bart")
query.bindValue(2, "Simpson")
query.exec()

使用位置占位符绑定值(版本2)

query = QSqlQuery()
query.prepare("INSERT INTO person (id, forename, surname) "
              "VALUES (?, ?, ?)")
query.addBindValue(1001)
query.addBindValue("Bart")
query.addBindValue("Simpson")
query.exec()

将值绑定到存储过程

此代码调用名为 AsciiToInt() 的存储过程,通过其 in 参数传递一个字符,并从 out 参数获取它的结果。

query = QSqlQuery()
query.prepare("CALL AsciiToInt(?, ?)")
query.bindValue(0, "A")
query.bindValue(1, 0, QSql.Out)
query.exec()
i = query.boundValue(1).toInt() # i is 65

请注意,未绑定参数将保留其值。

使用 return 语句返回值或返回多个结果集的存储过程不完全受支持。具体详情请参阅

警告

必须在创建 QSqlQuery 之前加载 SQL 驱动程序和打开连接。此外,在查询存在时连接必须保持打开;否则,QSqlQuery 的行为是未定义的。

class BatchExecutionMode#

常量

描述

QSqlQuery.ValuesAsRows

  • 更新多行。将 QVariantList 中的每个条目视为更新下一行的值。

QSqlQuery.ValuesAsColumns

  • 更新单行。将 QVariantList 中的每个条目视为数组类型的一个值。

__init__(db)#
参数:

dbQSqlDatabase

使用数据库 db 构造 QSqlQuery 对象。如果 db 无效,则使用应用程序的默认数据库。

另请参阅

QSqlDatabase

__init__(r)
参数:

rQSqlResult

构建一个使用 QSqlQuery 对象与数据库通信的 _QSqlResult result

__init__([query=""[, db=QSqlDatabase()]])
参数:

使用 SQL query 和数据库 db 构建一个 QSqlQuery 对象。如果未指定 db 或无效,应用程序的默认数据库将被使用。如果 query 不是空字符串,它将被执行。

另请参阅

QSqlDatabase

__init__(other)
参数:

otherQSqlQuery

注意

此函数已弃用。

构建 other 的副本。

QSqlQuery 无法有意义地复制。预处理语句、绑定值等将无法正确工作,具体取决于您的数据库驱动程序(例如,副本的更改将影响原始文档)。将 QSqlQuery 视为只能移动的类型。

addBindValue(val[, type=QSql.In])#
参数:

在按位置值绑定时,将值 val 添加到值的列表中。addBindValue() 调用的顺序决定了在预处理查询中什么占位符将被绑定到值。如果 paramTypeOutInOut,在 exec() 调用后,占位符将被数据库中的数据覆盖。

要绑定 NULL 值,请使用 null QVariant;例如,如果您正在绑定字符串,请使用 QVariant(QMetaType::fromType<QString>())

at()#
返回类型::

int

返回查询的当前内部位置。第一条记录在位置零。如果位置无效,则函数返回 BeforeFirstRowAfterLastRow ,它们是特殊的负值。

bindValue(placeholder, val[, type=QSql.In])#
参数:
  • placeholder – str

  • val – 对象

  • typeParamTypeFlag 的组合

将默认占位符 placeholder 绑定到语句中的值 val。请注意,指定占位符名称时必须包含占位符标记(例如 :)。如果参数类型 paramTypeOutInOut,则占位符将在执行 exec() 调用后用数据库中的数据覆盖。在这种情况下,必须预分配足够的空间以存储结果。

要绑定 NULL 值,请使用 null QVariant;例如,如果您正在绑定字符串,请使用 QVariant(QMetaType::fromType<QString>())

bindValue(pos, val[, type=QSql.In])
参数:

将已准备语句中的占位符(位置 pos)绑定到值 val。字段编号从0开始。如果 paramTypeOutInOut ,则在 exec() 调用后,占位符将被数据库中的数据覆盖。

boundValue(placeholder)
参数:

placeholder – str

返回类型::

object

返回指定占位符的值。

boundValue(pos)
参数:

pos – int

返回类型::

object

返回位置 pos 所占位符的值。

另请参阅

boundValues()

boundValueName(pos)
参数:

pos – int

返回类型::

str

返回位置 pos 的绑定值名称。

列表的顺序是绑定顺序,无论是否使用命名绑定或位置绑定。

另请参阅

boundValueNames()

boundValueNames()
返回类型::

list of strings

返回所有绑定值的名称。

列表的顺序是绑定顺序,无论是否使用命名绑定或位置绑定。

boundValues()#
返回类型::

.枚举类型QVariant的列表

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

返回绑定的值的列表。

列表的顺序是绑定顺序,无论是否使用命名绑定或位置绑定。

绑定的值可以通过以下方式进行查看

list = query.boundValues()
for i in range(0, list.size()):
    print(i, ":", list.at(i).toString())
clear()#

清空结果集并释放查询持有的任何资源。将查询状态设置为非活动。通常不需要调用此函数。

driver()#
返回类型::

QSqlDriver

返回与查询关联的数据库驱动程序。

exec()#
返回类型::

bool

执行之前准备的SQL查询。如果查询执行成功则返回 true;否则返回 false

注意,当调用 exec() 时将重置此查询的最后一个错误。

exec(query)
参数:

query – 字符串

返回类型::

bool

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

执行 query 中的SQL。如果查询成功则返回 true 并将查询状态设置为 active;否则返回 false。The query 字符串必须使用适用于要查询的SQL数据库的语法(例如,标准SQL)。

查询执行后,查询在无效记录上定位,在检索数据值之前必须导航到有效记录(例如,使用 next() )。

请注意,每次调用 exec() 时,该查询的最后错误都会重置。

对于 SQLite,查询字符串每次只能包含一条语句。如果提供了多条语句,函数会返回 false

示例

query = QSqlQuery()
query.exec("INSERT INTO employee (id, name, salary) "
           "VALUES (1001, 'Thad Beaumont', 65000)")
execBatch([mode=QSqlQuery.BatchExecutionMode.ValuesAsRows])#
参数:

modeBatchExecutionMode

返回类型::

bool

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

执行一个之前准备好的 SQL 查询,以批处理方式。所有绑定参数都应该是变体列表。如果数据库不支持批处理执行,驱动程序将使用传统的 exec() 调用来模拟。

如果查询成功执行则返回 true;否则返回 false

示例

q = QSqlQuery()
q.prepare("insert into myTable values (?, ?)")
ints = QVariantList()
ints << 1 << 2 << 3 << 4
q.addBindValue(ints)
names = QVariantList()
names << "Harald" << "Boris" << "Trond" << QVariant(QMetaType.fromType<QString>())
q.addBindValue(names)
if not q.execBatch():
    print(q.lastError())

上面的示例向 myTable 插入了四行新数据。

1 Harald
2 Boris
3 Trond
4 NULL

要绑定 NULL 值,需要向绑定的 QVariantList 中添加相关类型的 null QVariant;例如,如果使用字符串,应使用 QVariant(QMetaType::fromType<QString>())

注意

每个绑定的 QVariantList 必须包含相同数量的变体。

注意

列表中 QVariants 的类型不得更改。例如,你无法在 QVariantList 内混合整数和字符串变体。

mode 参数指示如何解释绑定的 QVariantList。如果 mode 是 ValuesAsRows,则 QVariantList 内的每个变体都会被解释为新行的值。在 Oracle 驱动程序中,ValuesAsColumns 是一个特殊情况。在此模式下,QVariantList 内的每个条目都会被解释为存储过程内部 IN 或 OUT 值的数组值。注意,这仅适用于 IN 或 OUT 值是只有一列的基本类型的表格类型,例如 TYPE myType IS TABLE OF VARCHAR(64) INDEX BY BINARY_INTEGER;

exec_()#
返回类型::

bool

exec_(arg__1)
参数:

arg__1 – 字符串

返回类型::

bool

executedQuery()#
返回类型::

str

返回最后一次成功执行的查询。

在大多数情况下,此函数返回与 lastQuery() 相同的字符串。如果一个带有占位符的预编译查询在不支持此操作的数据库管理系统中执行,则此查询的预编译将进行模拟。原始查询中的占位符被其绑定值替换以形成一个新查询。此函数返回修改后的查询。这主要用于调试目的。

另请参阅

lastQuery()

finish()#

指示数据库驱动程序,在重新执行之前,无需从该查询中检索更多数据。通常不需要调用此函数,但如果您打算稍后重用查询,则这可能有助于释放资源,例如锁或游标。

将查询设置为非活动状态。绑定值保留其值。

另请参阅

prepare() exec() isActive()

first()#
返回类型::

bool

检索结果中的第一条记录(如果有的话),并将查询定位到检索到的记录。注意,结果必须在 active 状态,并且在调用此函数之前必须返回 true 的值由 isSelect() 返回才不会执行任何操作并返回 false。如果成功则返回 true。如果失败,则查询位置将被设置为无效位置,并返回 false。

isActive()#
返回类型::

bool

返回 true 如果查询是 活跃的。当一个 QSqlQuery 对象成功执行但尚未完成时,它被称作活跃的。当你完成一个活跃的查询时,你可以通过调用 finish()clear() 来使查询变为非活跃,或者你可以删除 QSqlQuery 实例。

注意

特别值得注意的是,一个活跃的查询是一个 SELECT 语句。对于一些支持事务的数据库,一个活跃的 SELECT 语句可以导致 commit()rollback() 失败,因此在提交或回滚之前,你应该使用上述列出的方法之一来使你的活跃的 SELECT 语句查询变为非活跃。

另请参阅

isSelect()

isForwardOnly()#
返回类型::

bool

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

另请参阅

setForwardOnly() next()

isNull(name)#
参数:

name – 字符串

返回类型::

bool

这是一个重载函数。

如果没有字段具有此 name,则返回 true;否则返回对应字段索引的 isNull(int index)。

这个重载版本比 isNull() 效率更低。

isNull(field)
参数:

field – int

返回类型::

bool

如果查询未 active ,查询未定位到有效记录,没有此类 field,或 field 是空值,则返回 true;否则返回 false。请注意,对于某些驱动程序,尝试检索数据之后,isNull() 才能返回准确的信息。

isPositionalBindingEnabled()#
返回类型::

bool

如果当前启用了位置绑定,则返回 true

isSelect()#
返回类型::

bool

如果当前查询是 SELECT 语句,则返回 true;否则返回 false

isValid()#
返回类型::

bool

如果查询当前定位在有效记录上,则返回 true;否则返回 false

last()#
返回类型::

bool

如果存在,检索结果中的最后一条记录,并将查询定位到检索的记录。请注意,结果必须处于 active 状态,并且在调用此函数之前必须返回 true,或者它将不执行任何操作并返回 false。如果成功,则返回 true。如果失败,查询位置设置为一个无效的位置,并返回 false。

lastError()#
返回类型::

QSqlError

返回关于查询最后发生的错误(如果有的话)的错误信息。

另请参阅

QSqlError lastError()

lastInsertId()#
返回类型::

object

如果数据库支持,返回最后插入行的对象ID。如果没有插入任何值或者数据库没有返回ID,将返回无效的QVariant。如果插入操作影响了多行,行为是未定义的。

对于MySQL数据库,将返回行的自增字段。

注意

要在PSQL中运行此函数,表必须包含OIDs,这些字段可能不是默认创建的。请检查default_with_oids配置变量以确认。

另请参阅

hasFeature()

lastQuery()#
返回类型::

str

返回当前正在使用的查询文本,如果没有当前查询文本,则返回空字符串。

另请参阅

executedQuery()

next()#
返回类型::

bool

如果可用,检索结果中的下一个记录并将其定位在检索的记录上。请注意,结果必须处于active状态,并且在调用此函数之前必须调用isSelect()函数返回true,否则它将不执行任何操作并返回false。

以下规则适用:

  • 如果结果目前位于第一条记录之前,例如在查询执行后立即,将尝试检索第一条记录。

  • 如果结果目前位于最后一条记录之后,则没有变化,返回false。

  • 如果结果位于中间,将尝试检索下一条记录。

如果无法检索记录,将结果定位在最后一条记录之后,并返回false。如果成功检索记录,则返回true。

nextResult()#
返回类型::

bool

忽略当前结果集,并在可用时导航到下一个结果集。

某些数据库能够为存储过程或SQL批次(包含多个语句的查询字符串)返回多个结果集。如果在执行查询后可用多个结果集,则可以使用此功能导航到下一个结果集。

如果可用新结果集,此功能将返回true。查询将重新定位到新结果集中的无效记录,必须在获取数据值之前将其导航到有效记录。如果不可用新结果集,则函数返回false,并将查询设置为实现空闲。在任何情况下,旧结果集都将被丢弃。

当其中一个语句不是SELECT语句时,可能可以获得受影响行数的计数而不是结果集。

请注意,某些数据库,例如Microsoft SQL Server,在处理多个结果集时需要非可滚动游标。某些数据库可能会一次性执行所有语句,而其他数据库可能会延迟执行直到结果集被实际访问,某些数据库在SQL批次中可能对允许使用的语句有约束。

numRowsAffected()#
返回类型::

int

返回结果 SQL 语句影响的行数,如果无法确定则返回 -1。注意,对于 SELECT 语句,该值未定义;请使用 size() 代替。如果查询不是 active 的,返回 -1。

另请参阅

size() hasFeature()

numericalPrecisionPolicy()#
返回类型::

数值精度策略

返回当前精度策略。

prepare(query)#
参数:

query – 字符串

返回类型::

bool

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

准备要执行的 SQL 查询 query。如果查询准备成功,则返回 true;否则返回 false

查询可能包含用于绑定值的占位符。支持 Oracle 风格的冒号名称 (例如,:surname) 和 ODBC 风格的 (?) 占位符;但它们不能在同一个查询中混用。请参阅 Detailed Description 以获取示例。

可移植性注释:某些数据库选择在第一次执行查询时才准备查询。在这种情况下,准备语法错误的查询会成功,但后续的每个 exec() 都将失败。当数据库不支持直接使用命名占位符时,占位符只能包含字符范围 [a-zA-Z0-9_]。

对于 SQLite,查询字符串每次只能包含一条语句。如果提供了多条语句,函数会返回 false

示例

query = QSqlQuery()
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()
previous()#
返回类型::

bool

如果可用,检索结果中的上一条记录并将查询定位到检索的记录上。注意,结果必须在 active 状态,并且必须调用此函数之前 isSelect() 返回 true,否则它将不执行任何操作并返回 false。

以下规则适用:

  • 如果结果当前位于第一条记录之前,则没有变化,返回false。

  • 如果结果当前位于最后一条记录之后,则尝试检索最后一条记录。

  • 如果结果位于中间某处,则尝试检索上一条记录。

如果无法检索记录,结果位置将移至第一条记录之前,并返回false。如果成功检索到记录,则返回true。

record()#
返回类型::

QSqlRecord

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

返回一个包含当前查询字段信息的 QSqlRecord。如果查询指向有效行(isValid() 返回 true),则记录填充行值。如果没有活动查询(isActive() 返回 false),则返回空记录。

要从查询中检索值,应使用 value(),因为其基于索引的查找更快。

在下面的示例中,执行了 SELECT * FROM 查询。由于列的顺序未定义,因此使用 indexOf() 获取列的索引。

q = QSqlQuery("select * from employees")
rec = q.record()
print("Number of columns: ", rec.count())
nameCol = rec.indexOf("name") # index of the field "name"
while q.next():
    print(q.value(nameCol).toString()) # output all names

另请参阅

value()

result()#
返回类型::

QSqlResult

返回与查询关联的结果。

seek(i[, relative=false])#
参数:
  • i – int

  • relative – bool

返回类型::

bool

检索位置 index 的记录,如果存在,则查询定位在检索到的记录上。第一条记录在位置 0。请注意,在调用此函数之前,查询必须处于 active 状态,且 isSelect() 必须返回 true。

如果 relative 是 false(默认值),适用以下规则:

  • 如果 index 是负数,结果定位在第一条记录之前,并返回 false。

  • 否则,尝试移动到位置 index 的记录。如果无法检索到位置 index 的记录,结果定位在最后一条记录之后,并返回 false。如果成功检索到记录,则返回 true。

如果 relative 是 true,适用以下规则:

  • 如果结果 Currently 定位在第一条记录之前,并且

    • 如果 index 是负数或零,则没有任何变化,并返回 false。

    • 如果 index 是正数,则尝试将结果定位在绝对位置 index - 1,遵循上述非相对搜索的相同规则。

  • 如果结果 Currently 定位在最后一条记录之后,并且

    • 如果 index 是正数或零,则没有任何变化,并返回 false。

    • 如果 index 是负数,则尝试将结果定位在最后一条记录之后 index 个相对位置,遵循以下规则。

  • 如果结果 Currently 位于中间,并且相对偏移 index 将结果移动到零以下,则结果定位在第一条记录之前并返回 false。

  • 否则,尝试将结果移动到当前位置之前的 index 条记录(如果 index 是负数,则为当前位置之后的 index 条记录)。如果无法检索到偏移 index 的记录,如果 index >= 0,则结果定位在最后一条记录之后,如果 index 是负数,则结果定位在第一条记录之前,并返回 false。如果成功检索到记录,则返回 true。

setForwardOnly(forward)#
参数:

forward – 布尔型

将单向模式设置为 forward。如果 forward 为 true,则只能使用 next()seek() 正值进行结果导航。

由于结果无需缓存,单向模式(取决于驱动程序)可能更节省内存,同时也能在某些数据库上提高性能。为了使其生效,必须在查询准备或执行之前调用 setForwardOnly()。请注意,接受查询和数据库作为参数的构造函数可能会执行该查询。

默认情况下,单向模式是关闭的。

将单向模式设置为 false 是对数据库引擎的建议,数据库引擎将决定结果集是单向还是可滚动。 isForwardOnly() 将始终返回结果集的正确状态。

注意

在查询执行后将调用 setForwardOnly 会导致最坏情况下崩溃的不预期结果。

注意

为了确保单向查询成功完成,应用程序应在查询执行以及导航查询结果后检查 lastError() 以确定没有错误。

警告

PostgreSQL:在单向模式下导航查询结果时,不要在相同的数据库连接上执行任何其他 SQL 命令。这将导致查询结果丢失。

setNumericalPrecisionPolicy(precisionPolicy)#
参数:

precisionPolicyNumericalPrecisionPolicy

指示数据库驱动返回具有由 precisionPolicy 指定的精度的数值。

例如,Oracle 驱动可以将数值作为字符串检索以防止精度丢失。如果高精度不重要,可以使用此方法通过绕过字符串转换来提高执行速度。

注意:不支持以低精度获取数值的驱动将忽略精度策略。您可以使用 hasFeature() 查询驱动程序是否支持此功能。

注意:设置精度策略不会影响当前活动的查询。调用 exec(QString)prepare() 来激活策略。

setPositionalBindingEnabled(enable)#
参数:

enable – bool

根据 enable 启用或禁用此查询的定位绑定(默认值为 true)。禁用定位绑定对于查询本身包含一个‘?’很有用,这个‘?’不应被视为定位绑定参数,例如,作为PostgreSQL数据库的JSON运算符。

当数据库本支持以问号作为定位绑定时,此函数将没有效果(另请参阅 PositionalPlaceholders )。

size()#
返回类型::

int

返回结果的尺寸(返回的行数),或者如果无法确定尺寸或数据库不支持报告查询尺寸信息,则返回-1。请注意,对于非 SELECT 语句(isSelect() 返回 false),size() 将返回-1。如果查询不是活动的(isActive() 返回 false),则返回-1。

为了确定非 SELECT 语句影响的行数,请使用 numRowsAffected()

swap(other)#
参数:

otherQSqlQuery

交换 other 到此对象。此操作非常快速且永远不会失败。

value(name)#
参数:

name – 字符串

返回类型::

object

这是一个重载函数。

返回当前记录中名为 name 的字段的值。如果字段 name 不存在则返回无效的变量。

此重载比 value() 的效率低。

value(i)
参数:

i – int

返回类型::

object

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

返回当前记录中 index 字段的值。

字段从左到右按 SELECT 语句中的文本编号,例如

forename, = SELECT()

字段 0 是 forename 和字段 1 是 surname。使用 SELECT * 不推荐,因为查询中字段的顺序是未定义的。

如果字段 index 不存在,或者查询处于无效状态,或查询位于无效记录上,则返回无效的 QVariant。