Qt Version 5.14.0
QSqlQuery类提供执行SQL语句的接口,并且能够访问执行结果数据集。
执行一次查询
想要执行SQL语句,只需要创建一个QSqlQuery对象,然后调用它的exec函数,如下代码。(这里构造QSqlQuery对象时没有指定数据库链接名称)
QSqlQuery query;
bool flag = query.exec("SELECT name, salary FROM employee WHERE salary > 50000");
if(false == flag)
{
qDebug() << query.lastError();
}
访问结果数据集
QSqlQuery提供的接口每次只能访问结果集中的一条记录,在执行完exec()函数后,QSqlQuery对象的内部指针位于结果集第一条数据之前,调用next()函数访问第一条结果集,然后再不断调用next()函数访问剩余所有数据,示例代码如下:
while (query.next()) {
QString name = query.value(0).toString();
int salary = query.value(1).toInt();
qDebug() << name << salary;
}
QSqlQuery::value()函数用于从一条记录中读取某个特定字段的数据。字段由索引指定(从0开始),value()函数的返回值是QVariant类型的,这个类型可以保存所有C++和Qt Core中定义的类型。不同数据库的数据类型会自动映射到Qt支持的对应类型,之后可以调用toInt()、toString()等函数将其转换为具体的数据。Qt具体支持的各个数据库的数据类型,详见Qt助手关键词: Data Types for Qt-supported Database Systems。
访问结果数据集可以使用的QSqlQuery接口有:
- next()
- previous()
- first()
- last()
- seek()
当前位置的索引可以通过at()获取,结果集总行数使用size()函数获取(如果该数据库支持此接口)。
一个数据库驱动是否支持某个特性该如何判断,可以使用hasFeature()函数。
在你浏览结果集数据时,如果只使用next()和seek()函数,则可以在调用exec()之前,调用setForwardOnly(true)来提高效率。
插入、更新和删除
QSqlQuery::exec()可以执行任意SQL语句,如果你想一次插入很多条数据,可以使用占位符来提高效率(这样可以自动将各个数据类型转换为QString类型,简化SQL语句字符串的构建过程)。
Qt支持两种类型的占位符:名字绑定 和 位置绑定。
名字绑定示例代码如下:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (:id, :name, :salary)");
query.bindValue(":id", 1001);
query.bindValue(":name", "Thad Beaumont");
query.bindValue(":salary", 65000);
query.exec();
位置绑定示例代码如下:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();
Qt提供的所有数据库驱动都支持这两种绑定方式。如果数据库原生支持这种句法,Qt会直接将这个query传给DBMS,否则会对其进行预处理。实际执行的query可以调用executedQuery()来获得。
更新和删除类似。
事务
事务可以保证一个复杂的操作是原子的,即要么都执行,要么都不执行。 如果数据库支持事务,QSqlDriver::hasFeature(QSqlDriver::Transactions)会返回true。
使用事务的步骤如下:
- 初始化事务( QSqlDatabase::transaction())
- 执行query
- 执行成功则提交事务(commit()),执行失败则回滚(rollback())
============================================================================================================
qt之QSqlQuery
QSqlQuery提供了一个执行和查询的状态,该类封装了函数提取和检索数据的功能,它可以被用做数据操作
语句,列出select insert update selete ,也介意作为数据定义语句,列如create table
成功执行sql语句 isActive会返回true,否则返回false,
通过导出记录执行以下语句
· next()
· previous()
· first()
· last()
· seek()
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制
这些函数允许程序设计者去向前向后移动在记录中
For example:
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
参数化查询
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();
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Bart");
query.addBindValue("Simpson");
query.exec();
QSqlQuery::QSqlQuery(QSqlResult *result)
根据结果集构造一个QSqlQuery对象
QSqlQuery::QSqlQuery(QSqlDatabase db)
根据数据库得到一个QSqlQuery对象
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
参数化查询的时候,调用该函数,
返回当前内部查询的位置,该位置是以0开始。
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
构建参数。
清除结果集,并释放资源
bool QSqlQuery::exec(const QString &query)
执行查询
执行一个已经准备好的查询。
QString QSqlQuery::executedQuery() const
返回最后一次查询的字符串。
int QSqlQuery::numRowsAffected() const
返回影响的函数
bool QSqlQuery::prepare(const QString &query)
构建准备查询语句
在结构集中返回上一个结果集。
const QSqlResult *QSqlQuery::result() const
返回结果集
void QSqlQuery::setForwardOnly(bool forward)
设置向前查询
返回结果集的大小
QVariant QSqlQuery::value(int index) const
返回值
QVariant QSqlQuery::value(const QString &name) const
根据字段名返回值。
============================================================================================================