Qt-数据库操作MySql
1 简介
参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=87
说明:本文简单说明在Qt中操作数据库,用MySql数据库进行试验。
Qt 提供了QtSql模块来提供平台独立的基于 SQL 的数据库操作。
2 MySql的安装及简单使用
视频对应的资源文件已经说得很清楚了,这里就不单独进行说明了。给出下载的链接:
链接:https://pan.baidu.com/s/1ZThzPvYs41dlGeAid--agg
提取码:zony
sql语句也不在这里进行说明,去查询相关的资料即可。
3 测试及说明
先创建一个工程:
使用QSqlDatabase::drivers();函数查看Qt支持的数据库驱动,可以看到支持:("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")这些数据库。
1、简单的使用
接下来,我要以root用户操作test数据库,对test数据库的表进行操作:
大致步骤如下:
(1)添加sql模块
在.pro文件中添加语句:QT += core gui sql
(2)添加MySql数据库
1 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
(3)连接数据库
1 db.setHostName("127.0.0.1"); //数据库服务器IP
2 db.setUserName("root"); //数据库用户名
3 db.setPassword("123456"); //密码
4 db.setDatabaseName("test"); //使用哪个数据库
(4)打开数据库
1 if (db.open() == false) {
2 QMessageBox::warning(this, "错误", db.lastError().text());
3 return;
4 }
(5)执行sql语句
1 //操作sql语句
2 QSqlQuery query;
3 query.exec("create table student(id int primary key, name varchar(255), age int, score int);");
执行的时候可能会报以下错误:
这时,我们将MySql的安装路径下的文件拷贝到Qt的安装目录下,关闭Qt,再次打开执行就不会报错了:
上述步骤的完整代码:


1 Widget::Widget(QWidget *parent) :
2 QWidget(parent),
3 ui(new Ui::Widget)
4 {
5 ui->setupUi(this);
6
7 //打印qt支持的数据库驱动
8 qDebug() << QSqlDatabase::drivers();
9
10 //添加MySql数据库
11 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
12 //连接数据库
13 db.setHostName("127.0.0.1"); //数据库服务器IP
14 db.setUserName("root"); //数据库用户名
15 db.setPassword("123456"); //密码
16 db.setDatabaseName("test"); //使用哪个数据库
17 //打开数据库
18 if (db.open() == false) {
19 QMessageBox::warning(this, "错误", db.lastError().text());
20 return;
21 }
22 //操作sql语句
23 QSqlQuery query;
24 query.exec("create table student(id int primary key, name varchar(255), age int, score int);");
25 }
运行测试:
2、使用方式2
在添加MySql时,我们给数据库连接一个名字,addDatabase函数的第二个参数,这样可以为一个数据库建立多个连接。
1 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "mydb");
通过这种方式,我们使用QSqlQuery执行MySql语句时,必须指定数据库名字:
1 1 //操作sql语句
2 2 QSqlQuery query(db);
3 3 query.exec("insert into student(id, name, age, score) values(1, 'mike', 18, 59);");
3、批量插入
(1)方式一:
1 //odbc风格
2 //预处理语句
3 query.prepare("insert into student(name, age, score) values(?, ?, ?);");
4 // 给字段设置内容
5 QVariantList nameList;
6 nameList << "xiaoming" << "xiaokong" << "xiaojiang";
7 QVariantList ageList;
8 ageList << 22 << 21 << 24;
9 QVariantList scoreList;
10 scoreList << 89 << 99 << 78;
11 //给字段绑定相应的值,必须按顺序绑定
12 query.addBindValue(nameList);
13 query.addBindValue(ageList);
14 query.addBindValue(scoreList);
15 //执行预处理命令
16 query.execBatch();
QSqlQuery::prepare()函数对这条 SQL 语句进行预处理,问号 ? 相当于占位符,预示着以后我们可以使用实际数据替换这些位置。
QSqlQuery::addBindValue()我们将实际数据绑定到这个预处理的 SQL 语句上。
QSqlQuery::execBatch()批量执行 SQL,之后结束该对象。
(2)方式二:
1 //oracle风格:占位符 + 自定义名字
2 query.prepare("insert into student(name, age, score) values(:name, :age, :score)");
3 //给字段设置内容
4 QVariantList nameList;
5 nameList << "xiaoa" << "xiaob" << "xiaoc";
6 QVariantList ageList;
7 ageList << 21 << 19 << 24;
8 QVariantList scoreList;
9 scoreList << 77 << 66 << 70;
10 //给字段绑定对应的值,不需要指定顺序
11 query.bindValue(":name", nameList);
12 query.bindValue(":score", scoreList);
13 query.bindValue(":age", ageList);
14 //执行预处理命令
15 query.execBatch();
推荐使用方式二。
4 查找
现有一个数据库如下:
查找所有的条目:
1 QSqlQuery query;
2 query.exec("select * from student");
3 while (true == query.next()) { //一行一行遍历
4 //取出当前行的内容,以列为单位
5 qDebug() << query.value(0).toInt() //取第一列
6 << query.value(1).toString() //取第二列
7 << query.value("age").toInt() //按名字查找
8 << query.value("score").toInt();
9 }
查找某一条:
1 query.exec("select * from student where name = 'xiaoa'");
2 while (true == query.next()) { //一行一行遍历
3 //取出当前行的内容,以列为单位
4 qDebug() << query.value(0).toInt() //取第一列
5 << query.value(1).toString() //取第二列
6 << query.value("age").toInt()
7 << query.value("score").toInt();
8 }
5 删除
使用事务进行操作,首先创建一个ui,如下:
行编辑区输入我们要删除的name,删除按钮删除该条目,确定删除按钮确认删除该条目,取消按钮取消删除操作。
完整代码如下:


