返回顶部

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 }
View Code

运行测试:

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 }
View Code

运行测试,操作之前数据库中已经有了一些数据:

posted @ 2020-07-17 00:15  zhengcixi  阅读(506)  评论(0编辑  收藏