QSqlQuery 简介
QSqlQuery 是能运行任何 SQL 语句的类,如 SELECT、INSERT、UPDATE、DELETE 等 SQL
语句。所以使用 QSqlQuery 几乎能进行任何操作,例如创建数据表、修改数据表的字段定义、进行数据统计等。如果运行的是 SELECT 语句,它查询出的数据可以作为一个数据集,但是并不能作为模型/视图结构中的数据模型。
QSqlTableModel 和 QSqlQueryModel 一般用于基于记录的操作,如数据浏览和修改,而 QSqlQuery 能通过运行 SQL 语句实现对数据进行批量修改。
QSqlQuery 类中常用的函数如下表所示:
创建QSqlQuery对象(构造函数)
QSqlQuery(const QSqlDatabase &db)
QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())
创建 QSqlQuery 对象时可以传递 SQL 语句和数据库连接,如果不传递任何参数,就表示不设
置 SQL 语句,并使用默认的数据库连接。
SQL 语句的设置和运行
1、直接使用exec(QString)接口函数
QSqlQuery query;
query.exec("SELECT * FROM employee"); //查询数据
query.exec("UPDATE employee SET Salary=6000 where Gender='女'"); //更新数据
2、使用带参数的SQL语句(适合动态生成)
可以使用函数 prepare()设置带有参数的 SQL 语句,然后用函
数 bindValue()设置 SQL 语句中的各参数值,再用函数 exec()运行 SQL 语句。
QSqlQuery query;
query.prepare("SELECT empNo, Name, Gender, Salary FROM employee " " WHERE Gender =:sex AND Salary >=:salary");
query.bindValue(":sex", "男");
query.bindValue(":salary", 5000);
query.exec();
bindValue()函数的原型定义如下:
void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
其中,placeholder 是 SQL 语句中用于占位的参数名;val 是参数的值;paramType 是参数类型,默认值为 QSql::In,表示传递给数据库的值。若 paramType 设置为 QSql::Out,表示该参数是一个返回值,在运行函数 exec()后,这个参数会被数据库返回的值覆盖。
还有另一种参数形式的 bindValue()函数,其原型定义如下:
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
其中,参数 pos 是占位符位置序号,第一个参数位置序号为 0;val 是参数值;paramType 是参数
类型,默认值为 QSql::In。
在使用?或":参数名"作为占位符时可以用按序号设置参数的形式:
QSqlQuery query;
query.prepare("UPDATE employee SET Department=?, Salary=? WHERE EmpNo =?");
query.bindValue(0, "技术部");
query.bindValue(1, 5000);
query.bindValue(2, 2006);
query.exec();
QSqlQuery query;
query.prepare("SELECT empNo, Name, Gender, Salary FROM employee " " WHERE Gender =:sex AND Salary >=:salary");
query.bindValue(0 "男");
query.bindValue(1, 5000);
query.exec();
使用?占位时,还可以使用addBindValue()按顺序添加参数值:
QSqlQuery query;
query.prepare("UPDATE employee SET Department=?, Salary=? WHERE EmpNo =?");
query.addBindValue("技术部");
query.addBindValue(6000);
query.addBindValue(1007);
query.exec();
其中addBindValue()函数原型定义如下(无需给出占位符的序号):
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
记录移动
如果 QSqlQuery 运行的是 SELECT 语句,会返回一个数据集,并且有一个当前行。first()、
previous()、next()、last()等函数可用于进行当前行的移动。函数 record()返回当前行的记录,其函数原型定义如下:QSqlRecord QSqlQuery::record()
注意区分QSqlQueryModel也有该函数接口,record()可以带参数,不带参数返回的是字段名。
而在QSqlQuery中,record()没有任何参数,如果当前行是有效的,返回的 QSqlRecord 对象包含当前记录的数据,否则返回的是一条空记录。
使用函数 seek()可以定位到指定序号的记录,这个函数原型定义如下:
bool QSqlQuery::seek(int index, bool relative = false)
其中,参数 relative 表示绝对位置(false)或相对位置(true)。若 relative 为 false,参数 index 表示需要移动到的绝对位置,数据集的首记录位置为 0。若 relative 为 true,参数 index 表示相对于当前位置移动的行数,index 为正数表示向尾记录方向移动,index 为负数表示向首记录方向移动。