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. NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

    NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧 NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣 ...

  2. springboot+thymeleaf+mybatis实现甘特图(代码非常详细)

    首先我们要明白:这个甘特图需要哪些动态数据. (1)需要:ID,tName,number,计划开始时间,开始时间,计划结束时间,结束时间,项目负责人,参与人,知情人ID,计划时长(可以计算得出的,不必 ...

  3. 力扣495(java)-提莫攻击(简单)

    题目: 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和提莫攻击的中 ...

  4. 【漫画】最近,老王又双叒get了CDN的新技能—可编程化敏捷开发

    原文链接本文为阿里云原创内容,未经允许不得转载.

  5. 5分钟搞定AlertManager接入短信、语音等10+种通知渠道

    ​简介: Alert Manager是开源监控系统Prometheus中用于处理告警信息的服务,通过将日志服务开放告警配置为Alert Manager中的一个Receiver,可以将Alert Man ...

  6. [Go] go build 和 go install 的区别

    $ go build 源文件及其包依赖 编译成二进制. install 不仅执行build过程 而且会把编译的二进制放到 $GOPATH/bin/,包放到 $GOPATH/pkg/ Link:http ...

  7. dotnet 6 已知问题 ManualResetEventSlim 的 Set 方法抛出空异常

    本文记录一个 dotnet 6 已知问题,此问题预计是在 .NET Framework 4.5 时就引入的,我没有考古在 .NET Framework 4.5 之前是否还存在此问题.当前这个问题在 . ...

  8. dotnet Roslyn 通过读取 suo 文件获取解决方案的启动项目

    本文来告诉大家一个黑科技,通过 .suo 文件读取 VisualStudio 的启动项目.在 sln 项目里面,都会生成对应的 suo 文件,这个文件是 OLE 格式的文件,文件的格式没有公开,本文的 ...

  9. Educational Codeforces Round 160 (Rated for Div. 2)

    A 直接模拟,注意细节 #include<bits/stdc++.h> #define ll long long using namespace std; ll p[15] = {1}; ...

  10. Data Lake_理解数据湖

    Pentaho首席技术官James Dixon创造了"数据湖"一词.它把数据集市描述成一瓶水(清洗过的,包装过的和结构化易于使用的).而数据湖更像是在自然状态下的水,数据流从源系统 ...