Qt第二十章 数据库操作

文章目录

  • Qt操作数据库
    • QSqlDataBase
    • QSqlQuery
      • 执行SQL语句
    • QSqlRecord
    • QSqlField
    • 数据库模型
      • QSqlQueryModel
      • QSqlTableModel
      • QSqlRelationalTableModel
  • 编译MySql驱动msvc版本
  • MySql客户端程序部署

Qt操作数据库

需要在cmakelist加上Sql模块

QSqlDataBase

可以通过静态成员查看支持的所有驱动

    qInfo() << QSqlDatabase::drivers();

在这里插入图片描述

QSqlQuery

数据库用例

在这里插入图片描述

执行SQL语句

  1. 查询
    QSqlQuery query("select * from tab1"); // 设置查询语句query.exec(); // 执行查询qDebug() << query.record().count(); // 获取字段数qDebug() << query.size(); // 记录数量,即查询出几行数据while (query.next()) {qDebug() << query.value(1).toString(); // 第一列的数据qDebug() << query.value("id").toString(); // 字段名为deptno的数据}
  1. 插入

方法1

    QSqlQuery query;bool r = query.exec("INSERT INTO tab1 (id) ""VALUES (1002)");if (r)qDebug() << "插入成功";

方法2

    QSqlQuery query;query.prepare("INSERT INTO tab1(id,age,name)""VALUES(?,?,?)");query.addBindValue(2001);query.addBindValue(12);query.addBindValue("张三");if (query.exec())qDebug() << "插入成功";

方法3

    QSqlQuery query;query.prepare("INSERT INTO tab1(id,age,name)""VALUES(:id,:age,:name)");query.bindValue(":id", 2024);query.bindValue(":age", 12);query.bindValue(":name", "李四");if (query.exec())qDebug() << "插入成功";

方法4

    QSqlQuery query;query.prepare("insert into tab1 values(?,?,?,?)");QVariantList ids = QVariantList() << 3001 << 3002 << 3003;QVariantList ages = QVariantList() << 11 << 12 << 13;QVariantList names = QVariantList() << "a1"<< "a2"<< "a3";QVariantList sexs = QVariantList() << 0 << 1 << 0;query.addBindValue(ids);query.addBindValue(ages);query.addBindValue(names);query.addBindValue(sexs);if (!query.execBatch())qDebug() << query.lastError();elseqDebug() << "插入成功";

QSqlRecord

    qDebug() << db.tables(); // 获取所有表名qDebug() << db.record("tab1"); // 获取表的字段

在这里插入图片描述

QSqlField

QSqkField表示数据库或表视图中单个列的特征,例如数据类型和列名。字段还包含数据库列的值,可以查看或更改该值。字段数据值存储为qvariant,不允许使用不兼容的类型。

    QSqlRecord rec = db.record("tab1");QSqlField field("score", QMetaType::fromType<int>());rec.append(field); // 添加score字段field.setValue(QString("123")); // 这里会把字符串转化成intfor (int i = 0; i < rec.count(); i++) {qDebug() << rec.fieldName(i) << rec.value(i);}

在这里插入图片描述
尽管用QsqlField添加了字段,但数据库里实际并没有发生改变

数据库模型

模型操作参考第十四章

QSqlQueryModel

只读模式,不能更改

void Widget::sqlTableview()
{qInfo() << QSqlDatabase::drivers();QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setUserName("root");db.setPassword("123456");db.setDatabaseName("hello");if (!db.open())qDebug() << "数据库连接失败" << db.lastError().text();// 创建模型QSqlQueryModel* model = new QSqlQueryModel;model->setQuery("select * from tab1");// 创建视图QTableView* view = new QTableView;view->setModel(model);view->show();
}

在这里插入图片描述

QSqlTableModel

可以更改数据

void Widget::sqlTableview2()
{QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setUserName("root");db.setPassword("123456");db.setDatabaseName("hello");if (!db.open())qDebug() << "数据库连接失败" << db.lastError().text();QSqlTableModel* model = new QSqlTableModel;model->setTable("tab1"); // 设置表model->setEditStrategy(QSqlTableModel::OnFieldChange); // 设置编辑策略,在视图里修改,立刻在数据库里也更改model->select();QTableView* view = new QTableView;view->setModel(model);view->show();model->setHeaderData(0, Qt::Horizontal, "tab_id"); // 设置第0列水平头的字段为tab_id
}

在这里插入图片描述

QSqlRelationalTableModel

编译MySql驱动msvc版本

Qt5.13版本后不包含MySql的驱动插件,需要自己手动编译

  1. 看下G:\Qt\6.6.3\Src 有没有这个文件夹(没有的用qt维护工具安装当前版本QT的Sources)Qt版本不同的后面路径自行修改
    在这里插入图片描述

  2. 看下C:\Program Files\MySQL\MySQL Server 8.3(没有的去mysql官方下载安装)如果安装在别的文件夹,后面用到的路径自行修改一下
    在这里插入图片描述

  3. 进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers用记事本打开.cmake.conf,添加如下代码

