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


    参考引用

    1. 创建连接执行 sql 语句

    在这里插入图片描述

    • 在 Qt 中使用数据库要在工程文件中添加
      QT += sql
      
      • 1

    1.1 main.cpp

    #include "createsqlapp.h"
    #include 
    #include 
    #include 
    #include 
    
    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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    1.2 createsqlapp.h

    #ifndef CREATESQLAPP_H
    #define CREATESQLAPP_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    1.3 createsqlapp.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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    1.4 createsqlapp.ui

    在这里插入图片描述

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

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

    • 注册
      在这里插入图片描述

    • 登录
      在这里插入图片描述

    2.1 main.cpp

    #include "loginsqlite.h"
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    2.2 loginsqlite.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");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    2.3 loginsqlite.ui

    在这里插入图片描述

    2.4 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

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

    在这里插入图片描述

    在这里插入图片描述

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

    #include "muldatabaseapp.h"
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    3.2 muldatabaseapp.h

    #ifndef MULDATABASEAPP_H
    #define MULDATABASEAPP_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    3.3 muldatabaseapp.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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    3.4 muldatabaseapp.ui

    在这里插入图片描述

    4. Qt 数据库增删改查

    • 设计一个存储 QLabel 的样式
      在这里插入图片描述

    4.1 main.cpp

    #include "labelstylesql.h"
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    4.2 labelstylesql.h

    #ifndef LABELSTYLESQL_H
    #define LABELSTYLESQL_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    4.3 labelstylesql.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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    4.4 labelstylesql.ui

    在这里插入图片描述

    5. Qt 数据库绑定机制

    在这里插入图片描述

    在这里插入图片描述

    5.1 main.cpp

    #include "sqlquerybindapp.h"
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    5.2 sqlquerybindapp.h

    #ifndef SQLQUERYBINDAPP_H
    #define SQLQUERYBINDAPP_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    5.3 sqlquerybindapp.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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    5.4 sqlquerybindapp.ui

    在这里插入图片描述

    6. Qt 数据库事务机制

    bool QSqlDatabase::transaction()  // 开启事务---begin
    bool QSqlDatabase::commit()       // 提交事务---commit
    bool QSqlDatabase::rollback()     // 事务回滚---rollback
    
    • 1
    • 2
    • 3
    • 点击开启事务后所有对数据库的操作都在内存中进行,只有点提交事务后才会同步到数据库中
      在这里插入图片描述

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

    6.1 main.cpp

    #include "sqlquerybindapp.h"
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    6.2 transactionapp.h

    #ifndef TRANSACTIONAPP_H
    #define TRANSACTIONAPP_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    6.3 transactionapp.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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    6.4 transactionapp.ui

    在这里插入图片描述

  • 相关阅读:
    在 Kubernetes 上部署 DM
    功利点没啥!
    CUDA学习笔记(七)Kernel性能调节
    UE5 运行时生成距离场数据
    sql 注入(1), union 联合注入
    计算机网络之概述
    详解uniapp的生命周期 ~ 解惑 实用 ~
    FFT专题:IFFT后信号如何重建
    安装配置Anaconda3
    我用chatgpt写了一款程序
  • 原文地址:https://blog.csdn.net/qq_42994487/article/details/134559373