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++;            //表示遍历下一行
    }


}
相关推荐
IT枫斗者8 分钟前
集合工具类
java·linux·数据库·windows·算法·microsoft
大厂小码哥33 分钟前
图解Redis 01 | 初识Redis
数据库·redis·缓存
咚咚?2 小时前
麒麟操作系统 MySQL 主从搭建
数据库·mysql
爬山算法3 小时前
Oracle(130)如何启动和关闭Oracle数据库?
数据库·oracle
天荒地老笑话么4 小时前
MySQL——数据库的高级操作(三)权限管理(1)MySQL 的权限
数据库·mysql
天荒地老笑话么7 小时前
MySQL——数据库的高级操作(二)用户管理(1)uer表
数据库·mysql
GG编程7 小时前
Mysql 索引
数据库·mysql
Python私教7 小时前
Go语言现代web开发13 方法和接口
前端·数据库·golang
yaoxin5211239 小时前
第二十三章 加密安全标头元素
前端·数据库·安全
银氨溶液9 小时前
MySQL底层为什么选择用B+树作为索引
数据结构·数据库·b树·mysql·面试·b+树