SQLite3 数据库学习(四):Qt 数据库基础操作

参考引用

1. 创建连接执行 sql 语句

  • 在 Qt 中使用数据库要在工程文件中添加

    txt 复制代码
    QT += sql

1.1 main.cpp

cpp 复制代码
#include "createsqlapp.h"
#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建一个默认数据库连接,在后期整个 Qt 应用中可使用,通过 Qt 中的接口函数操作数据库
    // 创建数据库连接句柄
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称,用户名,密码
    db.setDatabaseName("my.db");
    // 打开数据库
    if (!db.open()) {
        qDebug() << db.lastError().text();  // 输出错误信息
    }

    CreateSqlApp w;
    w.show();

    return a.exec();
}

1.2 createsqlapp.h

cpp 复制代码
#ifndef CREATESQLAPP_H
#define CREATESQLAPP_H

#include <QWidget>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <QString>

QT_BEGIN_NAMESPACE
namespace Ui { class CreateSqlApp; }
QT_END_NAMESPACE

class CreateSqlApp : public QWidget {
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    Ui::CreateSqlApp *ui;
};
#endif // CREATESQLAPP_H

1.3 createsqlapp.cpp

cpp 复制代码
#include "createsqlapp.h"
#include "ui_createsqlapp.h"

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

    // 创建数据库表格
    QSqlQuery query;  // 自动关联到默认连接名的数据库
    // 执行创建表格的语句
    if (!query.exec("create table if not exists student(id int, name text)")) {
        qDebug() << query.lastError().text();
    }

    // 插入语句
    if (!query.exec("insert into student values(0, 'Tom')")) {
        qDebug() << query.lastError().text();
    }
}

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

void CreateSqlApp::on_pushButton_clicked() {
    QString sql = QString("insert into student values(%1, '%2')").arg(ui->idEdit->text()).arg(ui->nameEdit->text());
    QSqlQuery query;  // 自动关联到默认连接名的数据库
    // 执行创建表格的语句
    if (!query.exec(sql)) {
        qDebug() << query.lastError().text();
    }
}

1.4 createsqlapp.ui

  • 在界面添加数据后点添加数据按钮,查看添加成功数据如下图所示(其中 0 为默认添加)
    • 1 yuexd
    • 2 juzy

2. 用户名和密码注册、登录

  • 注册

  • 登录

2.1 main.cpp

cpp 复制代码
#include "loginsqlite.h"

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建一个默认数据库连接,在后期整个 Qt 应用中可使用,通过 Qt 中的接口函数操作数据库
    // 创建数据库连接句柄
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称,用户名,密码
    db.setDatabaseName("my.db");
    // 打开数据库
    if (!db.open()) {
        qDebug() << db.lastError().text();  // 输出错误信息
    }

    // 创建表格
    QString sql = "create table if not exists user(id integer primary key autoincrement,"
                  "username varchar(256) unique, password varchar(256))";
    // 执行 sql 语句
    QSqlQuery query;  // 自动关联到默认连接名的数据库
    if (query.exec(sql)) {
        qDebug() << query.lastError().text();
    }

    loginSqlite w;
    w.show();
    return a.exec();
}

2.2 loginsqlite.cpp

cpp 复制代码
#include "loginsqlite.h"
#include "ui_loginsqlite.h"

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

    // 从配置文件中提取用户名和密码(再次打开登录界面会默认显示上次登录的用户名和密码)
    QSettings setting(QSettings::IniFormat, QSettings::SystemScope, "config");
    QString username = setting.value("username").toString();
    QString password = setting.value("password").toString();

    ui->userEdit->setText(username);
    ui->passEdit->setText(password);
}

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