set(QT_REPO_MODULE_VERSION "6.6.3")
SET(FEATURE_sql_mysql ON)
SET(MySQL_INCLUDE_DIR "C:/Program Files/MySQL/MySQL Server 8.3/include")
SET(MySQL_LIBRARY "C:/Program Files/MySQL/MySQL Server 8.3/lib/libmysql.lib")

在这里插入图片描述

  1. 用QtCreator打开当前文件夹的CMakeLists.txt

  2. 点击项目>构建>Current Configuration 往下拉 找到FEATURE_sql_mysql 勾选(已经有的跳过这一步)
    在这里插入图片描述

  3. 点击执行CMake,项目里有mysql就说明成功了
    在这里插入图片描述

  4. 选择Debug,点击左下角小锤子构建项目

  5. 选择release ,同样构建一下项目(后面release项目的操作和debug类似,这里省略)

  6. 进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers\build\Desktop_Qt_6_6_3_MSVC2019_64bit-Debug\plugins\sqldrivers
    复制qsqlmysqld.dllqsqlmysqld.pdb
    在这里插入图片描述

  7. 进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers\build\Desktop_Qt_6_6_3_MSVC2019_64bit-Debug\plugins\sqldrivers 粘贴刚才复制的文件
    在这里插入图片描述

  8. 进入C:\Program Files\MySQL\MySQL Server 8.3\lib复制libmysql.dllG:\Qt\6.6.3\msvc2019_64\bin

在这里插入图片描述
12. 运行代码测试一下

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>int main(int argc, char* argv[])
{QCoreApplication a(argc, argv);qInfo() << QSqlDatabase::drivers();QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setUserName("root");db.setPassword("123456");//这里替换成自己的数据库密码db.setDatabaseName("test");if (db.open())qDebug() << "数据库连接成功";elseqDebug() << "数据库连接失败" << db.lastError().text();return a.exec();
}

在这里插入图片描述

MySql客户端程序部署

如果你的程序使用了MySQL数据库,那么在部署时,需要将MySql的依赖,一并拷贝到exe同级目录。
在这里插入图片描述
在这里插入图片描述
上面3个库拷贝进去,双击运行即可

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

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

相关文章

苹果已删除照片的恢复方法有哪些?盘点几种实用办法

苹果设备上的照片往往是珍贵的回忆&#xff0c;但不小心删除照片的情况时有发生。幸运的是&#xff0c;苹果提供了几种方法来帮助用户恢复已删除的照片。本文将详细介绍几种有效的恢复方法&#xff0c;帮助您找回那些重要的照片。 方法一&#xff1a;通过“最近删除”文件夹恢复…

SQL-DCL-数据控制语言

一、 DCL-管理用户 二、DCL-权限控制 一、 DCL-管理用户,主要是DBA数据库管理员使用&#xff0c;开发使用较少 # 1、查询用户 use mysql; show tables; desc user; select * from user; # host为主机地址, 主机地址和用户名确定唯一性# 2、创建用户 create user itcastlocalh…

【AD9361 数字基带】多片基带内FPGA补偿 I/Q Rotation

I/Q 旋转 Rotation 在许多多通道射频系统中&#xff0c;如 AD-FMCOMMS5&#xff0c;甚至在 AD-FMCOMMS2、AD-FMCOMMS3 上&#xff0c;都需要测量或校正两个复数 &#xff08;I/Q&#xff09; RF 信号之间的相位差。 从纯粹的数学描述来看&#xff0c;单个正弦波没有相位&…

【数学建模】趣味数学模型——等额还款数学模型

问题 在银行贷款中&#xff0c;通常采用等额还款。假定银行贷款的年利率为 p&#xff0c;贷款 k 元&#xff0c;分 m 年采用每月等额还款方式还清。问每月还款多少钱&#xff1f;总共还的钱是多少&#xff1f;每月还款中还本金和利息各是多少元&#xff1f; 如果考虑每月等额…

VTK随笔一:初识VTK(QT中嵌入VTK窗口)

VTK&#xff08;Visualization Toolkit&#xff09;是一个用于可视化和图形处理的开源软件库。它提供了一系列的算法和工具&#xff0c;可以用来创建、渲染和处理二维和三维的图形数据。VTK可以在多个平台上运行&#xff0c;并支持各种编程语言&#xff0c;包括C、Python和Java…

基于Springboot + vue + mysql 车辆充电桩管理系统 设计实现

目录 &#x1f4da; 前言 &#x1f4d1;摘要 1.1 研究背景 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; E-R表 3.4.2 数据库具体设计 系统功能模块 系统首页 用户注册 充电桩 个人中心 用户后台管理模块 用户登录…

完成课题ssrf实现.SSH未创建写shell,同时完成其他漏洞复现

SSRF 一种网络安全漏洞&#xff0c;发生在服务器端应用程序中&#xff0c;允许攻击者通过服务器向任意网络资源发送请求&#xff0c;而无需用户直接参与。这种漏洞通常源于程序设计错误&#xff0c;例如当应用程序使用用户的输入作为URL请求的一部分&#xff0c;而没有适当的验…

