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

Qt编译MySql插件教程

帮助: SQL Programming

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 ));

5.QSqlDatabase::colse() 关闭数据库之后,调用 QSqlDatabase::removeDatabase() 移除该连接

普通成员函数

// 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");
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kennard-stone算法实现样本集划分(ks算法)

目录 一、 Kennard-Stone算法原理&#xff08;KS算法&#xff09; 二、Kennard-Stone算法作用 三、代码 四、对选出来的train样本使用T-SNE算法进行绘制 五、参考链接 一、 Kennard-Stone算法原理&#xff08;KS算法&#xff09; KS算法原理&#xff1a;把所有的样本都看…

【C语言】操作符详解(一):进制转换,原码,反码,补码

目录 操作符分类 2进制和进制转换 2进制转10进制 10进制转2进制 2进制转8进制和16进制 2进制转8进制 2进制转16进制 原码、反码、补码 操作符分类 操作符中有一些操作符和二进制有关系&#xff0c;我们先铺垫一下二进制的和进制转换的知识。 2进制和进制转换 其实我们经…

在OpenCV基于深度学习的超分辨率模型实践

1. 引言 OpenCV是一个开源的计算机视觉库&#xff0c;拥有大量优秀的算法。基于最新的合并&#xff0c;OpenCV包含一个易于使用的接口&#xff0c;主要用于实现基于深度学习方法的超分辨率&#xff08;SR&#xff09;。该接口包含预先训练的模型&#xff0c;这些模型可以非常容…

K8s构建的mysql无法远程连接

最近在写一个老师布置的大作业&#xff0c;都是老师写好的yaml文件&#xff0c;都是没问题的&#xff0c;但是构建的mysql无法远程连接。 尝试了网上的很多方法&#xff0c;都失败了&#xff0c;我的构建过程应该是没什么错误的&#xff0c;所以网上的方法并不奏效&#xff0c…

使用webstrom编写vue开启提示

1.语言服务器选择 2.文件类型–忽略的文件和文件夹&#xff0c;删去&#xff0c;node_modules&#xff0c;就可以点进去库了 3.禁用JSLint、TSLint 4.开启node辅助 5.如果是vite&#xff0c;开启自动读取&#xff0c;或手动指定 6.如果是Webpack&#xff0c;开启自动读取&#…

修改移远提供的GobiNet、quectel-CM源码,使其支持有方N720 4G模块

最近在研究imx6ull linux下4G模块驱动的移植&#xff0c;参考的移远ec20的移植方法&#xff0c;添加了GobiNet驱动&#xff0c;编译了quectel-CM工具&#xff0c;并且可以正常拨号&#xff0c;分配到ip&#xff0c;如下&#xff1a; ping外网也没有压力&#xff0c;如下…

CAN 二: STM32 CAN控制器

1、CAN控制器介绍 (1)STM32 CAN控制器(bxCAN)&#xff0c;支持CAN 2.0A和CAN 2.0B Active版本协议。 bxCAN存在于F1、F4、F7系列的STM32。H7系列称作FDCAN。 (2)CAN 2.0A 只能处理标准数据帧且扩展帧的内容会识别错别&#xff0c;而CAN 2.0B Active可以处理标准数据帧和扩展…

unity中:搭建在线AR应用

使用Imagine WebAR - Image Tracker插件部署WebGL应用 在使用Imagine WebAR - Image Tracker插件进行WebGL应用开发时&#xff0c;有两个关键知识点需要掌握&#xff1a; 1. 部署到支持HTTPS的服务器 由于WebGL应用需要访问用户的摄像头&#xff0c;因此必须在支持HTTPS的服…

挡墙边界提取

基于点云对挡墙边界进行提取 算法思路 将点转到极坐标系下&#xff0c;并得到极坐标系下的索引值&#xff0c;并输出距离信息。 double getCellIndexFromPoints(double x, double y, int& chI) {// 计算点到原点的欧几里得距离double distance sqrt(x * x y * y);// 将…

s26.Rocky Linux、CentOS和Ubuntu系统初始化脚本v7版

Rocky Linux、CentOS和Ubuntu系统初始化脚本 Shell脚本源码地址&#xff1a; Gitee&#xff1a;https://gitee.com/raymond9/shell Github&#xff1a;https://github.com/raymond999999/shell 可以去上面的Gitee或Github仓库代码拉取脚本。 版本功能v7版更新内容1.由于v…

请将图转换成以某个结点为根结点的树

题目要求&#xff1a;请将图转换为以某个结点为根结点的数。然后&#xff0c;输出所有从根结点到叶子结点的路径。 例如&#xff1a; 示例输入&#xff0c; 6 0 1 1 2 1 4 3 4 4 5期望输出&#xff0c; 1 0 1 2 1 4 3 1 4 5 解题思路1&#xff1a;创建一个全局布尔型数组…

煤老板自述三十年

《煤老板自述三十年》 这本书是一位煤老板站在他的角度与高度为读者所描写的他们眼中的社会与江湖&#xff0c;大胆、真实、开拓眼界。这本书讲述了很多真相&#xff0c;它无所不包&#xff0c;充满了各种江湖气息。煤老板们身为财富领军人物&#xff0c;经历过我们大部分人难…

基于Java技术的选课管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Vue3.0在软件开发中的能力展示

经过技术的调整与迁移之后&#xff0c;JNPF开发平台已经上线了Vue3.0版本。 JNPF是从 2014 开始研发低代码前端渲染&#xff0c;2018 年开始研发后端低代码数据模型&#xff0c;发布了JNPF开发平台。 基于SpringBootVue3的全栈开发平台&#xff0c;微服务、前后端分离架构&…

LeetCode-数组-重叠、合并、覆盖问题-中等难度

435. 无重叠区间 我认为区间类的题型&#xff0c;大多数考验的是思维能力&#xff0c;以及编码能力&#xff0c;该类题型本身并无什么算法可言&#xff0c;主要是思维逻辑&#xff0c;比如本题实际上你只需要能够总结出重叠与不重叠的含义&#xff0c;再加上一点编码技巧&#…

学生备考使用台灯到底好不好?公认好用的护眼台灯推荐

在现代生活中&#xff0c;许多学生的学习压力越来越大&#xff0c;面临的近视几率也越来越大&#xff0c;特别是初中生&#xff0c;眼睛发育还未完全&#xff0c;使用不恰当的灯光也会对眼睛造成损害&#xff0c;特别是护眼台灯。虽然护眼台灯在功能上能够提供充足、柔和的光线…

【投稿优惠|检索稳定】2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024)

2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024) 2024 International Conference on Information Systems and Engineering and the Digital Economy(ICISEDE 2024) [会议简介] 2024 年信息系统、工程与数字化经济国际会议(ICISEDE 2024)将于 2024 年 1 月 20 日在厦门…

Docker 部署 2FAuth 服务

拉取最新版本的 2FAuth 镜像&#xff1a; $ sudo docker pull 2fauth/2fauth:latest在本地预先创建好 2fauth 目录, 用于映射 2FAuth 容器内的 /2fauth 目录。 使用以下命令, 在 前台 运行 2FAuth 容器: $ sudo docker run -it --rm --name 2fauth -p 10085:8000/tcp -v /ho…

【漏洞复现】FLIR AX8红外线热成像仪命令执行漏洞

漏洞描述 eledyne FLIR 设计、开发、制造以及强大的传感和意识技术。自透射热图像、可见光图像、可见频率分析、来自测量和诊断的先进威胁测量系统以及日常生活的创新解决方案。 Teledyne FLIR 提供多种产品用于政府、国防、工业和商业市场。我们的产品,紧急救援人员,军事人…

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中&#xff0c;我们已经介绍完了MVC的架构和实现&#xff0c;现在我们来讲一下&#xff0c;SAPUI5的结构 这一步&#xff0c;我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立&#xff0c;可复用了。这样&#xff0c;无所什么时候我…