Qt-数据库操作MySql

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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_73443478/article/details/131611698