QT操作数据库

思维导图:


学习内容:

1. QSqlDatabase:数据库管理类

主要完成数据库的创建、数据库的打开、关闭等操作

该类中常用函数:

1、 QSqlDatabase addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))

功能:为应用程序添加一个数据库,如果数据库不存在则添加,如果数据库存在,则直接构造

参数:数据库驱动类型

2、 bool contains(const QString &connectionName = QLatin1String(defaultConnection))

功能:判断某个数据库是否存在

参数:数据库的名称 返回值:存在返回真,否则返回假

3、bool QSqlDatabase::open()

功能:打开一个数据库,如果数据库存在则打开,否则创建一个数据库

参数:无 返回值:bool类型,成功打开返回true失败返回false

4、void QSqlDatabase::setDatabaseName(const QString &name)

功能:设置数据库的名称

参数:数据库名称 返回值:无

2. QSqlQuerry:查询类

能完成对select语句的执行

该类常用的函数

1、bool QSqlQuery::exec(const QString &query)

功能:执行sql语句,并将结果放入到该类的对象中以便于后期的使用

参数:要执行的sql语句

返回值:成功执行返回true,失败返回false

2、bool QSqlQuery::next() bool QSqlQuery::previous()

功能:返回下一条或上一条记录

参数:无

返回值:bool类型

3、QSqlRecord QSqlQuery::record() const

功能:返回当前查询的记录值

参数:无

返回值:QSqlRecord类对象

3. QSqlRecord类

1> 该类用于存储某一条记录的信息

2> 常用函数

1、int QSqlRecord::count() const

功能:返回当前记录的字段的个数

参数:无

返回值:字段的个数

2、QVariant QSqlRecord::value(int index) const

功能:返回给定下标的字段的值

参数:字段的下标

返回值:给定下标的字段值

头文件

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include<QSqlDatabase>        //数据库管理类
#include<QSqlQuery>            //数据库查询类
#include<QSqlError>            //数据库错误信息类
#include<QSqlRecord>          //数据库记录类


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE


class Widget : public QWidget
{
    Q_OBJECT


public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


private slots:
    void on_addBtn_clicked();


    void on_showBtn_clicked();


private:
    Ui::Widget *ui;


    QSqlDatabase db;           //使用无参构造,实例化一个数据库管理类对象


};
#endif // WIDGET_H

源文件

#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QDebug>


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


    //当界面被关闭时,断开数据库的连接
    connect(this, &Widget::destroyed, [&](){
        db.close();
    });






    //1、添加数据库
    db = QSqlDatabase::addDatabase("QSQLITE");      //添加的是sqlite3的数据库驱动


    //2、设置数据库的名称
    db.setDatabaseName("my.db");




    //4、打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"提示","数据库打开失败");
        return;
    }


    //完成对数据表的创建,需要一个sql语句的执行者
    QSqlQuery querry;           //实例化对象
    //准备sql语句
    QString sql = "create table if not exists Stu(id int, name char, score double);";
    //执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","数据表创建失败");
        return;
    }


}


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


//添加信息对应的槽函数
void Widget::on_addBtn_clicked()
{




    //1、获取ui界面上的信息
    int ui_id = ui->idEdit->text().toInt();    //id号
    QString ui_name = ui->nameEdit->text();    //name
    double ui_score = ui->scoreEdit->text().toDouble();   //score


    //判断是否某个数据没有填写
    if(ui_id==0 || ui_name.isEmpty() || ui_score==0)
    {
        QMessageBox::information(this,"提示","请将信息填写完整");
        return;
    }


    //2、准备sql语句
    QString sql =tr("insert into Stu(id, name, score) values(%1, '%2', %3);").arg(ui_id).arg(ui_name).arg(ui_score);


    //qDebug()<<sql;


    //3、准备语句执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","数据添加失败");
        return;
    }




    QMessageBox::information(this,"提示","数据添加成功");


}




//展示信息按钮对应的槽函数
void Widget::on_showBtn_clicked()
{
    ui->tableWidget->clearContents();         //清空表格内容


    //准备sql语句
    QString sql;
    if(ui->nameEdit->text().isEmpty())
    {
        sql = "select * from Stu;";         //表示查询所有表中信息
    }else
    {
        sql = tr("select * from Stu where name='%1';").arg(ui->nameEdit->text());
    }
    qDebug()<<sql;


    //准备sql执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"提示","查询失败");
        qDebug() << "失败原因:"<< querry.lastError().text();
        return;
    }


    //程序执行至此,查询结果保存在querry类对象中了
    //可以调用该类的成员函数next进行遍历该结果集
    int i = 0;
    while(querry.next())
    {
        //循环中表示,querry指向的任意一条记录
        //可以调用成员函数record函数获取当前指向的记录数据:querry.record
        //querry.record().count():返回当前记录的字段个数
        //querry.record().value(i):表示的是当前记录的下标为i的字段的值
        //qDebug()<<querry.record().value(1).toString();
        //将查询的数据展示到ui界面
        //准备数据容器
        for(int j=0; j<querry.record().count(); j++)
        {
            QTableWidgetItem *item = new QTableWidgetItem(querry.record().value(j).toString());
            //将当前项目设置到 ui界面的(i,j)下标处
            ui->tableWidget->setItem(i,j, item);
        }




        i++;            //表示遍历下一行
    }


}
相关推荐
远歌已逝13 分钟前
维护在线重做日志(二)
数据库·oracle
qq_433099401 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz1 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺3 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i5 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl5 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502775 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空5 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
聂 可 以7 小时前
Windows环境安装MongoDB
数据库·mongodb