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

news2024/9/20 18:54:51

参考引用

  • SQLite 权威指南(第二版)
  • SQLite3 入门

1. 创建连接执行 sql 语句

在这里插入图片描述

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

1.1 main.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

#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

#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

#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

#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 样式

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 模块)

#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

#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

#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

#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

#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

#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

#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

#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

#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 数据库事务机制

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

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

6.1 main.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

#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

#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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1238496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vite构建项目不能使用require解决方案

在utils文件夹下创建一个getImgUrl.ts文件 /** vite的特殊性, 需要处理图片 */ export const require (imgPath: string) > {try {const handlePath imgPath.replace(, ..)console.log(handlePath::, imgPath)return new URL(handlePath, import.meta.url).href} catch (…

微信怎么设置自动回复?

自动回复的用处 微信自动回复可以提高沟通效率。当你无法立即回复消息时&#xff0c;设置自动回复可以让对方知道你的情况&#xff0c;并且不会因为长时间没有回复而产生误解或不满。 微信自动回复可以节省时间和精力。如果你经常收到类似的询问或回复&#xff0c;通过设置自动…

Linux常用操作 Vim一般使用 SSH介绍 SSH密钥登录

目录 1. 常用命令 2. vim一般使用 3. SSH介绍 4. ssh密钥登录 1. 常用命令 1&#xff09;# 与 $ 提示的区别 # 表示用户有root权限&#xff0c;一般的以root用户登录提示符为#&#xff0c; $提示符表示用户为普通用户 2&#xff09;ifconfig 查看ip地址 eno1: 代表由主板…

【C++11并发】future库 笔记

简介 C11之前&#xff0c;主线程要想获取子线程的返回值&#xff0c;一般都是通过全局变量&#xff0c;或者类似机制。C11开始为我们提供了一组方法来获取子线程的返回值&#xff0c;并保证其原子性。 头文件 #include <future>std::promise 在promise中保存了一个值…

【github】初学者使用指南

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

DependencyProperty.Register:wpf 向别的xaml传递参数

一.使用背景&#xff1a;在A.xaml中嵌入B.xaml&#xff0c;并且向B.xaml传递参数。 函数介绍&#xff1a; public static DependencyProperty Register(string name, Type propertyType, Type ownerType );name&#xff08;string&#xff09;&#xff1a; 依赖属性的名称。在…

2023 IDEA大会开幕 共探AI新篇章下的技术创新与创业

11月22日&#xff0c;AI与数字经济领域一年一度的科创盛会&#xff0c;2023 IDEA大会在深圳举行。IDEA研究院创院理事长、美国国家工程院外籍院士沈向洋在会上发表主旨演讲&#xff0c;发布IDEA研究院的重磅研产结晶与市场化成果&#xff1b;在大咖云集的论坛环节&#xff0c;多…

【大数据Hive】hive 优化策略之job任务优化

目录 一、前言 二、hive执行计划 2.1 hive explain简介 2.1.1 语法格式 2.1.2 查询计划阶段说明 2.2 操作演示 2.2.1 不加条件的查询计划分析 2.2.2 带条件的查询计划分析 三、MapReduce属性优化 3.1 本地模式 3.1.1 本地模式参数设置 3.1.2 本地模式操作演示 3.2 …

Oracle:poor sql导致的latch: cache buffers chains案例

巡检时&#xff0c;执行如下sql发现长会话&#xff1a; SELECT SE.SID,SE.SERIAL#,TO_CHAR(LOGON_TIME,YYYY-MM-DD HH24:MI:SS),SE.STATUS,SE.OSUSER,SE.MACHINE,SE.PROGRAM,SE.BLOCKING_SESSION, SE.SQL_ID,SE.PREV_SQL_ID ,SE.EVENT,SE.P1TEXT,SE.P1,SE.P2TEXT,SE.P2,SE.P3…

神经网络中BN层简介及位置分析

1. 简介 Batch Normalization是深度学习中常用的技巧&#xff0c;Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (Ioffe and Szegedy, 2015) 第一次介绍了这个方法。 这个方法的命名&#xff0c;明明是Standardization, 非…

PowerQuery领域的经典之作“猴子书“中文版来啦!

与数据打交道&#xff0c;还在纠结于Excel、SQL、VBA、Python&#xff1f;数据处理领域经典之作PowerQuery"猴子书"让你用更聪明的方法处理数据。学完这本书&#xff0c;你就掌握了Power Query的一切&#xff0c;想要学Power Query&#xff0c;只需要这一本就够啦&am…

提升企业人效,从精细化考勤管理开始

过去&#xff0c;许多企业提到考勤管理&#xff0c;只能关联到打卡、请假、算薪这些简单的事务性流程。随着越来越多企业希望通过数字化转型来提升运营效率&#xff0c;实现精细化人员管理。考勤数据的作用也不再仅限于算薪&#xff0c;而是成为了企业分析人效的关键因子。因此…

飞瓜数据B站丨B站UP主11月第3周榜单排行榜榜单(B站平台)发布!

飞瓜轻数发布2023年11月13日-11月19日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营…

LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」

原文&#xff1a;LangChain: 类似 Flask/FastAPI 之于 Django&#xff0c;LangServe 就是「LangChain 自己的 FastAPI」 - 知乎 说明&#xff1a;LangServe代替 langchainserver 成为新的langchain 部署工具 官网资料&#xff1a;&#x1f99c;️&#x1f3d3; LangServe | &…

智慧物流仓储仓库温湿度管理采集器钡铼技术远程终端RTU的使用

智慧物流仓储是当今物流行业的一个重要发展方向&#xff0c;它通过应用先进的技术和设备&#xff0c;实现对仓储环境的监控和管理。在智慧物流仓储中&#xff0c;温湿度管理是十分关键的一项工作。为了解决温湿度管理的问题&#xff0c;采集器钡铼技术远程终端RTU被广泛应用于仓…

未来制造业的新引擎:工业机器人控制解决方案

制造业正经历着一场革命性的变革 在这个变革的浪潮中&#xff0c;工业机器人成为推动制造业高效生产的关键力量。然而&#xff0c;要发挥机器人的最大潜力&#xff0c;一个强大而智能的控制系统是必不可少的。在这个领域&#xff0c;新一代的工业机器人控制解决方案正崭露头角&…

Linux:进度条(小程序)以及git三板斧

Linux小程序&#xff1a;进度条 在实现小程序前我们要弄清楚&#xff1a; 1.缓冲区&#xff1b; 2.回车与换行。 缓冲区&#xff1a; 分别用gcc来编译下面两个程序&#xff1a; 程序一&#xff1a; #include <stdio.h> int main() { printf("hello Makefil…

【云原生-Kurbernetes篇】 玩转K8S不得不会的HELM

Helm 一、Helm1.1 使用背景1.2 Helm简介1.3 Helm的几个概念1.4 helm2 和 helm3 的区别1.5 chart包的关键组成 二、Helm相关命令2.1 应用管理操作2.2 Helm repository仓库管理命令2.2 Helm chart包管理命令2.3 Helm release(实例) 管理命令2.4 Helm私有仓库管理命令 三、部署He…

代码混淆不再愁:一篇掌握核心技巧

​ 1. 概述 代码混淆是将计算机程序的代码转换成一种功能上等价&#xff0c;但是难以阅读和理解的形式。 对于软件开发者来说&#xff0c;代码混淆可以在一定程度上保护程序免被逆向。 对于逆向工程师来说&#xff0c;学习代码混淆可以帮助我们研究反混淆技术。 2. 常见混淆…