QT编程之数据库开发

一、架构层次

  1. 用户接口层

    • QSqlQueryModel‌:管理SQL查询结果,提供表格数据模型用于展示‌
    • QSqlTableModel‌:支持直接操作数据库表(增删改查)‌
    • QSqlRelationalTableModel‌:支持带外键关联的复杂表操作‌
  2. SQL接口层

    • QSqlDatabase‌:创建和管理数据库连接‌
    • QSqlQuery‌:执行SQL语句和遍历结果集‌
    • QSqlRecord‌:封装数据库记录操作(字段管理)‌
  3. 驱动层
    支持多种数据库驱动插件(QSQLITE、QMYSQL等),通过抽象接口实现跨数据库兼容‌

二、Qt支持的数据库类型

  1. SQLite
    Qt内置支持SQLite数据库,无需额外安装驱动,适合嵌入式和小型应用‌。
  2. MySQL/Oracle/SQL Server
    需安装对应数据库驱动模块(如QMYSQL、QODBC等),支持通过ODBC或原生驱动连接‌。
  3. 其他数据库
    包括PostgreSQL等,需通过QSqlDatabase::drivers()查看当前支持的驱动列表‌。

三、数据库连接步骤

  1. 添加SQL模块
    在项目配置文件(.pro)中添加:QT += sql
  2. 加载驱动并创建连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  // SQLite示例
    db.setDatabaseName("my.db");  // 设置数据库文件路径
    if (!db.open()) {qDebug() << "连接失败:" << db.lastError().text();
    }
  3. 多数据库连接
    通过指定不同连接名实现多个数据库同时操作:
    QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");
    QSqlDatabase db2 = QSqlDatabase::addDatabase("QMYSQL", "connection2");

四、基本数据库操作

  1. 执行SQL语句
    使用QSqlQuery执行增删改查操作:

    QSqlQuery query;
    query.exec("CREATE TABLE user (id INT PRIMARY KEY, name TEXT)");  // 创建表
    query.exec("INSERT INTO user VALUES (1, 'Alice')");               // 插入数据
  2. 查询数据

    if (query.exec("SELECT * FROM user")) {while (query.next()) {int id = query.value("id").toInt();QString name = query.value("name").toString();}
    }
  3. 预处理语句(防SQL注入)

    query.prepare("INSERT INTO user (id, name) VALUES (:id, :name)");
    query.bindValue(":id", 2);
    query.bindValue(":name", "Bob");
    query.exec();

五、高级功能

  1. 事务处理

    db.transaction();
    // 执行多条SQL操作
    if (操作成功) db.commit();
    else db.rollback();
  2. 模型-视图架构
    使用QSqlTableModelQSqlQueryModel实现数据与UI组件的绑定:

    QSqlTableModel *model = new QSqlTableModel(this);
    model->setTable("user");
    model->select();
    tableView->setModel(model);

六、注意事项

  1. 驱动兼容性
    确保目标平台已安装对应数据库驱动(如Windows需libmysql.dll)‌。
  2. 错误处理
    通过QSqlError捕获并处理数据库操作中的异常‌。
  3. 性能优化
    批量操作建议使用事务,避免频繁打开/关闭连接‌。
  4. 中文乱码
    在连接字符串中添加 ;Charset=UTF8;,确保数据库字段使用 NVARCHAR。

七、MS SQL SERVER

在Qt中操作Microsoft SQL Server,你可以使用多种方法,包括使用ODBC(Open Database Connectivity)连接,或者使用专门的库如QODBC或QSqlServer(如果你使用的是Qt 5或更高版本,并且有对应的插件)。以下是两种常见的方法:

方法1:使用QODBC

1)确保你的系统安装了ODBC驱动:
对于Windows,通常SQL Server ODBC驱动已经预装。你可以在ODBC数据源管理器中检查这一点。
2)在Qt项目中配置ODBC连接:
如果你使用的是Qt 5或更高版本,并且你的系统上安装了SQL Server ODBC驱动,你可以直接使用QODBC驱动。
3)连接数据库代码:

#include <QSqlDatabase>
#include <QDebug>int main() {QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");db.setHostName("你的服务器名"); // 例如 localhost 或 IP 地址db.setDatabaseName("你的数据库名");db.setUserName("你的用户名");db.setPassword("你的密码");if (!db.open()) {qDebug() << "无法打开数据库:" << db.lastError().text();return -1;}qDebug() << "数据库连接成功!";// 执行查询等操作...return 0;
}
方法2:使用QSqlServer