// 查询数据库
void loginSqlite::on_loginBt_clicked() {
    QString username = ui->userEdit->text();
    QString password = ui->passEdit->text();
    // 打包插入的 sql 语句
    QString sql = QString("select * from user where username='%1' and password='%2'")
                      .arg(username).arg(password);
    // 执行 sql 插入语句
    QSqlQuery query;
    if (!query.exec(sql)) {
        qDebug() << query.lastError().text();
        return;
    }

    // 获取查询的数据
    if (query.next()) {  // 指向第一个数据
        // 查到记录
        qDebug() << "find record";

        // QSettings 记录用户名密码
        if (ui->checkBox->isChecked()) {
            // 打开配置文件 (在 C:\ProgramData 目录下)
            QSettings setting(QSettings::IniFormat, QSettings::SystemScope, "config.ini");
            // 把用户名和密码设置到配置文件中
            setting.setValue("username", username);
            setting.setValue("password", password);
        }
    } else {
        // 未查到记录
        qDebug() << "not find record";
    }
    QSqlRecord record = query.record();  // 一行数据是一条记录
    qDebug() << record.value("username").toString();
    qDebug() << record.value("password").toString();
}

// 插入数据
void loginSqlite::on_regBt_clicked() {
    QString username = ui->userEdit->text();
    QString password = ui->passEdit->text();
    // 打包插入的 sql 语句
    QString sql = QString("insert into user(username, password) values('%1', '%2')")
                      .arg(username).arg(password);
    // 执行 sql 插入语句
    QSqlQuery query;
    if (!query.exec(sql)) {
        qDebug() << query.lastError().text();
        QMessageBox::information(this, "registe", "registe failed");
        return;
    }
    QMessageBox::information(this, "registe", "registed");
}

2.3 loginsqlite.ui

2.4 qss 样式

qss 复制代码
QWidget {
    background-color: rgb(255, 255, 255);
}

QLineEdit {
    border:1px solid#cccccc;
}

QPushButton#loginBt {
    border:1px solid#3f89ec;
    background-color: rgb(63, 137, 236);
    color: rgb(255, 255, 255);
}

QPushButton#pssBt {
    color: rgb(46, 130, 255);
}

QPushButton#regBt {
    color: rgb(46, 130, 255);
}

QPushButton#pssBt : hover {
    color: rgb(46, 100, 200);
}

QPushButton#regBt : hover {
    color: rgb(46, 100, 200);
}

QCheckBox {
    color: rgb(117, 117, 117);
}

3. Qt 连接多个数据库并分别插入数据

3.1 main.cpp (.pro 文件中记得添加 sql 模块)

cpp 复制代码
#include "muldatabaseapp.h"

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建数据库连接句柄 Adb
    QSqlDatabase Adb = QSqlDatabase::addDatabase("QSQLITE", "Adb");  // (数据库驱动名,连接名)
    Adb.setDatabaseName("Amy.db");  // 设置数据库名称,用户名,密码
    if(!Adb.open()) {  // 打开数据库 Adb
        qDebug() << Adb.lastError().text();  // 输出错误信息
    }

    // 创建数据库连接句柄 Bdb
    QSqlDatabase Bdb = QSqlDatabase::addDatabase("QSQLITE", "Bdb");
    Bdb.setDatabaseName("Bmy.db");
    if(!Bdb.open()) {
        qDebug()<<Bdb.lastError().text();
    }

    // 给多个数据库创建表格
    QString sql = "create table if not exists user(id integer primary key autoincrement,"
                  "username varchar(256) unique, password varchar(256))";
    QSqlQuery queryA(Adb);   // 给 A 数据库创建表格
    queryA.exec(sql);

    QSqlQuery queryB(Bdb);   // 给 B 数据库创建表格
    queryB.exec(sql);

    MulDataBaseApp w;
    w.show();
    return a.exec();
}

3.2 muldatabaseapp.h

cpp 复制代码
#ifndef MULDATABASEAPP_H
#define MULDATABASEAPP_H

#include <QWidget>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>

QT_BEGIN_NAMESPACE
namespace Ui { class MulDataBaseApp; }
QT_END_NAMESPACE

class MulDataBaseApp : public QWidget {
    Q_OBJECT

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

private slots:
    void on_insertBt_clicked();

private:
    Ui::MulDataBaseApp *ui;
};
#endif // MULDATABASEAPP_H

3.3 muldatabaseapp.cpp

cpp 复制代码
#include "muldatabaseapp.h"
#include "ui_muldatabaseapp.h"

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

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

