Qt + MySQL(简单的增删改查)

news2024/12/28 19:15:30

Qt编译MySql插件教程

QSqlDatabase

静态函数

1.drivers(),得到可以使用的数据库驱动名字的集合

[static] QStringList QSqlDatabase::drivers();

2.addDatabase(),添加一个数据库实例

[static] QSqlDatabase QSqlDatabase::addDatabase(
    const QString &type, 
    const QString &connectionName = QLatin1String( defaultConnection ));

该函数的有两个参数分别是:

type: 指定要连接什么样的数据库,就是数据库驱动对应的驱动名
connectionName:数据库连接名,默认叫: defaultConnection,我们可以在应用程序中添加多个数据库连接(也就是多个实例),每个连接都对应一个唯一的名字。
函数的返回值就是得到的数据库实例对象。

3.database(),通过数据库连接名得到数据库实例对象

[static] QSqlDatabase QSqlDatabase::database(
    const QString &connectionName = QLatin1String( defaultConnection ), 
    bool open = true);

该函数的有两个参数分别是:

connectionName: 通过addDatabase()函数的第二个参数指定的连接名
open: 实例的状态

  • true: 得到的实例设置为打开状态
  • false: 得到的实例设置为关闭状态

4.判断连接名对应的连接是否已经存在了,给函数参数指定数据库连接名函数就可以返回连接对应的状态了:true(打开) 或者 false(关闭)。

[static] bool QSqlDatabase::contains(
    const QString &connectionName = QLatin1String( defaultConnection ));

普通成员函数

// 1.设置数据库名
void QSqlDatabase::setDatabaseName(const QString &name);
// 2.设置数据库服务器主机名(一般指定服务器IP地址即可)
void QSqlDatabase::setHostName(const QString &host);
// 3.设置数据库服务器绑定的端口
void QSqlDatabase::setPort(int port);// 如果数据库服务器绑定的是默认端口,可以省略设置端口的操作。
// 4.设置连接的数据库中某个用户的用户名
void QSqlDatabase::setUserName(const QString &name);
// 5.设置连接的数据库中某个用户对应的密码
void QSqlDatabase::setPassword(const QString &password);

// 6.连接数据库(必须要先设置连接信息,然后再连接数据库)
bool QSqlDatabase::open();// 数据库连接成功返回true,连接失败返回false。
// 7.判断数据库是否打开了,返回值和open()函数相同。
bool QSqlDatabase::isOpen() const;
// 8.关闭数据库连接
void QSqlDatabase::close();
// 9.返回有关数据库上发生的最后一个错误的信息。
QSqlError QSqlDatabase::lastError() const;
QString QSqlError::text() const;
// 该函数返回的是一个QSqlError对象,调用QSqlError类提供的text()方法就可以得到最后一个错误对应的信息描述了。

// 事务操作
// 10.创建一个事务
bool QSqlDatabase::transaction();
// 11.提交事务
bool QSqlDatabase::commit();
// 12.事务回滚
bool QSqlDatabase::rollback();

QSqlQuery

QSqlQuery 封装了从 QSqlDatabase上执行的SQL查询中创建、导航和检索数据所涉及的功能。既可以执行 SELECTINSERTUPDATEDELETE等DML(数据操作语言)语句,也可以执行CREATE TABLE等DDL(数据定义语言)语句。

成员函数

1.构造函数

QSqlQuery::QSqlQuery(
    const QString &query = QString(), 
    QSqlDatabase db = QSqlDatabase());

参数说明(这两个参数都有默认值,因此可以根据实际需求进行指定):
query:要执行的SQL语句,指定无参 exec() 执行的 SQL 语句
db:数据库实例对象,如果没有指定db,或者是无效的,则使用应用程序的默认数据库。

2.执行一个SQL语句

bool QSqlQuery::exec();    // 没有参数,执行的SQL语句是在构造函数中指定的
bool QSqlQuery::exec(const QString &query);   // 有参数,参数对应的字符串就是要执行的SQL语句

3.检索查询得到的结果集中的下一条记录(如果可用),并将查询定位到检索到的记录上。

bool QSqlQuery::next();

该函数检索结果集中的每一条记录的规则如下:

  • 如果当前位于结果集第一个记录之前,例如,在执行查询之后,将尝试检索第一个记录。
  • 如果当前位于结果集最后一条记录之后,结果集已经检索完毕并返回false。
  • 如果结果位于结果集中间的某个位置,则尝试检索下一个记录。

函数调用之后,如果检索到有效记录返回true,否则返回false。

4.获取当前记录中字段的值

QVariant QSqlQuery::value(int index) const;  // 通过字段的索引得到当前字段的值,编号从0开始。
QVariant QSqlQuery::value(const QString &name) const; // 通过字段的名字得到当前字段的值。

