1 简介
说明:本文简单说明在Qt中操作数据库,用MySql数据库进行试验。
Qt 提供了QtSql模块来提供平台独立的基于 SQL 的数据库操作。
2 MySql的安装及简单使用
视频对应的资源文件已经说得很清楚了,这里就不单独进行说明了。给出下载的链接:
链接:https://pan.baidu.com/s/1ZThzPvYs41dlGeAid--agg
提取码:zony
sql语句也不在这里进行说明,去查询相关的资料即可。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
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,再次打开执行就不会报错了:
上述步骤的完整代码:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//打印qt支持的数据库驱动
qDebug() << QSqlDatabase::drivers();
//添加MySql数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//连接数据库
db.setHostName("127.0.0.1"); //数据库服务器IP
db.setUserName("root"); //数据库用户名
db.setPassword("123456"); //密码
db.setDatabaseName("test"); //使用哪个数据库
//打开数据库
if (db.open() == false) {
QMessageBox::warning(this, "错误", db.lastError().text());
return;
}
//操作sql语句
QSqlQuery query;
query.exec("create table student(id int primary key, name varchar(255), age int, score int);");
}
运行测试:
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)方式一:
//odbc风格
//预处理语句
query.prepare("insert into student(name, age, score) values(?, ?, ?);");
// 给字段设置内容
QVariantList nameList;
nameList << "xiaoming" << "xiaokong" << "xiaojiang";
QVariantList ageList;
ageList << 22 << 21 << 24;
QVariantList scoreList;
scoreList << 89 << 99 << 78;
//给字段绑定相应的值,必须按顺序绑定
query.addBindValue(nameList);
query.addBindValue(ageList);
query.addBindValue(scoreList);
//执行预处理命令
query.execBatch();
QSqlQuery::prepare()函数对这条 SQL 语句进行预处理,问号 ? 相当于占位符,预示着以后我们可以使用实际数据替换这些位置。
QSqlQuery::addBindValue()我们将实际数据绑定到这个预处理的 SQL 语句上。
QSqlQuery::execBatch()批量执行 SQL,之后结束该对象。
(2)方式二:
//oracle风格:占位符 + 自定义名字
query.prepare("insert into student(name, age, score) values(:name, :age, :score)");
//给字段设置内容
QVariantList nameList;
nameList << "xiaoa" << "xiaob" << "xiaoc";
QVariantList ageList;
ageList << 21 << 19 << 24;
QVariantList scoreList;
scoreList << 77 << 66 << 70;
//给字段绑定对应的值,不需要指定顺序
query.bindValue(":name", nameList);
query.bindValue(":score", scoreList);
query.bindValue(":age", ageList);
//执行预处理命令
query.execBatch();
推荐使用方式二。
4 查找
现有一个数据库如下:
查找所有的条目:
QSqlQuery query;
query.exec("select * from student");
while (true == query.next()) { //一行一行遍历
//取出当前行的内容,以列为单位
qDebug() << query.value(0).toInt() //取第一列
<< query.value(1).toString() //取第二列
<< query.value("age").toInt() //按名字查找
<< query.value("score").toInt();
}
查找某一条:
query.exec("select * from student where name = 'xiaoa'");
while (true == query.next()) { //一行一行遍历
//取出当前行的内容,以列为单位
qDebug() << query.value(0).toInt() //取第一列
<< query.value(1).toString() //取第二列
<< query.value("age").toInt()
<< query.value("score").toInt();
}
5 删除
使用事务进行操作,首先创建一个ui,如下:
行编辑区输入我们要删除的name,删除按钮删除该条目,确定删除按钮确认删除该条目,取消按钮取消删除操作。
完整代码如下:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//打印qt支持的数据库驱动
qDebug() << QSqlDatabase::drivers();
//添加MySql数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//连接数据库
db.setHostName("127.0.0.1"); //数据库服务器IP
db.setUserName("root"); //数据库用户名
db.setPassword("123456"); //密码
db.setDatabaseName("test"); //使用哪个数据库
//打开数据库
if (db.open() == false) {
QMessageBox::warning(this, "错误", db.lastError().text());
return;
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_delete_clicked()
{
//获取行编辑内容
QString name = ui->lineEdit->text();
QString sql = QString("delete from student where name='%1'").arg(name);
qDebug() << sql;
//开启一个事务
QSqlDatabase::database().transaction();
// 执行sql语句
QSqlQuery query;
query.exec(sql);
}
void Widget::on_pushButton_sure_clicked()
{
//确定删除
QSqlDatabase::database().commit();
}
void Widget::on_pushButton_cancel_clicked()
{
//回滚、撤销
QSqlDatabase::database().rollback();
}
运行测试,操作之前数据库中已经有了一些数据:
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