void MulDataBaseApp::on_insertBt_clicked() {
    QString username = ui->userEdit->text();
    QString password = ui->passEdit->text();

    QString sql = QString("insert into user(username, password) values('%1', '%2')")
                      .arg(username).arg(password);

    // 选中 rbA 单选框
    if (ui->rbA->isChecked()) {
        QSqlQuery query(QSqlDatabase::database("Adb"));
        if (!query.exec(sql)) {
            qDebug() << query.lastError().text();
        }
    } else if (ui->rbB->isChecked()) {  // 选中 rbB 单选框
        QSqlQuery query(QSqlDatabase::database("Bdb"));
        if (!query.exec(sql)) {
            qDebug() << query.lastError().text();
        }
    }
}

3.4 muldatabaseapp.ui

4. Qt 数据库增删改查

  • 设计一个存储 QLabel 的样式

4.1 main.cpp

cpp 复制代码
#include "labelstylesql.h"

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建数据库连接句柄
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "db");  // (数据库驱动名,连接名)
    db.setDatabaseName("my.db");  // 设置数据库名称,用户名,密码
    if (!db.open()) {
        qDebug() << db.lastError().text();  // 输出错误信息
    }

    // 给数据库创建表格
    QString sql = "create table if not exists label(id integer primary key autoincrement,"
                  "border_size int, border_color varchar(16),"
                  "border_radius int, background_color) varchar(16), color varchar(16)";
    QSqlQuery query(db);
    query.exec(sql);

    LabelStyleSql w;
    w.show();
    return a.exec();
}

4.2 labelstylesql.h

cpp 复制代码
#ifndef LABELSTYLESQL_H
#define LABELSTYLESQL_H

#include <QWidget>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>
#include <QSqlRecord>

QT_BEGIN_NAMESPACE
namespace Ui { class LabelStyleSql; }
QT_END_NAMESPACE

class LabelStyleSql : public QWidget {
    Q_OBJECT

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

private slots:
    void on_insertBt_clicked();

    void on_selectBt_clicked();

    void on_deleteBt_clicked();

    void on_updateBt_clicked();

    void on_testBt_clicked();

private:
    Ui::LabelStyleSql *ui;

    void update_feild(QString key, QString value, int id);
};
#endif // LABELSTYLESQL_H

4.3 labelstylesql.cpp

cpp 复制代码
#include "labelstylesql.h"
#include "ui_labelstylesql.h"

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

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

// 插入(添加)数据
void LabelStyleSql::on_insertBt_clicked() {
    QString sql = QString("insert into label(border_size, border_color, border_radius, background_color, color) "
                          "values(%1, '%2', %3, '%4', '%5')").arg(ui->bsizeEdit->text())
                          .arg(ui->bcolorEdit->text()).arg(ui->bradiusEdit->text())
                          .arg(ui->backcolorEdit->text()).arg(ui->fontcolorEdit->text());

    QSqlQuery query;
    if (!query.exec(sql)) {
        qDebug() << query.lastError().text();
    }
}

// 查询数据
void LabelStyleSql::on_selectBt_clicked() {
    QString id = ui->idEdit->text();
    QString sql = QString("select * from label where id=%1").arg(id);

    QSqlQuery query;
    if (!query.exec(sql)) {
        qDebug() << query.lastError().text();
    }

    while (query.next()) {
        QSqlRecord record = query.record();
        ui->bsizeEdit->setText(record.value("border_size").toString());
        ui->bcolorEdit->setText(record.value("border_color").toString());
        ui->bradiusEdit->setText(record.value("border_radius").toString());
        ui->backcolorEdit->setText(record.value("background_color").toString());
        ui->fontcolorEdit->setText(record.value("color").toString());
    }
}

// 删除数据
void LabelStyleSql::on_deleteBt_clicked() {
    QString id = ui->idEdit->text();
    QString sql = QString("delete from label where id=%1").arg(id);

    QSqlQuery query;
    if (!query.exec(sql)) {
        qDebug() << query.lastError().text();
    }
}

// 更新数据函数
void LabelStyleSql::update_feild(QString key, QString value, int id) {
   QString sql = QString("update label set %1='%2' where id=%3").arg(key).arg(value).arg(id);

    QSqlQuery query;
    if (!query.exec(sql)) {
        qDebug() << query.lastError().text();
    }
}

