qt学习笔记(八)之深入QSqlQuery

转载 2015年07月09日 16:21:23

在上一节中,我们直接调用QSqlQuery:exec()对数据库进行增删改查等简单操作。

在项目开发中,为了实现系统的低耦合,我们就必须封装出一个数据库功能模块。

一、prepare()

首先创建一个头文件"attend_db.h"。

初始化数据库操作,包括创建数据库文件、建表、以及添加一些基础数据。最好还要返回数据库操作的一些信息(最重要的是错误信息)。

  1. QSqlError db_Init()  
  2. {  
  3.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
  4.     db.setDatabaseName(":memory:"); //使用内存数据库  
  5.   
  6.     if(!db.open())  
  7.     {  
  8.         //打开失败  
  9.         return db.lastError();  
  10.     }  
  11.   
  12.     QSqlQuery query;  
  13.     //创建组别表,人员表,考勤记录表  
  14.     if(!query.exec("CREATE TABLE table_group(group_id INTEGER PRIMARY KEY, group_name VARCHAR)"))  
  15.     {  
  16.         return query.lastError();  
  17.     }  
  18.     if(!query.exec("CREATE TABLE table_user(user_id VARCHAR PRIMARY KEY, group_id INTEGER)"))  
  19.     {  
  20.         return query.lastError();  
  21.     }  
  22.     if(!query.exec("CREATE TABLE table_record(user_id VARCHAR, datetime VARCHAR)"))  
  23.     {  
  24.         return query.lastError();  
  25.     }  
  26.     //添加组别数据  
  27.     if(!query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)"))  
  28.     {  
  29.         return query.lastError();  
  30.     }  
  31.   
  32.     db_AddGroup(query, 1, "student");  
  33.     db_AddGroup(query, 2, "teacher");  
  34.   
  35.     //添加人员数据  
  36.     if(!query.prepare("INSERT INTO table_user(user_id, group_id) VALUES(:user_id, :group_id)"))  
  37.     {  
  38.         return query.lastError();  
  39.     }  
  40.   
  41.     db_AddUser(query, "T0001", 2);  
  42.     qdb_AddUser(query, "T0002", 2);  
  43.     db_AddUser(query, "S111201", 1);  
  44.   
  45.     //添加考勤记录数据  
  46.     if(!query.prepare("INSERT INTO table_record(user_id, datetime) VALUES(:user_id, :datetime)"))  
  47.     {  
  48.         return query.lastError();  
  49.     }  
  50.   
  51.     db_AddRecord(query, "T0001", QDateTime::currentDateTime());  
  52.     db_AddRecord(query, "T0002", QDateTime::currentDateTime());  
  53.     db_AddRecord(query, "S111201", QDateTime::currentDateTime());  
  54.   
  55.     return QSqlError();  
  56. }  
这里对表的添加数据不再简单的使用QSqlQuery:exec()直接执行语句了。为了模块化,我们还要封装出对表数据的操作函数(包括增删改查)。

提供对外的接口供上层应用使用。形参最好就仅仅是表的参量,这样清晰明了。

Qt提供了bool prepare(const QString& query)接口。(SQLite也提供了该API函数)

  1. query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)")  
我们先使用了prepare()函数,在其中利用了“:group_id”和“:group_name”来代替具体的数据,之后就可以利用bindValue()函数给group_idgroup_name两个属性赋值,这称为绑定操作。

例:

  1. query.bindValue(0, 1);  
  2. query.bindValue(1, 'student');  

其中编号0和1分别代表“:group_id”和“:group_name”,就是说按照prepare()函数中出现的属性从左到右编号,最左边是0 。这里的“:group_id”和“:group_name”,叫做占位符,这是ODBC数据库的表示方法,还有一种Oracle的表示方法就是全部用“?”号。

  1. query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(?, ?)")  

这是对单条记录的绑定,当然绑定完还是要调用exec()的,否则语句不会被执行。

当用ODBC的表示方法时,我们也可以将编号用实际的占位符代替。这里就不具体介绍了。

我们也可以进行批量处理

  1. void addBindValue(const QVariant& val, QSql::ParamType type = QSql::In);  
通过调用addBindValue()增加值val值列表。
  1. QVariantList GroupIDs;  
  2. GroupIDs << 1 << 2;  
  3. QVariantList GroupNames;  
  4. GroupNames << "student" << "teacher";  
  5.   
  6. query.addBindValue(GroupIDs);  
  7. query.addBindValue(GroupNames);  
  8. query.execBatch();  
