Qt使用Mysql的API对数据库增删改查操作(十)

经过(九)的驱动配置,我们可以正式来学习MySQL了。

1.对数据库进行访问,添加表格

.pro文件

QT += core gui sql

widget.cpp文件

#include "widget.h" 
#include "ui_widget.h"
#include<QSqlDatabase>//Mysql
#include<QDebug>//打印
#include<QMessageBox>//模态对话框的头文件
#include<QSqlError>//lasterror用到的头文件
#include<QSqlQuery>//新建表用到的头文件
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //打印Qt支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();
/*("QSQLITE"静态数据库,不需要服务器,和文件一样,a.db
    , "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")*/
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//添加Mysql数据库
    db.setHostName("0.0.0.0");//数据库服务器IP
    db.setUserName("eagle");//数据库用户名
    db.setPassword("123456");//数据库密码
    db.setDatabaseName("checksysterm");//使用哪个数据库
    //打开数据库
    if(!db.open())
    {
        QMessageBox::warning(this,"错误",db.lastError().text());
        return;
    }
    QSqlQuery query;
    query.exec("create table test(id int primary key auto_increment,state varchar(255),time int)");
}
Widget::~Widget()
{
    delete ui;
}

效果:
图片

2.插入数据库操作(对应上面代码)

1)单条插入

QSqlQuery query; 
    query.exec("insert into test(id, state, time) values(1, 'open', 2)");

效果:
图片

2)批量插入(两种方法a和b,个人推荐第二种)

a.需要给字符串顺序绑定值

//预处理语句 
    query.prepare("insert into test(state, time) values(?, ?)");//?占位符
    //给字段设置内容 list
    QVariantList stateList;
    stateList<<"open"<<"close"<<"close";
    QVariantList timeList;
    timeList<<5<<8<<10;
    //给字段绑定相应的值,顺序绑定
    query.addBindValue(stateList);
    query.addBindValue(timeList);
    //执行预处理命令
    query.execBatch();

效果:(一定要一一对应了,顺序排列)
图片

b.不需要给字符串顺序绑定

//占位符::+自定义名字 
        query.prepare("insert into test(state, time) values(:state, :time)");//?占位符
        //给字段设置内容 list
        QVariantList stateList;
        stateList<<"open"<<"open"<<"close";
        QVariantList timeList;
        timeList<<1<<2<<3;
        //给字段绑定相应的值,顺序绑定
        query.bindValue(":state",stateList);
        query.bindValue(":time",timeList);
        //执行预处理命令
        query.execBatch();

效果:
图片

3.对数据库信息删除操作(做一个界面,,打包后就很方便对数据库操作)

设计个ui:

图片

代码:

//对应删除按钮
void Widget::on_buttonDel_clicked() 
{
    //获取编辑内容
    QString state = ui->lineEdit->text();
    QString sql=QString("delete from test where state ='%1'").arg(state);
    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;
    query.exec(sql);
}
//对应保存按钮
void Widget::on_buttonSave_clicked()
{
    //确定删除操作
    QSqlDatabase::database().commit();
}
//对应撤销按钮
void Widget::on_buttonCancel_clicked()
{
    //回滚
    QSqlDatabase::database().rollback();
}
//对应关闭按钮
void Widget::on_buttonclose_clicked()
{
    this->close();
}

效果:
a.确定删除

图片图片

按下撤销按钮则数据不删除,如果发现数据删除了,无法回滚,可能是数据库的自动提交没有关闭,这需要在数据库中设置。

4.更新数据

query.exec("update test set state = 'close' where id= 1");

数据库中原数据: 更新后:
图片图片

5.查询数据

1)遍历全部显示

query.exec("select * from test"); 
    while(query.next())//遍历数据库
    {
        //取出当前行
        qDebug()<<query.value(0).toInt()
                 <<query.value(1).toString()//通过列数
                 <<query.value("time").toInt();//通过字段

    }

效果:
图片

2)遍历,选择显示

query.exec("select * from test where state = 'open'");//选择显示 
    while(query.next())//遍历数据库
    {
        //取出当前行
        qDebug()<<query.value(0).toInt()
                 <<query.value(1).toString()//通过列数
                 <<query.value("time").toInt();//通过字段

    }

效果:图片

发布了54 篇原创文章 · 获赞 55 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/visual_eagle/article/details/105538747