Qt第二十章 数据库操作

news2024/11/13 16:44:47

文章目录

  • 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();
    else
        qDebug() << "插入成功";

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")); // 这里会把字符串转化成int
    for (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() << "数据库连接成功";
    else
        qDebug() << "数据库连接失败" << db.lastError().text();
    return a.exec();
}

在这里插入图片描述

MySql客户端程序部署

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

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

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

相关文章

北京青蓝智慧科技:2024(第九届)世界物联网大会将于11月在京举行

2024年11月&#xff0c;北京将迎来第九届世界物联网大会的盛大启幕。 这一年度盛会由世界物联网大会、中国移动通信联合会、外交理事会携手举办&#xff0c;得到了世界绿色设计组织、世界物联网基金会等机构的大力支持。 大会的宗旨在于推动全球智能联网数字经济的创新进展&a…

Golang | Leetcode Golang题解之第373题查找和最小的K对数字

题目&#xff1a; 题解&#xff1a; func kSmallestPairs(nums1, nums2 []int, k int) (ans [][]int) {m, n : len(nums1), len(nums2)// 二分查找第 k 小的数对和left, right : nums1[0]nums2[0], nums1[m-1]nums2[n-1]1pairSum : left sort.Search(right-left, func(sum in…

Notion 使用详解——基础教程

《Notion 使用详解——基础教程》 一、Notion简介 Notion是一款集笔记、任务、数据库、wiki、知识库等功能于一体的生产力工具&#xff0c;其强大的模块化设计和高度自定义能力&#xff0c;使其成为个人和团队提高工作效率的理想选择。 二、基础操作 1. 创建页面&#xff1a;…

几个很棒的AI问题和精彩回答

这里有几个很棒的与AI相关的问题和精彩的回答&#xff0c;分享给大家 2024&#xff0c;怎么以10倍的速度设计AI产品&#xff1f; 回答嘉宾&#xff1a;Tidyread作者 根据产品定位&#xff0c;对整体风格进行定调 Tidyread 希望人们能从中建立资讯阅读的秩序感&#xff0c;所以…

阿里云对象存储OSS的前端直传-demo

原由 在项目里有时候会碰到比如上传文件相关的&#xff0c;一般都是后端提供个接口&#xff0c;然后我们上传的时候后端再传到阿里OSS或者其他服务商的对象存储&#xff0c;然后把最终的url拿到存起来或者返回给前端&#xff0c;这种方式其实在上传图片的频率不高的业务场景中…

电商数据接口助力电商数据分析||电商运营每日必看5个底层数据

数据分析充电站——深入探索中小企业数字化转型&#xff0c;专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板&#xff0c;为钻研于数据分析的朋友们加油充电。 电商运营店铺涉及大量数据&#xff0c;包括用户行为、交易记录、库存信息等&#xff0c;如何…

Python测试之测试覆盖率统计

本篇承接上一篇 Python测试框架之—— pytest介绍与示例&#xff0c;在此基础上介绍如何基于pytest进行测试的覆盖率统计。 要在使用 pytest 进行测试时检测代码覆盖率&#xff0c;可以使用 pytest-cov 插件。这个插件是基于 coverage.py&#xff0c;它能帮助你了解哪些代码部…

【PySide6-QML】2. 添加菜单栏

文章目录 前言实现添加菜单栏添加菜单添加子菜单点击动作添加快捷键 前章回顾&#xff1a;【PySide6-QML】1. 创建新项目 前言 本文使用 MenuBar 添加工具菜单栏&#xff0c;Action 添加子菜单&#xff0c;并添加快捷键和动作回调。 实现 添加菜单栏 import QtQuick.Contr…

centos mongodb安装+开机启动

1.mongodb安装 Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 步骤1-下载 下载地址&#xff1a;Download MongoDB Community Server | MongoDB 步骤2-安装-修改配置 Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 下载包到 /usr/local/ 解压 tar…

新一代RK3576芯片,3588平替吗?

瑞芯微RK3576是一款高性能、低功耗的SoC&#xff08;系统级芯片&#xff09;处理器&#xff0c;适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU&#xff0c;集成了GPU、MCU、NPU、VPU等多种计算核心&#xff0c;并具有丰富的外…

基于深度学习的交通标志检测识别系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov5、yolov5 SE注意力机制&#xff0c;两个模型都已训练好&#xff0c;可直接使用。 数据集&#xff1a;     网上下载的数据集&#xff0c;格式都已转好&#xff0c;可…

K8S对接Ceph分部署存储

文章目录 一、Ceph理论知识1、Ceph简介2、Ceph分布式存储的优点3、Ceph核心组件 二、部署Ceph高可用集群1、服务器环境信息2、部署前环境准备工作3、部署Ceph监控服务Monitor4、激活Ceph存储服务OSD 三、K8S对接Ceph存储1、K8S对接Ceph RBD实现数据持久化2、基于Ceph RBD生成PV…

【精选】基于数据可视化的智慧社区内网平台(程序员阿龙出品精品)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

游戏出海,燃动全球,“安全”如何通关?

泼天的富贵落在了游戏圈&#xff0c;用事实打脸了男人消费不如狗的谬论。 这几天&#xff0c;无论是游戏圈内人还是圈外人&#xff0c;无人不知晓《黑神话&#xff1a;悟空》。这部头顶「3A国产游戏之光」的作品自6月8日预售以来&#xff0c;全平台销量超过800万份&#xff0c;…

基于R语言的统计分析基础:数据结构

R语言是一种用于统计分析和图形表示的编程语言和软件环境&#xff0c;它提供了多种数据结构以存储和操作数据。这些数据结构包括向量、矩阵、数组、数据框、列表、因子、Tibble、环境、公式、调用以及表达式。 向量&#xff08;Vector&#xff09; 向量是R中最基本的数据结构…

InstantID: Zero-shot Identity-Preserving Generation in Seconds

https://arxiv.org/pdf/2401.07519#page9.73https://github.com/instantX-research/InstantID?tabreadme-ov-filehttps://github.com/instantX-research/InstantID/pull/89/files 问题引入 目标是生成和reference图片相符合的图片&#xff0c;特别是人脸&#xff1b;现在基于…

C++必修:unordered_set/unordered_map

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. unordered_set的介绍 unordered_set是一种关联式容器&#xff0c;它具有以下几…

使用MVC设计模式根据软件系统设计建设高校数字化教育教学资源共享平台

目录 案例 【题目】 【问题 1】(9 分) 【问题 2】(6 分) 【问题 3】(10 分) 答案 【问题 1】答案 【问题 2】答案 【问题 3】解析 相关推荐 案例 阅读以下关于软件系统设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某软件企业受该省教育部门委托…

【SpringCloud Alibaba】(九)学习 Gateway 服务网关

目录 1、网关概述1.1、没有网关的弊端1.2、引入 API 网关 2、主流的 API 网关2.1、NginxLua2.2、Kong 网关2.3、Zuul 网关2.4、Apache Shenyu 网关2.5、SpringCloud Gateway 网关 3、SpringCloud Gateway 网关3.1、Gateway 概述3.2、Gateway 核心架构 4、项目整合 SpringCloud …

【妙招大放送】:苹果手机数据恢复的4个技巧来啦!

手机是我们日常生活中不可或缺的一部分&#xff0c;它存储着照片、视频、联系人等许多重要的数据。但是&#xff0c;意外时有发生&#xff0c;我们有时会因为软件崩溃或者是手机损坏等的原因导致这些重要的数据丢失。那么&#xff0c;对于苹果用户来说&#xff0c;苹果手机数据…