Qt中的Qsqlquery类

【Qt中的Qsqlquery类】QSqlQuery类提供了执行和操作SQL语句的方法。
QSqlQuery封装了在QSqlDatabase上执行的SQL查询中创建,导航和检索数据所涉及的功能。 它可以用来执行DML(数据操作语言)语句,如SELECT,INSERT,UPDATE和DELETE,以及DDL(数据定义语言)语句,如CREATE TABLE。 它也可以用来执行非标准SQL的特定于数据库的命令(例如,PostgreSQL的SET DATESTYLE = ISO)。
成功执行的SQL语句将查询的状态设置为活动状态,以便isActive()返回true。 否则,查询的状态设置为inactive。 在任何一种情况下,执行新的SQL语句时,查询都被定位在invalid的记录上。 必须将活动查询导航到有效记录(以便isValid()返回true),然后才能检索值。
对于某些数据库,如果在调用commit()或rollback()时正存在SELECT语句的查询,则提交或回滚将失败。 有关详细信息,请参阅isActive()。
使用以下功能执行导航记录:
? next()
? previous()
? first()
? last()
? seek()
这些函数允许程序员通过查询返回的记录向前,向后或任意移动。 如果您只需要在结果中前进(例如,使用next()),则可以使用setForwardOnly(),这将节省大量的内存开销并提高某些数据库的性能。 一旦有效的查询定位在有效的记录上,就可以使用value()来检索数据。 所有数据都使用QVariants从SQL后端传输。
For example:
QSqlQuery query(“SELECT country FROM artist”);
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
要访问查询返回的数据,请使用value(int)。 由SELECT语句返回的数据中的每个字段都是通过传递字段在语句中的位置(从0开始)来访问的。这使得使用SELECT *查询变得不可接受,因为返回的字段的顺序是不确定的。
为了提高效率,不存在按名称访问字段的函数(除非您使用prepared的名称查询,如下所述)。 要将字段名称转换为索引,请使用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()检索单个变量(地图)中所有字段的值。
Approaches to Binding Values
下面我们给出使用四种不同绑定方法中每一种的相同示例,以及绑定到存储过程的值的一个示例。
Named binding using named placeholders:
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();
Positional binding using named placeholders:
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();
Binding values using positional placeholders (version 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();
Binding values using positional placeholders (version 2):
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
“VALUES (?, ?, ?)”);
query.addBindValue(1001);
query.addBindValue(“Bart”);
query.addBindValue(“Simpson”);
query.exec();
Binding values to a stored procedure:
该代码调用名为AsciiToInt()的存储过程,通过其in参数传递一个字符,并将其结果输出到out参数中。
请注意,未绑定的参数将保留其值。
不完全支持使用return语句返回值或返回多个结果集的存储过程。 有关具体的细节请参阅SQL数据库驱动
警告:您必须加载SQL驱动程序并在创建QSqlQuery之前打开连接。 此外,连接必须保持打开,而查询存在; 否则,QSqlQuery的行为是不确定的。
Member Function Documentation
QSqlQuery::QSqlQuery(QSqlResult *result)
构造一个使用QSqlResult结果与数据库进行通信的QSqlQuery对象。
QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
使用SQL查询和数据库db构造一个QSqlQuery对象。 如果db没有指定,或者是无效的,则使用应用程序的默认数据库。 如果查询不是一个空字符串,它将被执行。
QSqlQuery :: QSqlQuery(QSqlDatabase db)
使用数据库db构造一个QSqlQuery对象。 如果db无效,应用程序的默认数据库将被使用
QSqlQuery::QSqlQuery(const QSqlQuery &other)
构造一个副本
QSqlQuery::~QSqlQuery()
虚构函数
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)

    推荐阅读