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

相关推荐
代码小鑫14 分钟前
A046-基于SpringBoot的论坛系统的设计与实现
java·开发语言·数据库·spring boot·毕业设计
King.62423 分钟前
sql工具!好用!爱用!
大数据·数据库·人工智能·sql·学习
寻找沙漠的人1 小时前
MySQL 索引·事务
数据库·mysql
wenyue11211 小时前
云原生开发框架
数据库·云原生
一只小菜鸡..1 小时前
241125学习日志——[CSDIY] [InternStudio] 大模型训练营 [17]
学习
TPCloud1 小时前
AIX下crs-5005 ip address is aready in use in the network的解决办法
数据库·oracle·crs-5005
安迁岚1 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验八 存储过程
数据库·sql·mysql·oracle
Achou.Wang1 小时前
Redis过期时间和SORT命令的高级用法
数据库·redis·bootstrap
.ccc.。1 小时前
mysql索引失效的五种情况
数据库
许小禾上学记2 小时前
Python 爬虫从入门到(不)入狱学习笔记
爬虫·python·学习