1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QDebug>
4 #include <QSqlDatabase>
5 #include <QMessageBox>
6 #include <QSqlError>
7 #include <QSqlQuery>
8
9 Widget::Widget(QWidget *parent) :
10 QWidget(parent),
11 ui(new Ui::Widget)
12 {
13 ui->setupUi(this);
14
15 //打印qt支持的数据库驱动
16 qDebug() << QSqlDatabase::drivers();
17
18 //添加MySql数据库
19 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
20 //连接数据库
21 db.setHostName("127.0.0.1"); //数据库服务器IP
22 db.setUserName("root"); //数据库用户名
23 db.setPassword("123456"); //密码
24 db.setDatabaseName("test"); //使用哪个数据库
25 //打开数据库
26 if (db.open() == false) {
27 QMessageBox::warning(this, "错误", db.lastError().text());
28 return;
29 }
30
31 }
32
33 Widget::~Widget()
34 {
35 delete ui;
36 }
37
38 void Widget::on_pushButton_delete_clicked()
39 {
40 //获取行编辑内容
41 QString name = ui->lineEdit->text();
42 QString sql = QString("delete from student where name='%1'").arg(name);
43 qDebug() << sql;
44 //开启一个事务
45 QSqlDatabase::database().transaction();
46 // 执行sql语句
47 QSqlQuery query;
48 query.exec(sql);
49 }
50
51 void Widget::on_pushButton_sure_clicked()
52 {
53 //确定删除
54 QSqlDatabase::database().commit();
55 }
56
57 void Widget::on_pushButton_cancel_clicked()
58 {
59 //回滚、撤销
60 QSqlDatabase::database().rollback();
61 }
运行测试,操作之前数据库中已经有了一些数据:
Qt-数据库操作MySql的更多相关文章
- python数据库操作 - MySQL入门【转】
python数据库操作 - MySQL入门 python学院 2017-02-05 16:22 PyMySQL是Python中操作MySQL的模块,和之前使用的MySQLdb模块基本功能一致,PyMy ...
- qt 5 数据库操作(mysql)
其实大家都知道,QT5以上的都自带了数据库驱动,所以呢,基本上可以直接使用,于是如果想知道怎么连接数据库,请参考这位大神写的.http://qtdebug.com/DB-AccessMySQL.htm ...
- 2.大约QT数据库操作,简单的数据库连接操作,增删改查数据库,QSqlTableModel和QTableView,事务性操作,大约QItemDelegate 代理
Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法參考博客:http://blog.csdn.net/tototuzuoquan ...
- Qt: 数据库操作;
QT的数据库操作有两种方式: 一) 使用QsqlTableModel类, 可以配合QTableView进行界面显示并进行数据库操作, 这种方法比较方便快捷: 二) 使用原始SQL语言, 利用INSE ...
- qt 数据库操作总结
#include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...
- Qt数据库操作(qt-win-commercial-src-4.3.1,VC6,Oracle,SQL Server)
qt-win-commercial-src-4.3.1.qt-x11-commercial-src-4.3.1Microsoft Visual C++ 6.0.KDevelop 3.5.0Window ...
- python数据库操作-mysql数据库
一:连接 1:本地连接 mysql -u用户名 -p密码 2:连接远程服务器 mysql -u用户名 -p密码 -hip地址 -P端口号 线下修改远程服务端上部署的mysql服务器 二:创建数 ...
- 利用IDEA构建springboot应用-数据库操作(Mysql)
Spring-Date-Jpa 定义了一系列对象持久化的标准 例如Hibernate,TopLink等 spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来 ...
- go的数据库操作mysql
go get github.com/go-sql-driver/mysql package main; import ( "database/sql" _ "github ...
- QT数据库操作
浏览: 在QSqlQuery类中当执行exec()后会把指针放在记录集中第一个记录之上,所以需要调用QSqlQuery::next()来获取第一个数据,下面通过循环体来遍历所有表中的数据. while ...
随机推荐
- 一周涨 15k Star 的开源项目「GitHub 热点速览」
你训练大语言模型(LLM)用的什么框架?有没有想过不用框架训练 GPT-2? GitHub 上就有这么一位大神(Andrej Karpathy),他仅用大约 1k 行的 C 代码就完成了 GPT-2 ...
- dom4j 通用解析器,解析成List<Map<String,Object>>
import java.io.InputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.u ...
- 开源在线表单工具 HeyForm 使用教程
HeyForm 是一个非常出色的开源在线表单工具,可以通过直观的拖拽式编辑器,快速构建出美观实用的表单. HeyForm 的功能非常丰富: 支持丰富的输入类型,从基础的文本.数字到高级的图片选择.日期 ...
- 一站式指南:ClkLog部署环境配置指南
在今天的数字化世界中,数据管理和分析工具的选择对于企业的成功至关重要.ClkLog作为一款强大的日志分析工具,能够帮助企业从海量数据中洞察业务.提升效率.然而,如何才能顺利部署ClkLog系统,使其最 ...
- 【数学】主成分分析(PCA)的详细深度推导过程
Based on Deep Learning (2017, MIT) book. 本文基于Deep Learning (2017, MIT),推导过程补全了所涉及的知识及书中推导过程中跳跃和省略的部分 ...
- OpenKruise v1.3:新增自定义 Pod Probe 探针能力与大规模集群性能显著提升
简介: 在版本 v1.3 中,OpenKruise 提供了新的 CRD 资源 PodProbeMarker,改善了大规模集群的一些性能问题,Advanced DaemonSet 支持镜像预热,以及 C ...
- e签宝:借助钉钉宜搭变革传统项目管理模式,交付效率显著提升
简介:通过钉钉宜搭,e签宝在半个月内搭建了项目交付管理平台,提升了项目管理的效率和质量,推进了团队核心业务的信息化建设.e签宝在有效梳理了各环节的工作进度.质量.成本.职权后,通过宜搭平台保障了内外 ...
- WPF 多线程下跨线程处理 ObservableCollection 数据
本文告诉大家几个不同的方法在 WPF 里,使用多线程修改或创建 ObservableCollection 列表的数据 需要明确的是 WPF 框架下,非 UI 线程直接或间接访问 UI 是不合法的,设计 ...
- WPF 引用 UWP 控件 不打包为 MSIX 分发的方法
按照微软的官方文档,大部分的文档都会说如果用了 XAML Islands 等技术的时候,需要新建一个打包项目,将 WPF 应用打包为 msix 等才可以进行分发和使用.但是实际上不打包也可以,此时可以 ...
- C#的基于.net framework的Dll模块编程(四) - 编程手把手系列文章
这次继续这个系列的介绍: 一.命名空间的起名: 对于C#来说,一般命名空间的建议是:公司名(或个人名称).产品名.分类名,比如我这边是用的这个:Lzhdim.LPF.Helper,意思是个人名Lzhd ...