当前位置: 首页 > news >正文

Qt 数据库操作(Sqlite)

数据库简介

关于数据库的基础知识这里就不做介绍了,相关博客可以查看:

SQL基础知识

数据库学霸笔记

上面博客都写的比较详细,本文主要介绍如何使用Qt进行数据库相关操作,数据库分为关系型数据库和非关系型数据,关系型数据库主要有Sqlite、MySQL、Oracle、SQLServer、PostgreSQL等,非关系型数据库主要有Redis、Cassandra、MongoDB等。这次主要介绍Qt使用SQlite数据库。

基础SQL操作

Qt使用数据库工程文件记得引入sql模块:

QT  += sql

数据库初始化:

    //查看支持的数据库驱动
    for (const QString &driver : QSqlDatabase::drivers()) {
        qDebug() << driver;
    }
    //建立数据库连接
    m_Db = QSqlDatabase::addDatabase("QSQLITE");
    //设置本地数据库文件
    m_Db.setDatabaseName("test.db");
    //打开数据库
    if (!m_Db.open()) { qDebug() << "open db fail"; }
    //创建表
    QString execSql =
        QString("create table if not exists testinfo(name varchar(64),id "
                "varchar(64),createdate varchar(64))");
    //遍历输出该数据库中所有表名
    for (const QString &table : m_Db.tables()) { qDebug() << table; }
    QSqlQuery query;
    if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }

上述代码中先查看数据库驱动,数据库驱动是应用程序和数据库之间的桥梁,提供访问数据库所需的工具和 API(应用程序编程接口)。查看程序输出打印:

Qt默认支持一些驱动,可以看到有SQlite,但是没有MySQL,如若要用Qt进行MySQL相关数据库操作则需额外安装相关驱动(本文不作介绍)。然后查看生成了对应的数据库文件test.db。

如何查看这个数据库文件了,我推荐使用DB browser for SQLite,使用比较简单,使用该软件打开对应数据库文件:

可以看到我们在代码中创建的表,点击"浏览数据":

数据库表数据相关操作,无非增删查改四种,界面添加对应按钮,编写对应槽函数代码。

增:

void MainWindow::on_insert_clicked() {
    if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }
    if (!m_Db.isOpen()) { return; }
    QString name = ui->name->text().trimmed();
    QString id = ui->id->text().trimmed();
    QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QString execSql = QString("insert into testinfo (name,id, createdate) "
                              "values('%1', '%2', '%3')")
                          .arg(name)
                          .arg(id)
                          .arg(date);
    QSqlQuery query;
    if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

输入数据点击添加按钮:

查看数据表内容:

 可以看到一条数据已经成功添加。

删:

void MainWindow::on_delete_2_clicked() {
    if (ui->name->text().isEmpty()) { return; }
    if (!m_Db.isOpen()) { return; }
    QString name = ui->name->text().trimmed();
    QString execSql =
        QString("delete from testinfo where name = '%1';").arg(name);
    QSqlQuery query;
    if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

我在数据库中添加了一条数据,然后点击按钮删除对应指定name的数据

点击按钮后数据已删除:

 查:

void MainWindow::on_select_clicked() {
    QString name = ui->name->text();
    QString id = ui->id->text();
    QString execSql = QString();
    if (name.isEmpty() && id.isEmpty()) {
        execSql = QString("select * from testinfo");
    } else if (!name.isEmpty() && id.isEmpty()) {
        execSql = QString("select * from testinfo where name = '%1'").arg(name);
    } else if (name.isEmpty() && !id.isEmpty()) {
        execSql = QString("select * from testinfo where id = '%1'").arg(id);
    } else {
        execSql =
            QString("select * from testinfo where name = '%1' and id = '%2'")
                .arg(name)
                .arg(id);
    }
    QSqlQuery query;
    if (!query.exec(execSql)) {
        qDebug() << query.lastError().text();
    } else {
        while (query.next()) {
            QSqlRecord rec = query.record(); //获取列
            QStringList vals;
            for (int i = 0; i < rec.count(); ++i) {
                vals.append(rec.value(i).toString());
            }
            ui->textEdit->append(vals.join(","));
        }
    }
}

执行效果不作演示。(select的where用法比较多,详细可以查看文章开头推荐的第一篇博客)

改:

void MainWindow::on_update_clicked() {
    //修改指定name的id值
    if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }
    if (!m_Db.isOpen()) { return; }
    QString name = ui->name->text().trimmed();
    QString id = ui->id->text().trimmed();
    QString execSql = QString("update testinfo set id = '%1' where name = '%2'")
                          .arg(id)
                          .arg(name);
    QSqlQuery query;
    if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

根据界面输入的name和id,将指定name的数据id改为指定值:

额外补充:删除表为:drop+表名,该操作会将表中所有数据以及表结果删除,如果只是想删除所有数据则为: truncate+表名。

事务

事务是一组操作的集合,这些操作被视为一个单一的工作单元。事务要么完成所有操作,要么取消所有操作,保持数据库在良好的状态下。

比如我现在要一次性插入多条数据,用事务如下编写:

void MainWindow::on_test_clicked() {
    //使用事务添加100条数据
    QStringList sqlList;
    for (int i = 0; i < 100; ++i) {
        QString execSql = QString("insert into testinfo (name,id, createdate) "
                                  "values('%1', '%2', '%3')")
                              .arg(i)
                              .arg(i)
                              .arg(QDateTime::currentDateTime().toString(
                                  "yyyy-MM-dd hh:mm:ss"));
        sqlList.append(execSql);
    }
    if (!m_Db.isOpen()) { return; }
    m_Db.transaction(); //开启事务
    for (const QString &execSql : sqlList) {
        QSqlQuery query(m_Db);
        bool b = query.exec(execSql);
        if (!b) {
            m_Db.rollback(); //失败进行回滚
            return;
        }
    }
    m_Db.commit(); //事务提交
}

点击按钮后查看数据内容:

 

内容已添加。 

相关文章:

  • 搭建大数据技能竞赛比赛环境容器docker模块A-容器绑定物理网卡
  • Axios简单说明,快速上手
  • 电器维修系统小程序+论文源码调试讲解
  • 为什么 HTTP GET 方法不使用请求体?
  • 前端项目使用多个echarts版本的实践方案
  • ESP-IDF ubuntu版本 V5.2
  • C语言操作MySQL从入门到精通
  • 计算机数据结构-第一章
  • 美畅物联丨WebRTC 技术详解:构建实时通信的数字桥梁
  • springcloud gateway搭建及动态获取nacos注册的服务信息信息
  • C++程序设计语言笔记——抽象机制:运算符重载
  • 14、JavaEE核心技术 - JavaBeans
  • C++设计模式-原型模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
  • C# NX二次开发:模型导入和向量及点位的使用
  • 连锁企业管理系统 解决了哪些问题
  • ##Hive安装-初始化元数据报错 *** schemaTool failed ***
  • IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力
  • C++复试笔记(二)
  • 微服务新手入门
  • ROS实践(四)机器人建图(gmapping)
  • 潘功胜:将下调个人住房公积金贷款利率0.25个百分点
  • 安顺市原副市长、市公安局原局长顾长华任贵州省民委副主任
  • 默茨在德国联邦议院第一轮投票中未能当选总理
  • 特朗普要征100%关税,好莱坞这批境外摄制新片有麻烦了
  • 三百余英国王室藏品,一览爱德华时代的优雅
  • 金科股份:因信披违规,公司及董事长、总裁、财务负责人等收到行政监管措施决定书