Ansible初识

ansible初识 Ansible是一种自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它基于Python语言开发&#xff0c;使用SSH协议进行通信&#xff0c;并且不需要在被管理的主机上安装任何客户端。Ansible使用简单的YAML语言来描述任务和配置&#xff0c;使得操作简…

Vue3的三种样式控制及实现原理

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 Vue3中一共有三种样式控制&#xff0c;分别是全局样式控制、局部作用域样式控制和深度样式控制&#xff0c;今天我们一起看下这三种样式控制的使用&#xff0c;以及实现的原理是什么。 一、全局样式控制…

NRK3301语音识别芯片在汽车内饰氛围灯上的应用方案解析

随着智能汽车的快速发展&#xff0c;车载语音交互技术逐渐成为提升驾驶体验的关键技术之一。传统的汽车内饰氛围灯语音识别系统往往依赖于手动操作&#xff0c;不仅操作繁琐&#xff0c;而且在驾驶过程中容易分散驾驶员的注意力。因此&#xff0c;开发一种高效、便捷的汽车内饰…

SpringBoot集成Redis

目录 12.1 配置文件12.2 防火墙12.3 Jedis(一般不用了&#xff0c;了解即可)1.介绍2.步骤3.写YML4.主启动5.业务类 12.4 Lettuce1.介绍以及和Jedis的区别2.步骤1.改pom2.业务类 12.5 Redis Template(推荐)1.连接单机1.改pom2.写YML3.业务类3.1配置类3.2 service3.3 controller测…

Stable Diffusion的微调方法原理总结

在深度学习领域&#xff0c;Stable Diffusion作为一种强大的生成模型&#xff0c;正逐渐成为图像和视频生成领域的热门话题。它不仅能够模拟复杂的自然和人工系统中的随机演化行为&#xff0c;还通过一系列微调方法&#xff0c;显著提升了模型在特定任务上的性能。本文旨在深入…

开放式耳机别人能听到吗?开放式的防漏音效果到底好不好?

开放式耳机的设计是允许一部分声音泄露出来&#xff0c;所以当您使用开放式耳机听音乐或通话时&#xff0c;周围的人可能会有所察觉。具体别人能听到多少&#xff0c;取决于几个因素&#xff1a; 音量大小&#xff1a;如果音量设置得比较高&#xff0c;那么周围的人更容易听到…

多线程面试常问

一、创建线程的几种方式 1、继承Thread类并重写run()方法。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("通过集成 Thread 类实现线程"); } } // 如何使用 new MyThread().start() 2、实现Runnable接口并重写run()方法…

Linux文件系统及常见快捷键

Linux文件系统及常用快捷键 (只是对linux简单的介绍,新手常用的快捷键) 1、Linux文件系统结构 windows文件系统 Windows操作系统将硬盘进行分区&#xff0c;然后用 A 、 B 、 C 、 D 、等符号标识。存取文件时一定要清楚存放在哪个磁盘的哪个目录下。 Linux 文件系统结构 …

基于FPGA的SD NAND Flash数据读写实现

1、存储芯片分类 目前市面上的存储芯片&#xff0c;大致可以将其分为3大类&#xff1a; ① EEPROM EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器&#xff0c;是一种掉电后数据不丢失的存储芯片。EEPROM 可以在电脑上或专用设备…

腾讯云授权子用户账号域名备案

官网文档没说清楚 2.在购买了服务器的账号生成授权码 2.填写子账号id 3.子账号即可弹出备案按钮了

Wemos D1 Mini pro/ nodeMcu / ESP8266 驱动 240*320 ILI9341 SPI液晶屏

Wemos D1 Mini / nodeMcu / ESP8266 驱动 240*320 ILI9341 SPI液晶屏 效果展示器件硬件连接引脚连接原理图引脚对照表 安装TFT_eSPI库TFT_eSPI库中User_Setup.h文件的参数修改User_Setup.h文件的位置User_Setup.h文件中需要修改的参数User_Setup.h完成源码 例程 缘起&#xff1…

【3天速成Python基础语法(3)】

文章目录 1 :peach:库的基本认识:peach:2 :peach:标准库:peach:3 :peach:第三方库:peach: 1 &#x1f351;库的基本认识&#x1f351; 库 就是是别人已经写好了的代码, 可以让我们直接拿来用。一个编程语言能不能流行起来, 一方面取决于语法是否简单方便容易学习, 一方面取决于…

安捷伦色谱仪器LabVIEW软件替换与禁运配件开发

可行性分析及实现路径 可行性&#xff1a; 软件替换&#xff1a; 驱动程序支持&#xff1a; 要实现LabVIEW对安捷伦色谱仪器的控制&#xff0c;需要检查安捷伦是否提供LabVIEW驱动程序。如果没有现成的驱动&#xff0c;则可能需要开发自定义的驱动程序&#xff0c;通过LabVIEW…