QT连接数据库及操作

MySQL数据库

创建一个新的项目,带ui,(Widget)
在这里插入图片描述
在.pro文件中加上sql,如图
在这里插入图片描述
在类的.cpp中加上两个头文件

#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>

当你加上这一句:

qDebug()<<QSqlDatabase::drivers();

在这里插入图片描述
QSQLITE 文件型数据库,不用服务器。

这里我们用QMYSQL

添加MYSQL数据库

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //数据库对象

连接数据库(首先得先有mysql)

//连接数据库
    db.setHostName("127.0.0.1"); //数据库服务器IP
    db.setUserName("root"); //数据库用户名
    db.setPassword("123456"); //数据库密码
    db.setDatabaseName("info"); //使用哪个数据库

判断数据库是否连接成功同时打开数据库

    if( !db.open() ){ //数据库打开失败
        QMessageBox::warning(this,"错误",db.lastError().text());
        return;
    }

(记住,这里要把libmysql.dll库放进QT的bin文件里,否则会弹出找不到)
下面的百度云网盘里有libmysql。dll的库:
链接:https://pan.baidu.com/s/1vXhscnLRZtI1XhQH8oZaOw
提取码:y7h7

在这里插入图片描述
这样则说明成功了。

创建表

加个头文件:

#include <QSqlQuery>

创建代码:

 QSqlQuery query;
    query.exec("create table student(id int primary key auto_increment, name varchar(255), age int, score int);");

会发现数据库成功创建出一个student的表
在这里插入图片描述
创建表一次就行,或者你事先在mysql创建好了则不用再创建了。

传入数据:

单组传入:
QSqlQuery query;
    query.exec("insert into student(id, name, age, score) values(1, 'mike', 18, 59);");

在这里插入图片描述
在这里,我mysql可视化用的是 sqlyog。

批量插入

加上头文件

#include <QSqlQuery>
#include <QVariantList>
    //odbc风格
    //预处理语句
    //?相当于占位符
    query.prepare("insert into student( name, age, score) values(?,?,?);");
    //给字段设置内容 list
    QVariantList nameList;
    nameList<<"xiaoming"<<"xiaolong"<<"xiaojiang";
    QVariantList ageList;
    ageList<<11<<22<<33;
    QVariantList scoreList;
    scoreList<<59<<69<<79;
    //给字段绑定相应的值,按顺序绑定
    query.addBindValue(nameList);
    query.addBindValue(ageList);
    query.addBindValue(scoreList);
    //执行预处理命令
    query.execBatch();

刷新一下数据库可以发现表中又多了三组数据
在这里插入图片描述

第二种风格(个人推荐这个)

 		//oracle风格
    	//占位符 : + 自定义名字
      	query.prepare("insert into student( name, age, score) values(:name,:age,:score);");
         QVariantList nameList;
         nameList<<"xiaoa"<<"xiaob"<<"xiaoc";
         QVariantList ageList;
         ageList<<33<<44<<55;
         QVariantList scoreList;
         scoreList<<89<<90<<100;
         //给字段绑定
         query.bindValue(":name",nameList);
         query.bindValue(":score",scoreList);
         query.bindValue(":age",ageList);

         //执行预处理命令
         query.execBatch();

在这里插入图片描述
成功插入数据。

删除数据

到.ui文件中
在这里插入图片描述在这里插入图片描述在这里插入图片描述
将界面设为
在这里插入图片描述
修改按钮名字。buttonCancel,buttonDel,buttonSure;
右击删除,然后转到槽,选第一个。

void Widget::on_buttonDel_clicked()
{
    //获取行编辑内容
    QString name = ui->lineEdit->text();

    QString sql = QString("delete from student where name = '%1';").arg(name);
    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;
    query.exec(sql);
}

其他两个也一样的操作;

void Widget::on_buttonSure_clicked()
{
    //确定删除
    QSqlDatabase::database().commit();
}

void Widget::on_buttonCancel_clicked()
{
    //回滚,撤销
    QSqlDatabase::database().rollback();
}

更新数据用update student set score = 90 where id = 3;

编译运行即可实现删除数据。

查询:

query.exec("select*from student");
    while(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");

可以看到
在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
#include <QVariantList>

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("holdworld000312"); //数据库密码
    db.setDatabaseName("slimes"); //使用哪个数据库

    //打开数据库
    if( !db.open() ){ //数据库打开失败
        QMessageBox::warning(this,"错误",db.lastError().text());
        return;
    }

    //传入
    QSqlQuery query;
    //query.exec("insert into student(id, name, age, score) values(1, 'mike', 18, 59);");

    //批量插入
    //odbc风格
    //预处理语句
    //?相当于占位符
//    query.prepare("insert into student( name, age, score) values(?,?,?);");
//    //给字段设置内容 list
//    QVariantList nameList;
//    nameList<<"xiaoming"<<"xiaolong"<<"xiaojiang";
//    QVariantList ageList;
//    ageList<<11<<22<<33;
//    QVariantList scoreList;
//    scoreList<<59<<69<<79;
//    //给字段绑定相应的值,按顺序绑定
//    query.addBindValue(nameList);
//    query.addBindValue(ageList);
//    query.addBindValue(scoreList);
//    //执行预处理命令
//    query.execBatch();

      //oracle风格
    //占位符 : + 自定义名字
//      query.prepare("insert into student( name, age, score) values(:name,:age,:score);");
//         QVariantList nameList;
//         nameList<<"xiaoa"<<"xiaob"<<"xiaoc";
//         QVariantList ageList;
//         ageList<<33<<44<<55;
//         QVariantList scoreList;
//         scoreList<<89<<90<<100;
//         //给字段绑定
//         query.bindValue(":name",nameList);
//         query.bindValue(":score",scoreList);
//         query.bindValue(":age",ageList);

//         //执行预处理命令
//         query.execBatch();
   query.exec("select*from student where name = 'xiaoa';");
    while(query.next()){  //一行一行遍历
        //取出当前行的内容
       qDebug()<<query.value(0).toInt()
           <<query.value(1).toString()
           <<query.value("age").toInt()
           <<query.value("score").toInt();
    }




}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_buttonDel_clicked()
{
    //获取行编辑内容
    QString name = ui->lineEdit->text();

    QString sql = QString("delete from student where name = '%1';").arg(name);
    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;
    query.exec(sql);


}

void Widget::on_buttonSure_clicked()
{
    //确定删除
    QSqlDatabase::database().commit();
}

void Widget::on_buttonCancel_clicked()
{
    //回滚,撤销
    QSqlDatabase::database().rollback();
}

静态数据库(.db)

先建立一个.db文件
在这里插入图片描述
创建一个新项目。
在.pro文件中加上sql
.cpp文件和上面的类似,但是不用连接密码和账户(是开源的)。

#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
#include <QVariantList>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //打印QT支持的数据库驱动
    qDebug()<<QSqlDatabase::drivers();

    //添加MYSQL数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //数据库对象
    //设置数据库
    db.setDatabaseName("../info.db");


    //打开数据库
    if( !db.open() ){ //数据库打开失败
        QMessageBox::warning(this,"错误",db.lastError().text());
        return;
    }

    QSqlQuery query;
    query.exec("create table student(id int primary key, name varchar(255), age int, score int);");

     // ?相当于占位符
    query.prepare("insert into student( name, age, score) values(?,?,?);");
    //给字段设置内容 list
    QVariantList nameList;
    nameList<<"xiaoming"<<"xiaolong"<<"xiaojiang";
    QVariantList ageList;
    ageList<<11<<22<<33;
    QVariantList scoreList;
    scoreList<<59<<69<<79;
    //给字段绑定相应的值,按顺序绑定
    query.addBindValue(nameList);
    query.addBindValue(ageList);
    query.addBindValue(scoreList);
    //执行预处理命令
    query.execBatch();

    query.exec("select*from student;");
     while(query.next()){  //一行一行遍历
         //取出当前行的内容
        qDebug()<<query.value(0).toInt()
            <<query.value(1).toString()
            <<query.value("age").toInt()
            <<query.value("score").toInt();
     }
}

Widget::~Widget()
{
    delete ui;
}

在这里插入图片描述
静态数据库的操作和上面的基本相似,唯一不同的就是登陆不用账号密码。

Logo

更多推荐