// 更新数据
void LabelStyleSql::on_updateBt_clicked() {
    QString id = ui->idEdit->text();
    update_feild("border_size", ui->bsizeEdit->text(), id.toInt());
    update_feild("border_color", ui->bcolorEdit->text(), id.toInt());
}

// 存储 QLabel 标签样式
void LabelStyleSql::on_testBt_clicked() {
    QString bsize = ui->bsizeEdit->text();
    QString bcolor = ui->bcolorEdit->text();
    QString bradius = ui->bradiusEdit->text();
    QString backcolor = ui->backcolorEdit->text();
    QString fontcolor = ui->fontcolorEdit->text();

    QString style = QString("border:%1px solid%2; border-radius:%3px; background-color:%4; color:%5")
                        .arg(bsize).arg(bcolor).arg(bradius).arg(backcolor).arg(fontcolor);
    ui->label->setStyleSheet(style);
}

4.4 labelstylesql.ui

5. Qt 数据库绑定机制

5.1 main.cpp

cpp 复制代码
#include "sqlquerybindapp.h"

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建数据库连接句柄
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称,用户名,密码
    db.setDatabaseName("my.db");
    if (!db.open()) {  // 打开数据库
        qDebug() << db.lastError().text();  // 输出错误信息
    }

    // 创建表格
    QString sql = "create table if not exists student(id integer primary key autoincrement,"
                  "name varchar(256), sex varchar(16))";
    // 执行 sql 语句
    QSqlQuery query(db);
    if (query.exec(sql)) {
        qDebug() << query.lastError().text();
    }

    SqlQueryBindApp w;
    w.show();
    return a.exec();
}

5.2 sqlquerybindapp.h

cpp 复制代码
#ifndef SQLQUERYBINDAPP_H
#define SQLQUERYBINDAPP_H

#include <QWidget>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>
#include <QVariantList>
#include <QVariant>

QT_BEGIN_NAMESPACE
namespace Ui { class SqlQueryBindApp; }
QT_END_NAMESPACE

class SqlQueryBindApp : public QWidget {
    Q_OBJECT

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

private slots:
    void on_bindinsertBt_clicked();

    void on_bindsBt_clicked();

private:
    Ui::SqlQueryBindApp *ui;
};
#endif // SQLQUERYBINDAPP_H

5.3 sqlquerybindapp.cpp

cpp 复制代码
#include "sqlquerybindapp.h"
#include "ui_sqlquerybindapp.h"

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

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

// 单个绑定数据
void SqlQueryBindApp::on_bindinsertBt_clicked() {
    QSqlQuery query;

    // 准备执行的语句
    QString sql="insert into student(name , sex) values(:name, :sex)";
    query.prepare(sql);

    // 绑定数据(通过位置绑定)
    query.bindValue(0, ui->nameEdit->text());
    query.bindValue(1, ui->sexEdit->text());

    // 执行
    query.exec();
}

// 批量绑定数据
void SqlQueryBindApp::on_bindsBt_clicked() {
    QSqlQuery query;

    // 准备执行的语句
    QString sql="insert into student(name, sex) values(:name, :sex)";
    query.prepare(sql);

    // 批量绑定数据
    QVariantList names;
    names << "AAA" << "BBB" << "CCC";
    query.addBindValue(names);  //添加到占位符的第 0  ->:name个位置

    QVariantList sexs;
    // 绑定多个数据:如果有多个字段,每个字段绑定数据的个数要一致
    // 此处第三个数据起到占位作用,目的是数据个数与 names 保持一致
    sexs << "man" << "women" << QVariant(QVariant::String);
    query.addBindValue(sexs);

    // 批量执行
    query.execBatch();
}

5.4 sqlquerybindapp.ui

6. Qt 数据库事务机制

cpp 复制代码
bool QSqlDatabase::transaction()  // 开启事务---begin
bool QSqlDatabase::commit()       // 提交事务---commit
bool QSqlDatabase::rollback()     // 事务回滚---rollback
  • 点击开启事务后所有对数据库的操作都在内存中进行,只有点提交事务后才会同步到数据库中

  • 即使点击开启事务,在 Qt 中依然可以查询到更改信息(点回滚事务则撤回上一步操作并自动结束本轮事务机制)