由于数据库表中的字段可以有多种数据类型,因此将这多种类型通过 QVariant 类进行了包装从而实现了整齐划一。我们可以通过调用 QVariant 类的API函数得到其内部实际类型的数据。

ui界面
在这里插入图片描述
使用 QSqlQuery 进行查询时,字符类型的参数的占位符加引号 QString("select *from student where num = '%1'").arg(searchname);;但是对于数值类型的参数的占位符,QString("select *from student where num = '%1'").arg(searchnumer);QString("select *from student where num = %1").arg(searchnumer); ,加不加引号都可以正常查询

QSqlQuery简单使用

代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setWindowTitle("SQL");//设置窗口的标题
    connect(ui->pushButtonInsert, &QPushButton::clicked, this, &MainWindow::pInsert_clicked);
    connect(ui->pushButtonDelete, &QPushButton::clicked, this, &MainWindow::pDelete_clicked);
    connect(ui->pushButtonModify, &QPushButton::clicked, this, &MainWindow::pModify_clicked);
    connect(ui->pushButtonSelect, &QPushButton::clicked, this, &MainWindow::pSelect_clicked);
    connect(ui->pushButtonSelectAll, &QPushButton::clicked, this, &MainWindow::pSelectAll_clicked);
    ui->textEdit->setText("右侧栏操作介绍:\n"
                          "1.插入:输入新学生的姓名,学号,分数\n"
                          "2.删除:输入要删除学生的姓名\n"
                          "3.修改:输入学生姓名,对其学号和分数进行修改\n"
                          "4.指定信息优先按姓名查询,其次按学号\n"
                          "5.查询所有学生信息");

    QStringList list = QSqlDatabase::drivers();
    qDebug() << list;

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    db.setHostName("127.0.0.1"); // 本地连接
    db.setPort(3306);       // 如果使用的是默认端口可以不设置
    db.setUserName("");	// 数据库用户名
    db.setPassword(""); // 数据库密码
    db.setDatabaseName("student"); // 数据库名字

    if(db.open())
    {
        QMessageBox::information(this, "打开数据库", "数据库打开成功, 可以读写数据了......");
    }
    else{
        QString msg = "数据库打开失败: " + db.lastError().text();
        QMessageBox::information(this, "打开数据库", msg);
    }

    pquery = new QSqlQuery(db);

    QString str = "create table IF NOT EXISTS student(num int, name varchar(32), score double);";
    pquery->exec(str); // 建表
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::pInsert_clicked()
{
    if(ui->lineEditName->text().isEmpty() ||
            ui->lineEditNumber->text().isEmpty() ||
            ui->lineEditScore->text().isEmpty()) {
        QMessageBox::information(this, "Insert Error", "要插入的学生信息必须完整");
        return;
    }

    QString namestr = ui->lineEditName->text();
    int num = ui->lineEditNumber->text().toInt();
    double score = ui->lineEditScore->text().toDouble();

    QString str = QString("insert into student(num, name, score) values('%1', '%2', '%3')").arg(num).arg(namestr).arg(score);
    pquery->exec(str);
    ui->textEdit->append("插入成功\n");
}

void MainWindow::pDelete_clicked()
{
    if(ui->lineEditName->text().isEmpty()) {
        QMessageBox::information(this, "Delete Error", "必须给出要删除学生的姓名");
        return;
    }
    QString name = ui->lineEditName->text();//从行编辑框中获取需要删除的人名
    QString str = QString("select * from student where name = '%1'").arg(name);
    pquery->exec(str);
    if(pquery->size() <= 0) {
        QMessageBox::information(this, "Delete Error", "要删除的学生不存在,请检查输入的姓名是否正确");
        return;
    }

    str =  QString("delete from student where name = '%1'").arg(name);
    pquery->exec(str);
    ui->textEdit->append(QString("删除姓名为%1的同学成功\n").arg(name));
}

void MainWindow::pModify_clicked()
{
    if(ui->lineEditName->text().isEmpty() ||
            ui->lineEditNumber->text().isEmpty() ||
            ui->lineEditScore->text().isEmpty()) {
        QMessageBox::information(this, "Insert Error", "要修改的学生信息必须完整");
        return;
    }

    QString updatename = ui->lineEditName->text();
    QString temp = QString("select * from student where name = '%1'").arg(updatename);
    pquery->exec(temp);
    if(pquery) {
        if(pquery->size() <= 0) {
            QMessageBox::information(this, "Insert Error", "要修改的学生不存在,请查看输入的姓名是否正确");
            return;
        }
    }

    int number = ui->lineEditNumber->text().toInt();
    double score = ui->lineEditScore->text().toDouble();
    temp = QString("update student set num = '%1' , score = '%2' where name = '%3'").arg(number).arg(score).arg(updatename);
    pquery->exec(temp);//执行修改信息的操作
    ui->textEdit->append("修改成功\n");
}

