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的更多相关文章

  1. python数据库操作 - MySQL入门【转】

    python数据库操作 - MySQL入门 python学院 2017-02-05 16:22 PyMySQL是Python中操作MySQL的模块,和之前使用的MySQLdb模块基本功能一致,PyMy ...

  2. qt 5 数据库操作(mysql)

    其实大家都知道,QT5以上的都自带了数据库驱动,所以呢,基本上可以直接使用,于是如果想知道怎么连接数据库,请参考这位大神写的.http://qtdebug.com/DB-AccessMySQL.htm ...

  3. 2.大约QT数据库操作,简单的数据库连接操作,增删改查数据库,QSqlTableModel和QTableView,事务性操作,大约QItemDelegate 代理

     Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法參考博客:http://blog.csdn.net/tototuzuoquan ...

  4. Qt: 数据库操作;

    QT的数据库操作有两种方式: 一) 使用QsqlTableModel类, 可以配合QTableView进行界面显示并进行数据库操作, 这种方法比较方便快捷: 二)  使用原始SQL语言, 利用INSE ...

  5. qt 数据库操作总结

    #include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...

  6. 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 ...

  7. python数据库操作-mysql数据库

    一:连接 1:本地连接 mysql -u用户名 -p密码 2:连接远程服务器 mysql -u用户名 -p密码 -hip地址 -P端口号     线下修改远程服务端上部署的mysql服务器 二:创建数 ...

  8. 利用IDEA构建springboot应用-数据库操作(Mysql)

    Spring-Date-Jpa 定义了一系列对象持久化的标准 例如Hibernate,TopLink等   spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来 ...

  9. go的数据库操作mysql

    go get github.com/go-sql-driver/mysql package main; import ( "database/sql" _ "github ...

  10. QT数据库操作

    浏览: 在QSqlQuery类中当执行exec()后会把指针放在记录集中第一个记录之上,所以需要调用QSqlQuery::next()来获取第一个数据,下面通过循环体来遍历所有表中的数据. while ...

随机推荐

  1. LeetCode - 最接近的三数之和

    最接近的三数之和 你一个长度为 n 的整数数组 nums 和 一个目标值 target.请你从 nums 中选出三个整数,使它们的和与 target 最接近. 返回这三个数的和. 假定每组输入只存在恰 ...

  2. OceanBase初体验之Docker快速部署试用环境

    前置条件 准备好一台安装了 Docker 的 Linux 服务器,确保能够连接到 Docker Hub 仓库. 执行以下命令拉取最新的 OceanBase 镜像: docker pull oceanb ...

  3. BizWorks助力企业应用的高效开发与复用

    简介: BizWorks作为企业级云原生应用数字工作台,能很好地支撑企业数字中台建设.云原生应用开发.企业资产运营管理等场景.本文不会全面介绍BizWorks平台的能力,而是着重介绍BizWorks在 ...

  4. Flink Sort-Shuffle 实现简介

    简介:Sort-Shuffle 使 Flink 在应对大规模批数据处理任务时更加游刃有余 本文介绍 Sort-Shuffle 如何帮助 Flink 在应对大规模批数据处理任务时更加游刃有余.主要内容包 ...

  5. OpenKruise v0.10.0 版本发布:新增应用弹性拓扑管理、应用防护等能力

    简介: 阿里云开源的云原生应用自动化管理套件.CNCF Sandbox 项目 -- OpenKruise,今天发布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最后一个 m ...

  6. 大模型 RAG 是什么

    大模型 RAG(Retrieval-Augmented Generation)是一种结合了检索(Retrieval)与生成(Generation)能力的先进人工智能技术,主要用于增强大型语言模型(LL ...

  7. [PHP] Laravel cast array 数据库存 json 时的 unicode 编码问题

    在模型上设置 accessor 和 mutator,将数组转为 json,并设置 json 选项. class User extends Model { public function setOpti ...

  8. C语言程序设计-笔记5-数据类型和表达式

    C语言程序设计-笔记5-数据类型和表达式 例6-1  大小写英文字母转换.输入一样字符,将其中的大写字母转换为相应的小写字母后输出,小写字母转换为相应的大写字母后输出,其他字符按原样输出. #incl ...

  9. Solution Set - NOI真题

    NOI2024 RP++! NOI2018 Day1T1 Link&Submission. 考虑一个最高的水位线使所有点通过没有积水的边就可以连通,也就是求出了一棵海拔的最大生成树.会发现只有 ...

  10. Solution Set - DP

    CF101E Candies and Stones Link&Submission. DP 的状态设计和转移都是显然的,唯一的问题在于需要输出方案,而这题卡空间.会发现如果用 bitset 存 ...