6.1 main.cpp

cpp 复制代码
#include "sqlquerybindapp.h"

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建数据库连接句柄
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称,用户名,密码
    db.setDatabaseName("my.db");
    if (!db.open()) {  // 打开数据库
        qDebug() << db.lastError().text();  // 输出错误信息
    }

    // 创建表格
    QString sql = "create table if not exists student(id integer primary key autoincrement,"
                  "name varchar(256), sex varchar(16))";
    // 执行 sql 语句
    QSqlQuery query(db);
    if (query.exec(sql)) {
        qDebug() << query.lastError().text();
    }

    SqlQueryBindApp w;
    w.show();
    return a.exec();
}

6.2 transactionapp.h

cpp 复制代码
#ifndef TRANSACTIONAPP_H
#define TRANSACTIONAPP_H

#include <QWidget>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>
#include <QSqlRecord>

QT_BEGIN_NAMESPACE
namespace Ui { class transactionApp; }
QT_END_NAMESPACE

class transactionApp : public QWidget {
    Q_OBJECT

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

private slots:
    void on_beginBt_clicked();

    void on_commitBt_clicked();

    void on_rollbackBt_clicked();

    void on_insertBt_clicked();

    void on_selectBt_clicked();

private:
    Ui::transactionApp *ui;
};
#endif // TRANSACTIONAPP_H

6.3 transactionapp.cpp

cpp 复制代码
#include "transactionapp.h"
#include "ui_transactionapp.h"

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

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

void transactionApp::on_beginBt_clicked() {
    // 开始事务处理
    if (QSqlDatabase::database().transaction()) {
        qDebug() << "begin success!";
    } else {
        qDebug() << "begin failed!";
    }
}

void transactionApp::on_commitBt_clicked() {
    // 提交事务处理
    if (QSqlDatabase::database().commit()) {
        qDebug() << "commit success!";
    } else {
        qDebug() << "commit failed!";
    }
}

void transactionApp::on_rollbackBt_clicked() {
    // 回滚事务处理
    if (QSqlDatabase::database().rollback()) {
        qDebug() << "rollback success!";
    } else {
        qDebug() << "rollback failed!";
    }
}

void transactionApp::on_insertBt_clicked() {
    QSqlQuery query;

    // 准备执行的语句
    QString sql = "insert into student(name , sex) values(:name, :sex)";
    query.prepare(sql);

    // 绑定数据(通过位置绑定)
    query.bindValue(0, ui->nameEdit->text());
    query.bindValue(1, ui->sexEdit->text());

    // 执行
    query.exec();
}

void transactionApp::on_selectBt_clicked() {
    QSqlQuery query;

    // 准备执行的语句
    QString sql = "select * from student";
    query.exec(sql);
    while (query.next()) {
        qDebug() << query.record().value("name").toString();
    }
}

6.4 transactionapp.ui

相关推荐
Allen Bright20 分钟前
【MySQL基础-20】MySQL条件函数全面解析:提升查询逻辑的利器
数据库·mysql
孤独得猿21 分钟前
Qt常用控件第一部分
服务器·开发语言·qt
吴梓穆26 分钟前
UE5学习笔记 FPS游戏制作37 蓝图函数库 自己定义公共方法
笔记·学习·ue5
吴梓穆33 分钟前
UE5学习笔记 FPS游戏制作41 世界模式显示UI
笔记·学习·ue5
虾球xz38 分钟前
游戏引擎学习第200天
学习·游戏引擎
Justice link1 小时前
企业级NoSql数据库Redis集群
数据库·redis·缓存
爱的叹息1 小时前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
梅子酱~1 小时前
Vue 学习随笔系列二十二 —— 表格高度自适应
javascript·vue.js·学习
s_little_monster1 小时前
【Linux】进程信号的捕捉处理
linux·运维·服务器·经验分享·笔记·学习·学习方法
XiaoLeisj1 小时前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis