QT数据库(三):QSqlQuery使用

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 为负数表示向首记录方向移动。

示例程序解读

主窗口构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值