Qt学习记录(15)数据库
目录
前言:
数据库连接
项目文件加上sql
打印查看Qt支持哪些数据库驱动
QMYSQL
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))
数据库插入
头文件.h
源文件.cpp
现象
使用多个数据库时,起名标识和传参数
注意的点
现象
SQL语句
批量插入&odbc风格&占用符号
现象
oracle风格&占位符号&绑定字符不局限顺序
遍历&删除&撤回
现象
QsqlList
新建工程
建立本地数据库
插入表&添加内容&设置字段&遍历&打印
现象
数据库可视化操作
添加数据库到项目工程
model设置模型
指定model使用哪个表&把model设置到tableView并显示数据&把第一个列表改名字
添加行&提交动作
现象
取消&删除
现象
查找
现象
前言:

数据库连接
QT5.12连接MySQL_qt 5.12.12 mysql-CSDN博客
下载Navicat 连接MySQL
项目文件加上sql
每次更改完项目文件都建议执行一遍编译不允许,为了让后面可以检测到
打印查看Qt支持哪些数据库驱动
("QSQLITE", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
QSQLITE:静态数据库(不需要服务器,保存在文件,a.db,类似excel表格),嵌入式常用,C语言开源,提供.h和.c
QODBC,QODBC3:MFC,提供好数据库的接口
QPSQL,QPSQL7:(待补充)
QMYSQL
黑马用的这个,但是我这里没有,那只能去下一个了
QT5.12连接MySQL
Qt安装MYSQL驱动
噢!之前91一个错误原来是因为qt的编译器和mysql的位数对不上,亏我搞了这么就久
mysql的82位,之前编译我用的32位,今天一换64位就得用了
大佬指路:QT连接MySql数据库失败,编译驱动问题,最详细解决办法_
QT连接MySql数据库失败,编译驱动问题,最详细解决办法
ohhhhhhhhhhhhhhhhhh,原来我一直都连接成功了!!但是以后写数据库相关都要用64位的项目配置
等等,黑马打开的那个界面是哪来的
Navicat中MySQL命令列界面操作及基础常用命令_navicat命令列界面怎么运行-CSDN博客
Navicat16安装和激活详细讲解(全网最简单且靠谱)_navicat 16-CSDN博客
原来是Navicat
大悲,Navicat连接不了MYSQL
mysql-8.0.30最新密码重置方法,看这一篇就够了_mysql 8.0忘记初始化密码-CSDN博客
‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件_mysql' 不是内部或外部命令,也不是可运行的程序 或批处理文件。-CSDN博客
Mysql应用安装后找不到my.ini文件_mysql8.0没有my.ini-CSDN博客
几经多折,其实是我密码忘了,位数没对上,最后用重装解决百分之80的问题
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))
数据库插入
头文件.h
源文件.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//打印Qt支持的数据库驱动qDebug()<<QSqlDatabase::drivers();//添加MYSQl数据库QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");//连接数据库db.setHostName("127.0.0.1");//数据库服务器ipdb.setUserName("root");//数据库用户名db.setPassword("123456");//密码db.setDatabaseName("info");//使用哪个数据库//打开数据库if( !db.open() )//数据库打开失败{QMessageBox::warning(this,"错误",db.lastError().text());return;}QSqlQuery query;query.exec("create table student(id int primary key auto_increment,name varchar(255),age int,score int);");//create table student(:这行代码开始创建一个新表,表名为 student。//id int primary key auto_increment,:这行定义了一个名为 id 的列,数据类型为整数(int)。primary key 表示这个列是表的主键,用于唯一地标识表中的每一行。auto_increment 属性表示每当向表中插入新行时,这个列的值会自动增加,从而保证每个 id 的唯一性。//name varchar(255),:这行定义了一个名为 name 的列,数据类型为可变长字符串(varchar),最大长度为255个字符。//age int,:这行定义了一个名为 age 的列,数据类型为整数(int),用于存储学生的年龄。//score int);:这行定义了一个名为 score 的列,数据类型为整数(int),用于存储学生的分数。最后的 ); 表示表定义的结束。}Widget::~Widget()
{delete ui;
}
现象
使用多个数据库时,起名标识和传参数
注意的点
如果不加起名标识,就不需要传参数了
现象
SQL语句
史上超强最常用SQL语句大全-CSDN博客
批量插入&odbc风格&占用符号
//批量插入//odbc风格//预处理语句QSqlQuery query;// ? 相当于 占用符号query.prepare("insert into student(name,age,score) values(?,?,?);");//给字段设置内容 listQVariantList nameList;nameList <<"小黄"<<"小劳"<<"小白";QVariantList ageList;ageList << 11 << 22 << 33;QVariantList scoreList;scoreList << 59 << 69 << 79;//给字段绑定相应的值,按顺序绑定query.addBindValue(nameList);query.addBindValue(ageList);query.addBindValue(scoreList);//执行预处理命令query.execBatch();//批量插入
现象
记得在表格内点击刷新
oracle风格&占位符号&绑定字符不局限顺序
//oracle风格//占位符号 : 自定义名query.prepare("insert into student(name,age,score) values(:name,:age,:score);");//给字段设置内容 listQVariantList nameList;nameList <<"ad"<<"fs"<<"xcv";QVariantList ageList;ageList << 77 << 88 << 11;QVariantList scoreList;scoreList << 55 << 66 << 41;//给字段绑定,不局限于顺序query.bindValue(":name",nameList);query.bindValue(":score",scoreList);query.bindValue(":age",ageList);//执行预处理命令query.execBatch();//批量插入
遍历&删除&撤回
query.exec("select * from student where name ='ad'");while( query.next()) //一行一行遍历{//取出当前行的内容qDebug()<< query.value(0).toInt()<< query.value(1).toString()<< query.value("age").toInt()<< query.value("score").toInt();}void Widget::on_ButtonDel_clicked()
{//获取行编辑QString name = ui->lineEdit->text();QString sql = QString("delete from student where name = '%1'").arg(name);//开始一个事务QSqlDatabase ::database().transaction();//获取当前操作的是哪个数据库QSqlQuery query;query.exec(sql);
}void Widget::on_ButtonSure_clicked()
{//确定删除QSqlDatabase ::database().commit();//获取当前操作的是哪个数据库
}void Widget::on_ButtonCtrlZ_clicked()
{//回滚,撤销QSqlDatabase ::database().rollback();//获取当前操作的是哪个数据库
}
现象
QsqlList
新建工程
建立本地数据库
txt文件改名字即可
插入表&添加内容&设置字段&遍历&打印
//打印Qt支持的数据库驱动qDebug()<<QSqlDatabase::drivers();//添加QSQLITE数据库QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//QSqlite不能够自动累加,不可用auto_incnement//设置数据库db.setDatabaseName("../info.db");//打开数据库if( !db.open() )//数据库打开失败{QMessageBox::warning(this,"错误",db.lastError().text());return;}QSqlQuery query;query.exec("create table student(""id int primary key,""name varchar(255),""age int,""score int);");query.prepare("insert into student(name,age,score) values(?,?,?);");//给字段设置内容 listQVariantList nameList;nameList <<"小黄"<<"小劳"<<"小白";QVariantList ageList;ageList << 11 << 22 << 33;QVariantList scoreList;scoreList << 59 << 69 << 79;//给字段绑定相应的值,按顺序绑定query.addBindValue(nameList);query.addBindValue(ageList);query.addBindValue(scoreList);//执行预处理命令query.execBatch();//批量插入//遍历&&打印query.exec("select * from student");while( query.next()) //一行一行遍历{//取出当前行的内容qDebug()<< query.value(0).toInt()<< query.value(1).toString()<< query.value("age").toInt()<< query.value("score").toInt();}
现象
数据库可视化操作
添加数据库到项目工程
//打印Qt支持的数据库驱动qDebug()<<QSqlDatabase::drivers();//添加MYSQl数据库QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//连接数据库db.setHostName("127.0.0.1");//数据库服务器ipdb.setUserName("root");//数据库用户名db.setPassword("123456");//密码db.setDatabaseName("info");//使用哪个数据库//打开数据库if( !db.open() )//数据库打开失败{QMessageBox::warning(this,"错误",db.lastError().text());return;}
model设置模型
#include <QSqlTableModel>
QSqlTableModel *model;
指定model使用哪个表&把model设置到tableView并显示数据&把第一个列表改名字
//设置模型model = new QSqlTableModel (this);model->setTable("student");//指定使用哪个表//把model设置viewui->tableView->setModel(model);//显示model里的数据model->select();model->setHeaderData(0,Qt::Horizontal,"学号");
添加行&提交动作
void Widget::on_ButtonAdd_clicked()
{//添加空记录QSqlRecord record= model->record();//获取空记录//获取行号int row =model->rowCount();model->insertRecord(row,record);}void Widget::on_ButtonSure_clicked()
{model->submitAll();//提交动作
}
现象
取消&删除
void Widget::on_ButtonCanadian_clicked()
{model->revertAll();//取消所有动作model->submitAll();//提交动作
}void Widget::on_ButtonDel_clicked()
{//获取选择的模型QItemSelectionModel*sModel=ui->tableView->selectionModel();//取出模型中的索引QModelIndexList list=sModel->selectedRows();//删除所有选中的行for(int i =0;i<list.size();i++){model->removeRow(list.at(i).row());}
}
现象
查找
void Widget::on_ButtonFinal_clicked()
{//获取内容QString name=ui->lineEdit->text();QString str=QString("name ='%1'").arg(name);model->setFilter(str);model->select();
}
现象
相关文章:

Qt学习记录(15)数据库
目录 前言: 数据库连接 项目文件加上sql 打印查看Qt支持哪些数据库驱动 QMYSQL [static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName QLatin1String(defaultConnection)) 数据库插入 头文件.h 源…...
c++常用设计模式
1、单例模式(Singleton):保证一个类只有一个实例,提供一个全局访问点; class Singleton { private:static Singleton* instance;Singleton() {}public:static Singleton* getInstance() {if (instance nullptr) {instance new Singleton()…...

【动手学深度学习】softmax回归从零开始实现的研究详情
目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 softmax回归的从零开始实现 🌍3.2 基础练习 🌊4. 研究体会 🌊1. 研究目的 理解softmax回归的原理和基本实现方式;学习…...

MySQL:MySQL执行一条SQL查询语句的执行过程
当多个客户端同时连接到MySQL,用SQL语句去增删改查数据,针对查询场景,MySQL要保证尽可能快地返回客户端结果。 了解了这些需求场景,我们可能会对MySQL进行如下设计: 其中,连接器管理客户端的连接,负责管理连接、认证鉴权等;查询缓存则是为了加速查询,命中则直接返回结…...
解决Python导入第三方模块报错“TypeError: the first argument must be callable”
注意以下内容只对导包时遇到同样的报错会有参考价值。 问题描述 当你尝试导入第三方模块时,可能会遇到如下报错信息: TypeError: the first argument must be callable 猜测原因 经过仔细检查代码,我猜测这个错误的原因是由于变量名冲突所…...
在python中连接了数据库后想要在python中通过图形化界面显示数据库的查询结果,请问怎么实现比较好? /ttk库的treeview的使用
在Python中,你可以使用图形用户界面(GUI)库来显示数据库的查询结果。常见的GUI库包括Tkinter(Python自带)、PyQt、wxPython等。以下是一个使用Tkinter库来显示数据库查询结果的简单示例。 首先,你需要确保…...

OZON的选品工具,OZON选品工具推荐
在电商领域,选品一直是决定卖家成功与否的关键因素之一。随着OZON平台的崛起,越来越多的卖家开始关注并寻求有效的选品工具,以帮助他们在这个竞争激烈的市场中脱颖而出。本文将详细介绍OZON的选品工具,并推荐几款实用的辅助工具&a…...

营销方案撰写秘籍:包含内容全解析,让你的方案脱颖而出
做了十几年品牌,策划出身,混迹过几个知名广告公司,个人经验供楼主参考。 只要掌握以下这些营销策划案的要点,你就能制作出既全面又专业的策划案,让你的工作成果不仅得到同事的认可,更能赢得老板的赏识&…...

如何制作一本温馨的电子相册呢?
随着科技的不断发展,电子相册已经成为了一种流行的方式来记录和分享我们的生活。一张张照片,一段段视频,都能让我们回忆起那些温馨的时光。那么,如何制作一本温馨的电子相册呢? 首先,选择一款合适的电子相册…...

485通讯网关
在工业自动化与智能化的浪潮中,数据的传输与交互显得尤为重要。作为这一领域的核心设备,485通讯网关凭借其卓越的性能和广泛的应用场景,成为了连接不同设备、不同协议之间数据转换和传输的桥梁。在众多485通讯网关中,HiWoo Box以其…...
Anaconda中的常用科学计算工具
Anaconda中的常用科学计算工具 Anaconda是一个流行的Python科学计算环境,它提供了大量的科学计算工具,这些工具可以帮助用户进行数据分析、机器学习、深度学习等任务。以下是一些常见的Anaconda中的科学计算工具: NumPy:一个用于…...

Java 中BigDecimal传到前端后精度丢失问题
1.用postman访问接口,返回的小数点精度正常 2.返回到页面里的,小数点丢失 3.解决办法,在字段上加注解 JsonFormat(shape JsonFormat.Shape.STRING) 或者 JsonSerialize(using ToStringSerializer.class) import com.fasterxml.jackson.a…...
在Linux/Ubuntu/Debian上安装TensorFlow 2.14.0
在Ubuntu上安装TensorFlow 2.14.0,可以遵循以下步骤。请注意,由于TensorFlow的版本更新可能很快,这里提供的具体步骤可能需要根据你的系统环境和实际情况进行微调。 准备工作 检查系统要求:确保你的Ubuntu系统满足TensorFlow的运…...
多语言for循环遍历总结
多语言for循环遍历总结 工作中经常需要遍历对象,但不同编程语言之间存在一些细微差别。为了便于比较和参考,这里对一些常用的遍历方法进行了总结。 JAVA 数组遍历 Test void ArrayForTest() {String[] array {"刘备","关羽", &…...

python API自动化(Jsonpath断言、接口关联及加密处理)
JsonPath应用及断言 重要 自动化要解决的核心问题 :进行自动测试-自动校验(进行结果的校验 主要能够通过这个方式提取数据业务场景:断言 、接口关联 {key:value}网址:附:在线解析 JSONPath解析器 - 一个工具箱 - 好用…...

C++入门5——C/C++动态内存管理(new与delete)
目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明: 1. 栈区(stack):在…...
leetcode 743.网络延时时间
思路:迪杰斯特拉最短路径 总结起来其实就两件事: 1.从所给起点开始能不能到达所有点; 2.如果能够到达所有点,那么这个时候需要判断每一个点到源点的最短距离,然后从这些点中求出最大值。 所以用最小路径求解是最划…...

MATLAB导入导出Excel的方法|读与写Excel的命令|附例程的github下载链接
前言 前段时间遇到一个需求:导出变量到Excel里面,这里给出一些命令,同时给一个示例供大家参考。 MATLAB读/写Excel的命令 在MATLAB中,可以使用以下命令来读写Excel文件: 读取Excel文件: xlsread(filen…...
【第4章】SpringBoot实战篇之登录优化(含redis使用)
文章目录 前言一、整合redis1. 引入库2. 配置 二、登录优化1.登录2.拦截器3. 登出4. 修改密码 总结 前言 上一章的登录接口,我们将用户登录信息放置于Map中,存在一个问题,集群部署无法共享以及应用停止用户登录信息即丢失,接下来我们整合redis来整合这个问题。 一、整合redis …...

数据结构:详解二叉树(树,二叉树顺序结构,堆的实现与应用,二叉树链式结构,链式二叉树的4种遍历方式)
目录 1.树的概念和结构 1.1树的概念 1.2树的相关概念 1.3树的代码表示 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的存储结构 2.3.1顺序存储 2.3.2链式存储 3.二叉树的顺序结构和实现 3.1二叉树的顺序结构 3.2堆的概念和结构 3.3堆的特点 3…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...