void MainWindow::pSelect_clicked()
{
    if(ui->lineEditName->text().isEmpty() && ui->lineEditNumber->text().isEmpty()) {
         QMessageBox::information(this, "Select Error", "必须指定查询的姓名或者学号");
         return;
    }

    QString searchname = ui->lineEditName->text();
    int searchnumer = ui->lineEditNumber->text().toInt();
    QString str;

    if(!ui->lineEditName->text().isEmpty()) {
        str = QString("select *from student where name = '%1'").arg(searchname);
        pquery->exec(str);
        if(pquery->size() <= 0) {
            QMessageBox::information(this, "Select Error", "要查询的学生不存在,请查看输入的姓名是否正确");
            return;
        }
        ui->textEdit->append(QString("查询姓名为%1的同学成功").arg(searchname));
    }
    else if(!ui->lineEditNumber->text().isEmpty()) {
        str = QString("select *from student where num = '%1'").arg(searchnumer);
        pquery->exec(str);
        if(pquery->size() <= 0) {
            QMessageBox::information(this, "Select Error", "要查询的学生不存在,请查看输入的学号是否正确");
            return;
        }
        ui->textEdit->append(QString("查询学号为%1的同学成功").arg(searchnumer));
    }

    pquery->exec(str);
    QString name;
    int number = 0;
    double score;
    while (pquery->next())
    {
        number = pquery->value(0).toInt();
        name = pquery->value(1).toString();
        score =  pquery->value(2).toDouble();
        str = "学号: " + QString::number(number) + " " +
              "姓名: " + name + " " +
              "分数: " + QString::number(score);
        ui->textEdit->append(str);
    }
    ui->textEdit->append("\n");
}

void MainWindow::pSelectAll_clicked()
{
    QString str = QString("select *from student");
    pquery->exec(str);
    if(pquery->size() <= 0) {
        QMessageBox::information(this, "Select Error", "目前student里没有信息");
    }

    ui->textEdit->append("查询所有成员成功");
    QString name;
    int number = 0;
    double score;
    while (pquery->next())
    {
        number = pquery->value(0).toInt();
        name = pquery->value(1).toString();
        score =  pquery->value(2).toDouble();
        str = "学号: " + QString::number(number) + " " +
              "姓名: " + name + " " +
              "分数: " + QString::number(score);
        ui->textEdit->append(str);
    }
    ui->textEdit->append("\n");
}

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

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

相关文章

抖音商家电话采集如何用爬虫软件实现

随着互联网的发展&#xff0c;越来越多的商家开始在抖音上开设店铺。本文将介绍如何用爬虫软件实现抖音商家电话采集。 第一步&#xff1a;安装Python爬虫框架 Python爬虫框架有很多&#xff0c;比如Scrapy、BeautifulSoup等。本文选择使用Scrapy框架&#xff0c;因为它具有强…

用python测试网络上可达的网络设备

用python测试网络上可达的网络设备 之前使用的os在python中执行ping测试网络中可达的目标&#xff0c;但是他在执行ping命令时脚本会将系统执行ping时的回显内容显示出来&#xff0c;有时这些回显并不是必要的。如果用脚本一次性ping成百上千台网络设备或者URL时会影响美观和阅…

电商API接口开发和接入说明{包含淘宝/京东/拼多多/抖音}

“为什么改了这个没告诉我” “实际功能和文档上说的不一样啊”。 这些话大家在进行电商API接口开发时&#xff0c;想必耳朵都听出老茧了。 真不是故意的&#xff0c;有时候任务比较急&#xff0c;就先改了代码&#xff0c;想着以后再同步文档&#xff0c;然后就给忘了。 项…

【Vue】vue | npm run build打包缺少模块 | 打包缺少模块代码

一、说明 1、项目时间长了&#xff0c;vue的node_modules依赖竟然到了16个G 2、之前npm run build:prod都是可以的 3、最新一次竟然失败了&#xff0c;说缺少模块 二、解决 1、删除node_modules模块 2、强删缓存 npm cache clear --force 3、删除package-lock.json 4、重新…

【C++】:set和map

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关多态的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

HomeAssistant如何添加HACS插件实现公网控制米家与HomeKit等智能家居

HomeAssistant添加HACS插件并实现公网控制米家&#xff0c;HomeKit等智能家居 文章目录 HomeAssistant添加HACS插件并实现公网控制米家&#xff0c;HomeKit等智能家居基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssist…

不是Typescript用不起,而是JSDoc更有性价比?