如果你使用的是Qt 5.7或更高版本,可以直接使用QSqlServer驱动,而无需ODBC。
1)确保你的Qt版本支持QSqlServer:
2)连接数据库代码:

#include <QSqlDatabase>
#include <QDebug>int main() {QSqlDatabase db = QSqlDatabase::addDatabase("QSQLSERVER");db.setHostName("你的服务器名"); // 例如 localhost 或 IP 地址 (对于本地服务器可以留空)db.setDatabaseName("你的数据库名"); // 不需要加前缀例如"数据库名"而不是"Driver={SQL Server};Server=服务器名;Database=数据库名;"db.setUserName("你的用户名");db.setPassword("你的密码");if (!db.open()) {qDebug() << "无法打开数据库:" << db.lastError().text();return -1;}qDebug() << "数据库连接成功!";// 执行查询等操作...return 0;
}

完整实例代码:

1)数据库连接类 DatabaseManager.h

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>class DatabaseManager {
public:static bool connect() {QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");QString connectionString = "DRIVER={SQL Server};""SERVER=YourPC\\YourInstance;"  // 命名实例写法"DATABASE=TestDB;""UID=sa;""PWD=YourPassword;";db.setDatabaseName(connectionString);if (!db.open()) {qDebug() << "连接失败:" << db.lastError().text();return false;}qDebug() << "数据库连接成功!";return true;}static void disconnect() {QSqlDatabase::database().close();}
};

连接字符串示例

"DRIVER={SQL Server};SERVER=MyPC\\MyInstance,5000;DATABASE=MyDB;UID=sa;PWD=123456;"

2)主窗口类 MainWindow.cpp(含增删改查、事务处理)

