;
如果你在遍历查询结果集的时候只使用正值参数的next()和seek(),你可以在调用exec()之前调用QSqlQuery::setForwartOnly(true)。当你在操作大量结果集的时候,这是一个简单的优化单可以明显加速你的查询。
3 插入、更新和删除记录
QSqlQuery可以执行任意的SQL语句。下面的示例展示了使用INSERT语句向表中插入一条记录:
QSqlQuery query;
query.exec("INSERT INTO employee (id, name, salary) "
"VALUES (1001, 'Thad Beaumont', 65000)");
如果你想要同时插入许多条记录,一个有效的方法就是将查询语句和真实的值分离,这个可以使用占位符来实现。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提供的所有数据库驱动都支持。当需要插入多条记录时,只需要调用 一次QSqlQuery::prepare(),然后使用多次bindValue()或者addBindValue()来绑定需要的数据,最后再调用一次exec()函数就可以了。
抛开性能,使用占位符的一个好处就是你可以指定任意的值而不用担心缺少特殊字符。
更新一条记录与插入操作非常相似:
QSqlQuery query;
query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");
你也可以使用名称或位置绑定来关联实际的参数值。
最后,下面给出一条删除语句:
QSqlQuery query;
query.exec("DELETE FROM employee WHERE id = 1007");
如果底层的数据库引擎支持事务,那么QSqlDriver::hasFeature(QSqlDriver::Transactions)会返回true。可以使用QSqlDatabase::transaction()启动一个事务,然后编写一些希望在事务中执行的SQL语句,最后调用QSqlDatabase::commit()或者QSqlDatabase::rollback()。当使用事务时必须在创建查询以前就开始事务,例如:
QSqlDatabase::database().transaction();
QSqlQuery query;
query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'");
if (query.next()) {
int employeeId = query.value(0).toInt();
query.exec("INSERT INTO project (id, name, ownerid) "
"VALUES (201, 'Manhattan Project', "
+ QString::number(employeeId) + ')');
QSqlDatabase::database().commit();
事务可以保证一个复杂操作的原子性,就是对于一个数据库操作序列,这些操作要么全部做完,要么一条也不做,它是一个不可分割的工作单位。