查看下ececBatch()的文档。

/*

Executes a previously prepared SQL query in a batch. All the bound parameters have to be lists of variants. If the database doesn't support batch executions, the driver will simulate it using conventional exec() calls.

*/

如果数据库不支持批量处理,则用exec()来代替。

二、执行SQL语句后返回的结果集

/*下文不是原创、存属转载*/

结果集其实就是查询到的所有记录的集合,而在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的有:

seek(int n) :query指向结果集的第n条记录。

first() :query指向结果集的第一条记录。

last() :query指向结果集的最后一条记录。

next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。

previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。

record() :获得现在指向的记录。

value(int n) :获得属性的值。其中n表示你查询的第n个属性,比方我们使用“select * from student”就相当于“select id, name from student”,那么value(0)返回id属性的值,value(1)返回name属性的值。该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。

at() :获得现在query指向的记录在结果集中的编号。

需要说明,当刚执行完query.exec(“select * from student”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from student”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。

深入理解C指针学习笔记(四)

1.3指针操作符指针常用的操作符如下表: 1.31指针的算数运算数据指针可以执行以下几种算术运算: 给指针加上整数 从指针减去整数 两个指针相减 比较两个指针 1.给指针加上整数给指针加上一个整数实...
  • u014630623
  • u014630623
  • 2016年03月24日 21:20
  • 407

qt之QSqlQuery

QSqlQuery提供了一个执行和查询的状态,该类封装了函数提取和检索数据的功能,它可以被用做数据操作 语句,列出select insert update selete ,也介意作为数据定义语句...
  • u014660247
  • u014660247
  • 2016年09月11日 16:33
  • 2524

QT——QSqlQuery

The QSqlQuery class provides a means of executing and manipulating SQL statements. QSqlQuery 提供了一种可...
  • u012627502
  • u012627502
  • 2014年05月26日 19:24
  • 1074

Qt数据库(三)利用QSqlQuery类执行SQL语句(一)

本文章原创于www.yafeilinux.com 转载请注明出处。SQL即结构化查询语言,是关系数据库的标准语言。前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句。需要说明,我们这里...
  • bingcaihuang
  • bingcaihuang
  • 2010年05月25日 19:35
  • 8108

QT数据库操作QSqlQuery

数据库对大多数应用来说,大概是必备吧。如何对数据库进行增删改查等操作也许就是关键了。在QT中如何对数据库进行这些操作呢?QSqlQuery类可以完成!如何使用它呢?看下面吧!(对数据库操作前需要先连接...
  • u011512437
  • u011512437
  • 2015年02月24日 22:28
  • 2243

Qt qsqlquerymodel 中文显示乱码问题解决

在QT数据库编程过程中,碰到了中文乱码的问题,最终解决了 在Qt5将中文改成utf-8后默认是可以正常显示的,所以中文乱码就要看你的数据库中保存的数据是什么编码,如果是utf-8,那就要检查你自己的...
  • i7891090
  • i7891090
  • 2017年06月07日 14:38
  • 466

Qt解析QSqlDatabase、QSqlQuery类操作数据库

Qt解析QSqlDatabase、QSqlQuery类操作数据库 Driver Type Description: QDB2        IBM DB2 QIBASE     Borl...
  • jeson1224
  • jeson1224
  • 2013年12月13日 17:35
  • 3280

qt之QSqlQuery类执行SQL语句

转载自:https://wizardforcel.gitbooks.io/qt-beginning/content/28.html 导语 SQL即结构化查询语言,是关系数据库的标准语言。前面两...
  • baidu_33570760
  • baidu_33570760
  • 2017年05月12日 15:41
  • 1537

Qt数据库:(三)利用QSqlQuery类执行SQL语句(一)

SQL即结构化查询语言,是关系数据库的标准语言。前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句。需要说明,我们这里只是Qt教程,而非专业的数据库教程,所以我们不会对数据库中的一些知...
  • liuligui5200
  • liuligui5200
  • 2015年07月20日 11:40
  • 9683

QSqlQuery直接使用sql语句与采用bindValue的比较

在使用QSqlQuery执行SQL语句时,发现有两种方式: 1.直接执行SQL语句 QString bookName;                               ...
  • zchl159
  • zchl159
  • 2016年09月13日 10:53
  • 2018
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt学习笔记(八)之深入QSqlQuery
举报原因:
原因补充:

(最多只允许输入30个字)