Qt5之数据库操作笔记(二)
来源:互联网 发布:已备案域名靠谱吗 编辑:程序博客网 时间:2024/06/16 04:14
接Qt5之数据库操作笔记(一)。
从上一篇笔记中我们知道,Qt5中打开数据库就是要打开该数据库的连接,所以事先要设置连接名。如果不设置连接名,则使用默认连接名。如果在应用程序中只需要有一个数据库连接,那么使用默认连接是很方便的。创建一个连接就是创建了一个QSqlDatabase类的实例,而且,直到该连接被打开以前,它都是没有被使用的。
1. QSqlQuery类的简单使用
包含以下头文件:
#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlError>#include <QDebug>#include <QSqlRecord>#include <QSqlIndex>#include <QSqlField>
主函数中运行如下代码:
//创建数据库连接,设置数据库路径,并且通过该连接名打开数据库 QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1"); QString dbpath = QCoreApplication::applicationDirPath(); db1.setDatabaseName(dbpath + "/" + "db1.db"); if(!db1.open()) { qDebug() << db1.lastError(); } else { qDebug() << "connect to db1.db"; } //使用 QSqlQuery 类的对象来访问数据库 QSqlQuery query(db1);//指定 query 访问的连接是 connection1 //PS:当存在多个连接时,使用 QSqlQuery 就要指定使用的是哪个连接, //这样才能在正确的数据库上进行操作 //创建 student 表, 表中有 id, name, student_id 三个字段 query.exec("create table student (id int primary key," "name varchar(20), student_id varchar(10))");//调用 exec() 执行 Sql 语句 //往 student 表中插入数据 query.exec("insert into student values(1, '小白', '16721810')"); query.exec("insert into student values(2, '大白', '16721811')"); query.exec("insert into student values(3, '小黑', '16721812')"); query.exec("insert into student values(4, '大黑', '16721813')"); //执行一个查询 query.exec("select * from student"); //使用 next() 遍历结果集 while(query.next()) { qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toString();//打印 student 表中所有记录 //QSqlQuery::value() 函数可以返回当前记录的一个字段值 //比如value(0)就是第一个字段的值,各个字段从0开始编号 //该函数返回一个 QVariant,不同的数值库类型会自动映射为Qt中最接近的相应类型, //这里的 toInt() 和 toString() 就是将 QVariant 转换为 int 和 QString 类型 } //使用 last() 定位到最后一条记录 query.last(); //返回并打印当前记录的索引值 qDebug() << "current index:" << query.at(); //获取当前行的记录 QSqlRecord record = query.record(); //获取记录中的"id","name","student_id"两个字段的值 int id = record.value("id").toInt(); QString name = record.value("name").toString(); QString student_id = record.value("student_id").toString(); qDebug() << "id:" << id << "name:" << name << "student_id:" << student_id; //获取记录中的索引为1的字段,即第二个字段 QSqlField field = record.field(1); qDebug() << field.name() << field.value().toString();//打印 //使用 prepare(), bindValue(), exec() 插入多个字段(使用了名称绑定) query.prepare("insert into student(id, name, student_id) values(:id, :name, :stuid)"); int idvalue1 = 5; QString namevalue1 = "小蓝"; QString studentidvalue1 = "16721814"; query.bindValue(":id", idvalue1); query.bindValue(":name", namevalue1); query.bindValue(":stuid", studentidvalue1); query.exec(); //使用 prepare(), addbindValue(), exec() 插入多个字段(使用了位置绑定) query.prepare("insert into student(id, name, student_id) values(?, ?, ?)"); int idvalue2 = 6; QString namevalue2 = "大蓝"; QString studentidvalue2 = "16721815"; query.addBindValue(idvalue2); query.addBindValue(namevalue2); query.addBindValue(studentidvalue2); query.exec(); //使用 prepare(), addbindValue(), execBatch() 批处理插入多条记录(使用了位置绑定) query.prepare("insert into student(id, name, student_id) values(?, ?, ?)"); QVariantList ids; ids << 7 << 8; query.addBindValue(ids); QVariantList names; names << "小红" << "大红"; query.addBindValue(names); QVariantList stuids; stuids << "16721816" << "16721817"; query.addBindValue(stuids); query.execBatch(); //更新如果执行成功,则你会发现数据库中的id=1处的字段更新了 query.exec("update student set name = '小小白', student_id = '16721800' where id = 1"); //删除,如果执行成功,则你会发现数据库中的id=5处记录没有了 query.exec("delete from student where id = 5");
2. 总结
使用QSqlQuery类来访问数据库其实也很轻松。当然Qt还提供了3个更高级的类来访问数据库,分别是QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。有兴趣的话可以去尝试。当遇到不懂的函数时,看Qt的说明文档真的很有用。在Qt Creator中按F1进入该函数的说明文档,按F2进入该函数所在的头文件。
0 0
- Qt5之数据库操作笔记(二)
- Qt5之数据库操作笔记(一)
- QT5.7操作数据库
- Qt5--QSS常用的笔记(二)
- Android下SQLite3数据库操作笔记(二)之-SQLiteOpenHelper
- MySQL学习笔记之二:数据库和表基本操作
- MYSQL之操作数据库表(二)
- Python之操作MySQL数据库(二)
- QT5之MYSQL操作
- 数据库(二)操作数据库
- Cocos2d-x笔记(二)Sqlite数据库基本操作
- PHP学习笔记(二)数据库操作那点事
- ThinkPHP学习笔记(五):数据库操作二
- Laravel基础篇学习笔记(二):数据库操作
- Qt5基础(二)编写Qt多窗口程序笔记
- Qt5 text_Editor(二)
- Qt5之串口操作总结
- QT5(8)数据库
- SDUT 表达式语法分析——预测分析法
- web安全的重要性
- 数字图像处理(冈萨雷斯)阅读笔记
- VS2013/MFC编程入门之十八(对话框:颜色对话框)
- javascript-----2
- Qt5之数据库操作笔记(二)
- java多线程实现断点续传下载
- eclipse实用技巧(整理)
- 浏览器、操作系统DNS缓存时间
- SCPPO(三十):VS启动项目时一个奇葩问题
- OpenGL矩阵推导——模型视图变化
- Surface Studio拆解:发现了不同寻常的东西!
- 论String、StringBuilder和StringBuffer
- 引用第三方Category遇到的坑