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. mmdetection训练自己的模型【数据集转变,数据集划分,数据集gt可视化,mmdetection配置文件生成及修改,开始训练,gradio部署】

    针对有一点mmdetction基础的,然后想根据自己的数据集,熟练训练自己的模型.需要改成自己配置的地方,我会在代码中做好标记,方便修改. 我们先了解一下mmdetection的基本流程,你想训练一个 ...

  2. leetcode:3. 无重复字符的最长子串

    3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3  解释: 因为无重复字符的最长子 ...

  3. Object类的派生-c++

    /* * @Issue: 生成一个Object抽象类 * @Author: 一届书生 * @LastEditTime: 2020-02-24 10:34:13 */ #include<iostr ...

  4. SVM简单分类的使用 sklearn机器学习

    # sklearn 库中导入 svm 模块 from sklearn import svm # 定义三个点和标签 X = [[2, 0], [1, 1], [2,3]] y = [0, 0, 1] # ...

  5. 力扣647(java)-回文子串(中等)

    题目: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一个序列. 具有不同开始位置或结束位置 ...

  6. 加入自定义块对fashion_mnist数据集进行softmax分类

    在之前,我们实现了使用torch自带的层对fashion_mnist数据集进行分类.这次,我们加入一个自己实现的block,实现一个四层的多层感知机进行softmax分类,作为对"自定义块& ...

  7. iLogtail开源之路

    简介: 2022年6月底,阿里云iLogtail代码完整开源,正式发布了完整功能的iLogtail社区版.iLogtail作为阿里云SLS官方标配的采集器,多年以来一直稳定服务阿里集团.蚂蚁集团以及众 ...

  8. [FE] WebStorm, ESLint: Trailing spaces not allowed

    在 WebStorm 中搜索文件 .eslintrc.js 在里面的 rules 项中追加规则: 'no-trailing-spaces' : ['off', { 'skipBlankLines': ...

  9. dotnet 推荐一个使用 Json 直接路由通讯的 IPC 库

    本文将和大家推荐一个我所在团队开源的本机多进程通讯 IPC 库,此 IPC 支持使用 JSON 格式进行直接路由通讯,具有使用方便,稳定性高,性能好的优点 这是我所在的团队在 GitHub 上使用最友 ...

  10. WPF 布局 在有限空间内让两个元素尽可能撑开的例子

    我在尝试写一个显示本机 WIFI 热点的账号和密码的控件,要求此控件在有限的空间内显示.但是尽可能显示出热点的账号和密码.而热点的账号和密码是用户配置的,也许长度很长.我的需求是在假如账号的长度较短的 ...