#include "MainWindow.h"
#include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);DatabaseManager::connect(); // 初始化连接loadDataToTable(); // 加载数据到表格
}MainWindow::~MainWindow() {DatabaseManager::disconnect();delete ui;
}// 加载数据到表格
void MainWindow::loadDataToTable() {QSqlQuery query;query.exec("SELECT * FROM Users");ui->tableWidget->setRowCount(0);while (query.next()) {int row = ui->tableWidget->rowCount();ui->tableWidget->insertRow(row);ui->tableWidget->setItem(row, 0, new QTableWidgetItem(query.value("ID").toString()));ui->tableWidget->setItem(row, 1, new QTableWidgetItem(query.value("Name").toString()));ui->tableWidget->setItem(row, 2, new QTableWidgetItem(query.value("Age").toString()));}
}// 添加用户
void MainWindow::on_btnAdd_clicked() {QSqlQuery query;query.prepare("INSERT INTO Users (Name, Age) VALUES (?, ?)");query.addBindValue(ui->txtName->text());query.addBindValue(ui->txtAge->text().toInt());if (!query.exec()) {qDebug() << "插入失败:" << query.lastError().text();} else {loadDataToTable(); // 刷新表格}
}// 删除用户
void MainWindow::on_btnDelete_clicked() {int selectedRow = ui->tableWidget->currentRow();if (selectedRow == -1) return;QString id = ui->tableWidget->item(selectedRow, 0)->text();QSqlQuery query;query.prepare("DELETE FROM Users WHERE ID = ?");query.addBindValue(id);if (!query.exec()) {qDebug() << "删除失败:" << query.lastError().text();} else {loadDataToTable(); // 刷新表格}
}// 执行事务处理示例
void MainWindow::on_btnTransaction_clicked() {QSqlDatabase::database().transaction(); // 开启事务QSqlQuery query;query.exec("UPDATE Users SET Age = Age + 1 WHERE Name = 'Alice'");query.exec("UPDATE Users SET Age = Age - 1 WHERE Name = 'Bob'");if (query.lastError().isValid()) {QSqlDatabase::database().rollback(); // 回滚qDebug() << "事务执行失败,已回滚";} else {QSqlDatabase::database().commit(); // 提交qDebug() << "事务执行成功";}
}

八、MY SQL

1)数据库连接类 DatabaseManager.h

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>class DatabaseManager {
public:static bool connect() {QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");    // MySQL 服务器地址db.setPort(3306);               // MySQL 默认端口db.setDatabaseName("TestDB");   // 数据库名db.setUserName("qtuser");       // 用户名db.setPassword("123456");       // 密码if (!db.open()) {qDebug() << "连接失败:" << db.lastError().text();return false;}qDebug() << "数据库连接成功!";return true;}static void disconnect() {QSqlDatabase::database().close();}
};

2)主窗口类 MainWindow.cpp(含增删改查、事务处理)

#include "MainWindow.h"
#include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);DatabaseManager::connect();loadDataToTable();  // 初始化加载数据
}MainWindow::~MainWindow() {DatabaseManager::disconnect();delete ui;
}// 加载数据到表格
void MainWindow::loadDataToTable() {QSqlQuery query("SELECT * FROM Users");ui->tableWidget->setRowCount(0);while (query.next()) {int row = ui->tableWidget->rowCount();ui->tableWidget->insertRow(row);ui->tableWidget->setItem(row, 0, new QTableWidgetItem(query.value("ID").toString()));ui->tableWidget->setItem(row, 1, new QTableWidgetItem(query.value("Name").toString()));ui->tableWidget->setItem(row, 2, new QTableWidgetItem(query.value("Age").toString()));}
}// 添加用户
void MainWindow::on_btnAdd_clicked() {QSqlQuery query;query.prepare("INSERT INTO Users (Name, Age) VALUES (?, ?)");query.addBindValue(ui->txtName->text());query.addBindValue(ui->txtAge->text().toInt());if (!query.exec()) {qDebug() << "插入失败:" << query.lastError().text();} else {loadDataToTable();  // 刷新表格}
}// 删除用户
void MainWindow::on_btnDelete_clicked() {int row = ui->tableWidget->currentRow();if (row == -1) return;QString id = ui->tableWidget->item(row, 0)->text();QSqlQuery query;query.prepare("DELETE FROM Users WHERE ID = ?");query.addBindValue(id);if (!query.exec()) {qDebug() << "删除失败:" << query.lastError().text();} else {loadDataToTable();  // 刷新表格}
}// 更新用户年龄
void MainWindow::on_btnUpdate_clicked() {int row = ui->tableWidget->currentRow();if (row == -1) return;QString id = ui->tableWidget->item(row, 0)->text();int newAge = ui->txtNewAge->text().toInt();QSqlQuery query;query.prepare("UPDATE Users SET Age = ? WHERE ID = ?");query.addBindValue(newAge);query.addBindValue(id);if (!query.exec()) {qDebug() << "更新失败:" << query.lastError().text();} else {loadDataToTable();  // 刷新表格}
}void MainWindow::on_btnTransaction_clicked() {QSqlDatabase::database().transaction();  // 开启事务QSqlQuery query;query.exec("UPDATE Users SET Age = Age + 1 WHERE Name = 'Alice'");query.exec("UPDATE Users SET Age = Age - 1 WHERE Name = 'Bob'");if (query.lastError().isValid()) {QSqlDatabase::database().rollback();qDebug() << "事务回滚!";} else {QSqlDatabase::database().commit();qDebug() << "事务提交!";}
}

九、SQLITE

1)数据库连接类 DatabaseManager.h

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QStandardPaths>class DatabaseManager {
public:static bool connect() {// 数据库文件路径(自动创建)QString dbPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/mydatabase.db";QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(dbPath);if (!db.open()) {qDebug() << "连接失败:" << db.lastError().text();return false;}qDebug() << "数据库连接成功!路径:" << dbPath;// 自动建表createTables();return true;}static void createTables() {QSqlQuery query;query.exec("CREATE TABLE IF NOT EXISTS Users (""ID INTEGER PRIMARY KEY AUTOINCREMENT,""Name TEXT NOT NULL,""Age INTEGER)");if (query.lastError().isValid()) {qDebug() << "建表失败:" << query.lastError().text();}}static void disconnect() {QSqlDatabase::database().close();}
};

2)主窗口类 MainWindow.cpp(含增删改查、事务处理)

#include "MainWindow.h"
#include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);DatabaseManager::connect();loadDataToTable();  // 初始化加载数据
}MainWindow::~MainWindow() {DatabaseManager::disconnect();delete ui;
}// 加载数据到表格
void MainWindow::loadDataToTable() {QSqlQuery query("SELECT * FROM Users");ui->tableWidget->setRowCount(0);while (query.next()) {int row = ui->tableWidget->rowCount();ui->tableWidget->insertRow(row);ui->tableWidget->setItem(row, 0, new QTableWidgetItem(query.value("ID").toString()));ui->tableWidget->setItem(row, 1, new QTableWidgetItem(query.value("Name").toString()));ui->tableWidget->setItem(row, 2, new QTableWidgetItem(query.value("Age").toString()));}
}// 添加用户
void MainWindow::on_btnAdd_clicked() {QSqlQuery query;query.prepare("INSERT INTO Users (Name, Age) VALUES (:name, :age)");query.bindValue(":name", ui->txtName->text());query.bindValue(":age", ui->txtAge->text().toInt());if (!query.exec()) {qDebug() << "插入失败:" << query.lastError().text();} else {loadDataToTable();  // 刷新表格}
}// 删除用户
void MainWindow::on_btnDelete_clicked() {int row = ui->tableWidget->currentRow();if (row == -1) return;QString id = ui->tableWidget->item(row, 0)->text();QSqlQuery query;query.prepare("DELETE FROM Users WHERE ID = ?");query.addBindValue(id);if (!query.exec()) {qDebug() << "删除失败:" << query.lastError().text();} else {loadDataToTable();  // 刷新表格}
}// 更新用户年龄
void MainWindow::on_btnUpdate_clicked() {int row = ui->tableWidget->currentRow();if (row == -1) return;QString id = ui->tableWidget->item(row, 0)->text();int newAge = ui->txtNewAge->text().toInt();QSqlQuery query;query.prepare("UPDATE Users SET Age = ? WHERE ID = ?");query.addBindValue(newAge);query.addBindValue(id);if (!query.exec()) {qDebug() << "更新失败:" << query.lastError().text();} else {loadDataToTable();  // 刷新表格}
}// 批量插入数据(事务加速)
void MainWindow::on_btnBatchInsert_clicked() {QSqlDatabase::database().transaction();  // 开启事务QSqlQuery query;query.prepare("INSERT INTO Users (Name, Age) VALUES (?, ?)");for (int i = 0; i < 1000; ++i) {query.addBindValue("User_" + QString::number(i));query.addBindValue(20 + i % 10);query.exec();}if (query.lastError().isValid()) {QSqlDatabase::database().rollback();qDebug() << "批量插入失败,已回滚";} else {QSqlDatabase::database().commit();qDebug() << "批量插入成功,耗时优化 10x+";loadDataToTable();}
}

十、ORACLE

在使用Qt进行Oracle数据库操作时,通常有两种方法比较常见:使用Oracle的OCI(Oracle Call Interface)或者使用ODBC(Open Database Connectivity)。下面我将详细介绍如何使用这两种方法在Qt应用程序中操作Oracle数据库。

方法1:使用OCI

Oracle Call Interface (OCI) 是Oracle提供的一套C语言API,用于访问Oracle数据库。要在Qt中使用OCI,你需要先确保你的系统上安装了Oracle的客户端库和头文件,并且你的项目需要链接到这些库。
步骤:
1)Oracle 客户端安装
下载 Oracle Instant Client 的 ‌Basic‌ 和 ‌SDK‌ 包(需与 Qt 编译器位数一致)‌。解压到目录如 C:\oracle\instantclient_12_2,将 oci.dll 所在路径加入系统环境变量 PATH

2)Qt OCI 驱动编译

cd Qt/6.5.0/Src/qtbase/src/plugins/sqldrivers/oci
qmake "INCLUDEPATH+=C:/oracle/instantclient_12_2/sdk/include" "LIBS+=-LC:/oracle/instantclient_12_2 -loci"
nmake  # 或make

编译生成的 qsqloci.dll 需复制到 Qt/6.5.0/mingw_64/plugins/sqldrivers
3)在Qt项目中包含头文件和链接库:

#include <oci.h>

4) 在.pro文件中添加链接器选项:

QT += core gui sql
CONFIG += c++17# 配置 Oracle 库路径
win32 {LIBS += -LC:/oracle/instantclient_12_2 -lociINCLUDEPATH += C:/oracle/instantclient_12_2/sdk/include
}

‌完整实例代码:

1)数据库连接类 OracleManager.h

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>class OracleManager {
public:static bool connect(const QString &serviceName) {QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");db.setHostName("192.168.1.100");        // Oracle 服务器 IPdb.setPort(1521);                       // 默认端口db.setDatabaseName(serviceName);        // 服务名(非 SID)db.setUserName("scott");                // 用户名db.setPassword("tiger");                // 密码if (!db.open()) {qDebug() << "[ERROR] 连接失败:" << db.lastError().text() << "‌:ml-citation{ref="1,6" data="citationList"}";return false;}qDebug() << "数据库连接成功!";return true;}static void disconnect() {QSqlDatabase::database().close();}
};

2)主窗口类 MainWindow.cpp(含增删改查、事务处理)

// 创建表
void MainWindow::createTable() {QSqlQuery query;query.exec("CREATE TABLE Employees (""EmpID NUMBER PRIMARY KEY,""Name NVARCHAR2(50),""Salary NUMBER(10,2))");if(query.lastError().isValid()) qDebug() << "建表错误:" << query.lastError().text() << "‌:ml-citation{ref="8" data="citationList"}";
}// 插入数据(绑定参数)
void MainWindow::onInsertClicked() {QSqlQuery query;query.prepare("INSERT INTO Employees (EmpID, Name, Salary) VALUES (:id, :name, :sal)");query.bindValue(":id", 1001);query.bindValue(":name", "张三");query.bindValue(":sal", 8500.50);if (!query.exec()) qDebug() << "插入失败:" << query.lastError().text() << "‌:ml-citation{ref="3,6" data="citationList"}";
}// 查询数据(事务处理)
void MainWindow::onQueryClicked() {QSqlDatabase::database().transaction();QSqlQuery query("SELECT * FROM Employees");while (query.next()) {int id = query.value("EmpID").toInt();QString name = query.value("Name").toString();double salary = query.value("Salary").toDouble();// 显示到 UI...}if (query.lastError().isValid()) {QSqlDatabase::database().rollback();qDebug() << "事务回滚!" << "‌:ml-citation{ref="8" data="citationList"}";} else {QSqlDatabase::database().commit();}
}
    方法2:使用ODBC

    ODBC提供了一个数据库无关的应用程序编程接口(API),允许应用程序通过ODBC驱动程序与数据库进行通信。Qt提供了对ODBC的支持,可以通过QSqlDatabaseQSqlQuery类来操作。

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setHostName("hostname"); // 通常是localhost或服务器地址
    db.setDatabaseName("DSN_NAME"); // 数据源名称,在ODBC中配置的DSN名称
    db.setUserName("username");
    db.setPassword("password");if (db.open()) {QSqlQuery query(db);query.exec("SELECT * FROM your_table");while (query.next()) {// 处理查询结果...}db.close();
    } else {qDebug() << "Database connection failed";
    }

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

    如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    AI学习——卷积神经网络(CNN)入门

    作为人类&#xff0c;我们天生擅长“看”东西&#xff1a;一眼就能认出猫狗、分辨红绿灯、读懂朋友的表情……但计算机的“眼睛”最初是一片空白。直到卷积神经网络&#xff08;CNN&#xff09;​的出现&#xff0c;计算机才真正开始理解图像。今天&#xff0c;我们就用最通俗的…

    2025年渗透测试面试题总结- shopee-安全工程师(题目+回答)

    网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 shopee-安全工程师 信息安全相关Response头详解 1. 关键安全头及防御场景 Linux与Docker核心命令速查…

    IntelliJ IDEA 中 Maven 的 `pom.xml` 变灰带横线?一文详解解决方法

    前言 在使用 IntelliJ IDEA 进行 Java 开发时&#xff0c;如果你发现项目的 pom.xml 文件突然变成灰色并带有删除线&#xff0c;这可能是 Maven 的配置或项目结构出现了问题。 一、问题现象与原因分析 现象描述 文件变灰&#xff1a;pom.xml 在项目资源管理器中显示为灰色。…

    Spring MVC 接口数据

    访问路径设置 RequestMapping("springmvc/hello") 就是用来向handlerMapping中注册的方法注解! 秘书中设置路径和方法的对应关系&#xff0c;即RequestMapping("/springmvc/hello")&#xff0c;设置的是对外的访问地址&#xff0c; 路径设置 精准路径匹…

    技术分享 | MySQL内存使用率高问题排查

    本文为墨天轮数据库管理服务团队第51期技术分享&#xff0c;内容原创&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 &#xff1a;8.0.…

    【redis】什么是持久化之 RDB

    什么是持久化 MySQL 的事务&#xff0c;有四个比较核心的特性&#xff1a; 原子性一致性持久性>持久化&#xff08;说的一回事&#xff09; 把数据存储在硬盘上>持久把数据存在内存上>不持久重启进程/重启主机之后&#xff0c;数据是否还存在 隔离性 Redis 是一个内存…

    Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

    参加数学建模比赛时&#xff0c;很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景&#xff0c;往往要求我们制作与地图相关的可视化内容。如下图&#xff0c;这是21年亚太赛的那道塞罕坝的题目&#xff0c;期间涉及到温度、降水和森林覆盖率…

    Python(冒泡排序、选择排序、插入法排序、快速排序,算法稳定性)

    算法的稳定性 冒泡排序 # 冒泡排序 # 1 思想: 相邻位置两个元素比较, 前面的元素比后面的元素大则交换, 把最大的数给找到 # 经过一轮一轮的比较最终把序列给排序 # 2 关键点1: 两层for循环 外层循环控制多少轮 内层for循环控制比较次数 # 3 关键点2: 若遍历一遍没有数字…

    【自用】NLP算法面经(5)

    一、L1、L2正则化 正则化是机器学习中用于防止过拟合并提高模型泛化能力的技术。当模型过拟合时&#xff0c;它已经很好地学习了训练数据&#xff0c;甚至是训练数据中的噪声&#xff0c;所以可能无法在新的、未见过的数据上表现良好。 比如&#xff1a; 其中&#xff0c;x1和…

    PyCharm安装redis,python安装redis,PyCharm使用失败问题

    报错信息 Usage: D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] -r [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip instal…

    学习笔记|arduino uno r3|DS1307时钟芯片|Atmega328P| 设置时间|读取时间|无源晶振:DS1307时钟芯片实验

    目录 芯片pinout&#xff1a; 实验器件&#xff1a; 实验连线 解决AVR 架构不支持 printf() 方法 使用GetTimeAndDate.ino设置时间&#xff1a; 使用SetTimeAndDate.ino设置时间&#xff1a; 芯片pinout&#xff1a; DS1307 是美国 DALLAS 公司推出的 I 总线接口实时时钟芯…

    uniapp可拖拽消息数徽标draggable-badge,仿手机qq聊天列表未读数徽标动效

    组件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id22679 兼容性&#xff1a; 测试了h5和微信小程序&#xff0c;理论支持全平台&#xff0c;暂不支持pc端&#xff0c;不过可以自己修改事件兼容pc 使用uniapp仿写了一个手机qq聊天列表右侧未读数的徽标组件&#x…

    【设计模式】策略模式

    以下是格式优化后的Markdown文档&#xff0c;仅调整代码缩进&#xff0c;保持内容不变&#xff1a; 四、策略模式 策略(Strategy) 模式是一种行为型模式&#xff0c;其实现过程与模板方法模式非常类似——都 是以扩展的方式支持未来的变化。本章通过对一个具体范例的逐步重构…

    STM32配套程序接线图

    1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…

    【C语言】使用结构体实现位段

    一、位段 前面我们学习了结构体&#xff0c;位段的声明和结构体是一样的&#xff0c;其区别如下&#xff1a; 1、位段的成员必须是int 、unsigned int 、signed int 、在C99中位段的成员的类型也可以选择其他类型。 2、位段的成员名后边有一个冒号和一个数字 如下&#xff…

    【大模型系列篇】硅基智能开源数字人模型HeyGem.ai,开启数字人时刻

    硅基智能开源数字人模型HeyGem.ai, 1秒克隆生成4K视频, 支持离线多语言, 开源72小时狂揽1.3k星, 目前已经获得3.4k星。 硅基智能正式宣布在GitHub开源全球TOP级数字人模型&#xff0c;同时发布基于该模型的同名数字人工具硅基数字人克隆的本地安装包&#xff0c;这一举措标志着…

    【C++】STL库面试常问点

    STL库 什么是STL库 C标准模板库&#xff08;Standard Template Libiary&#xff09;基于泛型编程&#xff08;模板&#xff09;&#xff0c;实现常见的数据结构和算法&#xff0c;提升代码的复用性和效率。 STL库有哪些组件 STL库由以下组件构成&#xff1a; ● 容器&#xf…

    knowledge-微前端(多个前端应用聚合的一个应用架构体系,每个小的应用可独立运行,独立开发,独立部署上线)

    1.前言 微前端&#xff0c;将一个大的前端应用拆分为多个小型的&#xff0c;独立开发的前端应用&#xff0c;每一个小型的应用都可以单独的开发&#xff0c;部署和运行。这种结构允许不同的团队使用不同的技术栈来开发应用的不同部分&#xff0c;提高开发的效率与灵活性。 2.实…

    三格电子PLC数据采集网关-工业互联的智能枢纽

    在工业自动化领域&#xff0c;设备间的数据互通与协议兼容是核心挑战之一。三格电子推出的PLC据采集网关SG-PLC-Private&#xff0c;凭借其多协议兼容、高稳定性和灵活配置能力&#xff0c;成为工业物联网&#xff08;IIoT&#xff09;中实现设备互联的关键设备。本文将从产品功…

    鸿蒙NEXT项目实战-百得知识库05

    代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…