qt学习笔记(八)之深入QSqlQuery
在上一节中,我们直接调用QSqlQuery:exec()对数据库进行增删改查等简单操作。
在项目开发中,为了实现系统的低耦合,我们就必须封装出一个数据库功能模块。
一、prepare()
首先创建一个头文件"attend_db.h"。
初始化数据库操作,包括创建数据库文件、建表、以及添加一些基础数据。最好还要返回数据库操作的一些信息(最重要的是错误信息)。
QSqlError db_Init()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(":memory:"); //使用内存数据库if(!db.open()){//打开失败return db.lastError();}QSqlQuery query;//创建组别表,人员表,考勤记录表if(!query.exec("CREATE TABLE table_group(group_id INTEGER PRIMARY KEY, group_name VARCHAR)")){return query.lastError();}if(!query.exec("CREATE TABLE table_user(user_id VARCHAR PRIMARY KEY, group_id INTEGER)")){return query.lastError();}if(!query.exec("CREATE TABLE table_record(user_id VARCHAR, datetime VARCHAR)")){return query.lastError();}//添加组别数据if(!query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)")){return query.lastError();}db_AddGroup(query, 1, "student");db_AddGroup(query, 2, "teacher");//添加人员数据if(!query.prepare("INSERT INTO table_user(user_id, group_id) VALUES(:user_id, :group_id)")){return query.lastError();}db_AddUser(query, "T0001", 2);qdb_AddUser(query, "T0002", 2);db_AddUser(query, "S111201", 1);//添加考勤记录数据if(!query.prepare("INSERT INTO table_record(user_id, datetime) VALUES(:user_id, :datetime)")){return query.lastError();}db_AddRecord(query, "T0001", QDateTime::currentDateTime());db_AddRecord(query, "T0002", QDateTime::currentDateTime());db_AddRecord(query, "S111201", QDateTime::currentDateTime());return QSqlError();
}
这里对表的添加数据不再简单的使用QSqlQuery:exec()直接执行语句了。为了模块化,我们还要封装出对表数据的操作函数(包括增删改查)。
提供对外的接口供上层应用使用。形参最好就仅仅是表的参量,这样清晰明了。
Qt提供了bool prepare(const QString& query)接口。(SQLite也提供了该API函数)
query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)")
我们先使用了prepare()函数,在其中利用了“:group_id”和“:group_name”来代替具体的数据,之后就可以利用bindValue()函数给group_id和group_name两个属性赋值,这称为绑定操作。
例:
query.bindValue(0, 1);query.bindValue(1, 'student');
其中编号0和1分别代表“:group_id”和“:group_name”,就是说按照prepare()函数中出现的属性从左到右编号,最左边是0 。这里的“:group_id”和“:group_name”,叫做占位符,这是ODBC数据库的表示方法,还有一种Oracle的表示方法就是全部用“?”号。
query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(?, ?)")
这是对单条记录的绑定,当然绑定完还是要调用exec()的,否则语句不会被执行。
当用ODBC的表示方法时,我们也可以将编号用实际的占位符代替。这里就不具体介绍了。
我们也可以进行批量处理
void addBindValue(const QVariant& val, QSql::ParamType type = QSql::In);
通过调用addBindValue()增加值val值列表。
QVariantList GroupIDs;GroupIDs << 1 << 2;QVariantList GroupNames;GroupNames << "student" << "teacher";query.addBindValue(GroupIDs);query.addBindValue(GroupNames);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()函数。
基友们。~~神棍节快乐。
在这里附上程序源代码下载链接:qt_深入QSqlQuery
以上纯属个人学习笔记,如果哪里错了,希望提出。愿和大家一起共同学习,一起进步。我的邮箱地址是:xzy@yingzhi8.com
qt学习笔记(八)之深入QSqlQuery相关推荐
- QT学习笔记(八):顺序容器和关联容器
QT学习笔记(八):顺序容器和关联容器 一.前言 二.容器介绍 2.1 顺序容器 2.2 关联容器 二.顺序容器示例 三.关联容器 一.前言 在Qt库中为我们提供了一系列的基于模板的容器类(conta ...
- Qt学习笔记之MySQL数据库
一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...
- Qt学习笔记之数据库
一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...
- QT学习笔记(五):Qt5的8种标准对话框示例
QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...
- Qt学习笔记,Qt国际化
Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\ ...
- Qt学习笔记,Qt程序架构设计要旨
Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...
- Qt学习笔记之文件处理
Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...
- Qt学习笔记之国际化
国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程. 1. 相关的Qt类和AP ...
- Qt学习笔记之 字符串类型小结
1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...
最新文章
- Linux系统调用的实现机制分析
- python经典小游戏-又一个python小游戏,叫什么不知道了。。。
- openssl修改版本号
- 【Linux 内核】进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 )
- 如何写出一份惊艳BAT的简历?
- Linux 虚拟机 安装 vmware-tools
- ***站长自述挂马经历 提醒挂马者回头是岸
- 福州3 2五年制计算机专业的学校,福州有哪些五年制大专
- python 格式化输出
- iOS:URL Scheme(完结)(18-1-3更)
- [编写高质量代码:改善java程序的151个建议]建议66 asList方法产生的List对象不可更改...
- C语言数据结构之顺序队列
- 使用java做地图_在地图中使用Java
- Golang 解析XML
- 算术平均数、几何平均数、调和平均数的、标准差、方差、正态分布、异常值噪声处理
- mysql数据库查询优化技术 视频教程_炼数成金MySql视频教程 MySQL数据库查询优化技术 15周课程深入学习MySQL数据库查询...
- 关于Windows-Linux双系统的启动引导
- 给自己一个拼搏的理由
- Linux 网卡配置
- 查看主机oracle 版本,CentOS下查看Oracle数据库版本