1. TS不香了&#xff1f; 2023年&#xff0c;几条关于 Typescript 的新闻打破了沉寂&#xff0c;让没什么新活好整的前端开发圈子又热闹了一番。 先是 GitHub 的报告称&#xff1a;“TypeScript 取代 Java 成为第三受欢迎语言”。 在其当年度 Octoverse 开源状态报告中&#x…

如何通过navicat连接SQL Server数据库

本文介绍如何通过Navicat 连接SQL Server数据库。如果想了解如何连接Oracle数据库&#xff0c;可以参考下边这篇文章。如何通过Navicat连接Oracle数据库https://sgknight.blog.csdn.net/article/details/132064235 1、新建SQL Server连接配置 打开Navicat软件&#xff0c;点击…

【微信小程序开发】学习小程序的模块化开发(自定义组件和分包加载)

前言 模块化开发是一种将复杂的应用程序分解为一系列独立的模块&#xff0c;每个模块负责完成特定的功能的开发方式。模块化开发可以提高代码的可维护性和可复用性&#xff0c;使开发过程更加高效和灵活。 文章目录 前言模块化开发的重要性和优势自定义组件自定义组件的概念和作…

观测云实现日志存储与分析 10 倍性价比提升|SelectDB 技术团队

作者&#xff1a;观测云 CEO 蒋烁淼 & 飞轮科技技术团队 在云计算逐渐成熟的当下&#xff0c;越来越多的企业开始将业务迁移到云端&#xff0c;传统的监控和故障排查方法已经无法满足企业的需求。而观测云可提供整体数据的分析、洞察、可视化、自动化、监测告警、智能巡查…

【EI征稿中#先投稿,先送审#】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2023&…

使用Selenium模拟人工操作及获取网页内容

使用Selenium抓取网页动态内容 根据权威机构发布的全球互联网可访问性审计报告&#xff0c;全球约有四分之三的网站其内容或部分内容是通过JavaScript动态生成的&#xff0c;这就意味着在浏览器窗口中“查看网页源代码”时无法在HTML代码中找到这些内容&#xff0c;也就是说我们…

Python创建交互式Web应用:Shiny库详解

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Shiny是一个基于Python的交互式Web应用框架&#xff0c;专注于简化Web应用的开发流程。本文将深入探讨Shiny库的基本用法、高级功能以及实际应用案例&#xff0c;以帮助开发者充分发挥Shiny在Web应用开发中的优势…

周大福传世杰作「裕世钻芳华」首次亮相“超越时光”天然钻石展

&#xff08;2023年12月6日&#xff0c;北京&#xff09;天然钻石&#xff0c;是自地球深处历经数十亿年时光形成的自然奇迹&#xff0c;在悠长的岁月中见证了无数真挚情感的珍贵瞬间。12月6日&#xff0c;“超越时光”周大福天然钻石展于北京凤凰国际传媒中心启幕&#xff0c;…

基于深度学习YoloV8的火焰烟雾检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介YoloV8模型火焰烟雾检测系统模型训练实时检测 应用领域 二、功能三、系统四. 总结 一项目简介 # 基于深度学习YoloV8的火焰烟雾检测系统介绍 简介 深…

JIRA 禁用用户自动登录

概述 当用户登录 JIRA 时&#xff0c;他们可以通过在单击“Log In”按钮之前选中“Remember my login”复选框&#xff0c;让 JIRA 记住他们的登录信息。这样做之后&#xff0c;“Remember my login”令牌将由 JIRA 服务器存储&#xff0c;并且系统会在用户的浏览器中设置包含…

OpenHarmony北向-让更广泛的应用开发者更容易参与

一、标准系统的体验 按照官方文档指导&#xff0c;这样操作&#xff0c;OH标准系统开发板就可以运行开发者开发的OpenHarmony应用了。 二、实际情况 按照开发文档上的说明&#xff0c;肯定是装不上的。因为OH不同的发行版&#xff0c;不同发行板不同的设备&#xff0c;IDE&…

第一篇:MongoDB的安装、启动、关闭、链接shell

目录 简介 安装 安装遇到的问题 查看brew 当前使用的源&#xff1a; 更换brew 源。更换成清华大学镜像源 版本查看 MongoDB 数据目录与日志目录 启动方式一&#xff1a; 启动MongoDB 验证MongoDB 是否正常运行 停止或重新启动 停止MongoDB 服务 重新启动MongoDB服…

阿里测试8年,肝到P8只剩我一个了····

在阿里工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

农用烘干机市场分析:我国市场规模为190亿元

农用烘干机是运用在农业烘干领域的传统干燥设备之一&#xff0c;主要是为了农副产品直接使用或满足进一步加工的需要。农用烘干机具有操作弹性大、适应性强、处理能力大、设备运转可靠等优点&#xff0c;能大幅度提高农副产品烘干效率。现阶段&#xff0c;我国农用烘干机的市场…