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 }
运行测试,操作之前数据库中已经有了一些数据: