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

参考引用

  • 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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

埃森哲使用 Amazon CodeWhisperer 助力开发人员提高工作效率

Amazon CodeWhisperer 是一款 AI 编程助手&#xff0c;可根据开发人员使用自然语言编写的注释和 IDE&#xff08;集成开发环境&#xff09;中的代码生成建议&#xff0c;帮助开发人员提高工作效率。借助 CodeWhisperer&#xff0c;开发人员无需在 IDE 与文档或开发者论坛之间切…

③【List】Redis常用数据类型: List [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis List ③Redis List 操作命令汇总1. lpus…

UVA11584划分成回文串 Partitioning by Palindromes

划分成回文串 Partitioning by Palindromes 题面翻译 回文子串(palind) 问题描述&#xff1a; 当一个字符串正序和反序是完全相同时&#xff0c;我们称之为“回文串”。例如“racecar”就是一个回文串&#xff0c;而“fastcar”就不是。现在给一个字符串s&#xff0c;把它分…

坚鹏:湖北银行数字化转型背景下银行运营管理创新培训圆满结束

湖北银行正式成立于2011年2月27日&#xff0c;总部设在武汉。现有员工5000余人。营业网点从成立之初的93家增长至241家&#xff0c;实现全省17个市州、59个县域营业网点全覆盖。截至2022年末&#xff0c;全行资产总额4026亿元&#xff0c;存款总额2956亿元&#xff0c;贷款总额…

怎样实现内网穿透?

第一步&#xff1a;cpolar是一种安全的内网穿透云服务&#xff0c;它将内网下的本地服务器通过安全隧道暴露至公网。使得公网用户可以正常访问内网服务。打开网址 cpolar 下载 。 步骤&#xff1a; 打开网站>点击免费试用>创建账号>下载应用一直点下一步下载完成。第…

AIOps探索 | 应急处置中排障的降本增效方法探索(上)

文章来源&#xff1a;公众号ID-布博士&#xff08;擎创科技资深产品专家&#xff09; 哈喽~友友们大家好&#xff0c;最近运维界也是蛮热闹的&#xff0c;前有语雀多次崩溃&#xff0c;后有阿里全系产品集体故障&#xff0c;不管是哪种&#xff0c;都足够逼疯一个运维工程师。…

【Windows 常用工具系列 12 -- win11怎么设置不睡眠熄屏 |win11设置永不睡眠的方法】

文章目录 win11 怎么设置不睡眠熄屏 使用笔记本电脑的时候&#xff0c;如果离开电脑时间稍微长一点就会发现息屏了&#xff0c;下面介绍 设置 Win11 永不睡眠息屏的方法&#xff0c;有需要的朋友们快来看看以下详细的教程。 win11 怎么设置不睡眠熄屏 在电脑桌面上&#xff0c…

【MATLAB源码-第86期】基于matlab的QC-LDPC码性能仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QC-LDPC&#xff08;准循环低密度奇偶校验&#xff09;编码是一种高效的错误校正编码方式&#xff0c;广泛应用于通信系统和数据存储中以提高数据的可靠性。它是低密度奇偶校验&#xff08;LDPC&#xff09;编码的一种特殊形…

Nginx配置Websocket

WebSocket 和HTTP虽然是不同协议&#xff0c;但是两者“握手”方式兼容。通过HTTP升级机制&#xff0c;使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket。 Websocket 使用 ws 或 wss 的统一资源标志符&#xff0c;类似于 HTTPS&#xff0c;其中 wss…

CCF CSP认证 历年题目自练Day49

题目一 此题用暴力枚举做过&#xff08;80分&#xff09;现如今终于用二维前缀和做到满分。 试题编号&#xff1a; 202309-2 试题名称&#xff1a; 坐标变换&#xff08;其二&#xff09; 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 问题…

2.4G无线收发芯片 XL2400P使用手册

XL2400P 系列芯片是工作在 2.400~2.483GHz 世界通用 ISM 频段的单片无线收发芯片。该芯片集成射 频收发机、频率收生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK 的通信模 式。发射输出功率、工作频道以及通信数据率均可配置。芯片已将多颗外…

数字化时代,企业数据治理成熟度如何建设

企业数字化转型不是从0到1&#xff0c;而是从1到100。转型是一个过程&#xff0c;场景从简单到复杂&#xff0c;应用从局部到广泛&#xff0c;持续优化、逐步成长。 数据治理的成熟度评估模型 可以说&#xff0c;几乎所有成熟度模型都借鉴了CMM的思路&#xff0c;基本都是将所…

d3dcompiler_47.dll缺失怎么修复,d3dcompiler_47.dll的作用有哪些

d3dcompiler_47.dll丢失是一种常见的电脑问题。如果你遇到了这个问题&#xff0c;不要惊慌&#xff0c;下面的方法可以帮助你解决。本文将详细介绍解决d3dcompiler_47.dll丢失问题的步骤&#xff0c;让你手把手地学会。 一.解决d3dcompiler_47.dll丢失问题的步骤 解决方法一&a…

JOSEF信号继电器 JX-18A/2 电压 220VAC辅助电源 板后接线

JX-18/2A系列信号继电器 JX-18A/2A1信号继电器&#xff1b; JX-18A/2A2信号继电器&#xff1b; JX-18B /2A1信号继电器; JX-18B/2A2信号继电器; JX-18C/2A1信号继电器; JX-18C/2A2信号继电器; JX-18E/2A1信号继电器; JX-18E/2A2信号继电器; JX-18D/2A1信号继电器; JX…

【擎标】CCID信息系统服务商交付能力等级认证标准

为顺应信息技术服务业发展趋势及市场需求&#xff0c;维护市场秩序&#xff0c;加强行业自律&#xff0c;促进信息系统服务商交付能力的不断提高&#xff0c;增强信息系统服务商创新能力和国际竞争力&#xff0c;支撑信息系统服务商转型提升&#xff0c;中国软件行业协会、企业…

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…

所有产品都值得用AI再做一遍,让AGI与品牌营销双向奔赴

微软 CEO Satya Nadella 曾经说过&#xff1a;“所有的产品都值得用 AI 重做一遍。” AI 大模型的出现&#xff0c;开启了一个全新的智能化时代&#xff0c;重新定义了人机交互。这让生成式 AI 技术变得「触手可得」&#xff0c;也让各行业看到 AGI 驱动商业增长的更大可能性。…

微信怎么设置自动回复?

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

在 vscode 中的json文件写注释,不报错的解决办法

打开 vscode 的「设置」&#xff0c;搜索&#xff1a;files: associations&#xff0c;然后添加 *.json jsonc最后

纳米软件电源芯片测试案例分享:测试方案、仪器选型、解决测试难点

一、背景介绍 成都某半导体芯片公司是一家专注于开发设计半导体电源芯片的高新技术企业&#xff0c;目前企业对于电源管理芯片研发阶段的测试&#xff0c;绝大部分采用人工手动测试&#xff0c;效率低&#xff0c;耗时长&#xff0c;数据管理储存难度大&#xff0c;无法快速地完…