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

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

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

相关文章

慢SQL诊断

最近经常遇到技术开发跑来问我慢SQL优化相关工作&#xff0c;所以干脆出几篇SQL相关优化技术月报&#xff0c;我这里就以公司mysql一致的5.7版本来说明下。 在企业中慢SQL问题进场会遇到&#xff0c;尤其像我们这种ERP行业。 成熟的公司企业都会有晚上的慢SQL监控和预警机制。…

Logstash输入Kafka输出Es配置

Logstash介绍 Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据&#xff0c;并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志&#xff0c;但现在的功能已经远远超出这个范围。任何事件类型都可…

FastAPI之响应模型

前言 响应模型我认为最主要的作用就是在自动化文档的显示时&#xff0c;可以直接给查看文档的小伙伴显示返回的数据格式。对于后端开发的伙伴来说&#xff0c;其编码的实际意义不大&#xff0c;但是为了可以不用再额外的提供文档&#xff0c;我们只需要添加一个 response_mod…

汽车服务行业分析:预计2028年将达到38亿元

在推进加快检验机构建设同时&#xff0c;综合评估检验机构数量、分布和检测能力&#xff0c;探索试点汽车 4S 店开展检验&#xff0c;提供维修、保养、车检一体化服务。汽车服务主要是指围绕汽车展开的一系列服务活动&#xff0c;包括维修、美容、金融等&#xff0c;除具有一般…

springboot3 liquibase SQL执行失败自动回滚,及自动打tag

一&#xff1a; 自动执行回滚&#xff0c; 已执行成功的忽略&#xff0c;新sql执行失败则执行新sql文件中的回滚sql pom.xml <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>4.25.0&…

Appium 并行测试多个设备

一、前置说明 在自动化测试中&#xff0c;经常需要验证多台设备的兼容性&#xff0c;Appium可以用同一套测试运例并行测试多个设备&#xff0c;以达到验证兼容性的目的。 解决思路&#xff1a; 查找已连接的所有设备&#xff1b;为每台设备启动相应的Appium Server&#xff1b…

从手工测试进阶中高级测试?如何突破职业瓶颈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、手工测试如何进…

物联网安全芯片ACL16 采用 32 位内核,片内集成多种安全密码模块 且低成本、低功耗

ACL16 芯片是研制的一款32 位的安全芯片&#xff0c;专门面向低成本、低功耗的应用领域&#xff0c; 特别针对各类 USB KEY 和安全 SE 等市场提供完善而有竞争力的解决方案。芯片采用 32 位内核&#xff0c;片内集成多种安全密码模块&#xff0c;包括SM1、 SM2、SM3、 SM4 算法…

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署&#xff0c;10月7日&#xff0c;杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单&#xff08;第二批&#xff09;。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业…

【教3妹学编程-算法题】需要添加的硬币的最小数量

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到新闻&#xff0c; 有人中了2.2亿彩票大奖&#xff01; 2哥 : 看到了&#xff0c;2.2亿啊&#xff0c; 一生一世也花不完。 3妹&#xff1a;为啥我就中不了呢&#xff0c;不开心呀不开心。 2哥 : 得了吧&#xff0c;你又不买彩票&…

最强文生图跨模态大模型:Stable Diffusion

文章目录 一、概述二、Stable Diffusion v1 & v22.1 简介2.2 LAION-5B数据集2.3 CLIP条件控制模型2.4 模型训练 三、Stable Diffusion 发展3.1 图形界面3.1.1 Web UI3.1.2 Comfy UI 3.2 微调方法3.1 Lora 3.3 控制模型3.3.1 ControlNet 四、其他文生图模型4.1 DALL-E24.2 I…

Navicat 技术指引 | 适用于 GaussDB 分布式的服务器对象的创建/设计

Navicat Premium&#xff08;16.3.3 Windows版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构…

NestJS的微服务实现

1.1 基本概念 微服务基本概念&#xff1a;微服务就是将一个项目拆分成多个服务。举个简单的例子&#xff1a;将网站的登录功能可以拆分出来做成一个服务。 微服务分为提供者和消费者&#xff0c;如上“登录服务”就是一个服务提供者&#xff0c;“网站服务器”就是一个服务消…

【C++】类与对象(下)

本文目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 2. static成员2.1 概念2.2 特性 3. 友元3.1 友元函数3.2 友元类 4. 内部类5. 匿名对象6. 拷贝对象时的一些编译器优化7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&am…

jsonpath:使用Python处理JSON数据

使用Python处理JSON数据 25.1 JSON简介 25.1.1 什么是JSON JSON全称为JavaScript Object Notation&#xff0c;一般翻译为JS标记&#xff0c;是一种轻量级的数据交换格式。是基于ECMAScript的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清…

用 C 写一个卷积神经网络

用 C 写一个卷积神经网络 深度学习领域最近发展很快&#xff0c;前一段时间读transformer论文《Attention Is All You Need》时&#xff0c;被一些神经网络和深度学习的概念搞得云里雾里&#xff0c;其实也根本没读懂。发现深度学习和传统的软件开发工程领域的差别挺大&#xf…

智能优化算法应用:基于入侵杂草算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于入侵杂草算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于入侵杂草算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.入侵杂草算法4.实验参数设定5.算法结果6.…

【FPGA】Verilog:BCD 加法器的实现 | BCD 运算 | Single-level 16 bit 超前进位加法器 | 2-level 16-bit 超前进位加法器

0x00 BCD 运算 在 BCD 中,使用4位值作为操作数,但由于只表示 0 到 9 的数字,因此只使用 0000 到 1001 的二进制数,而不使用 1010 到 1111 的二进制数(dont care)。 因此,不能使用常规的 2complement 运算来计算,需要额外的处理:如果 4 位二进制数的运算结果在 1010 …

quickapp_快应用_快应用与h5交互

快应用与h5交互 h5跳转到快应用[1] 判断当前环境是否支持组件跳转快应用[2] h5跳转到快应用(1)deeplink方式进行跳转(推荐)(2)h5点击组件(接收参数存在问题)(3)url配置跳转(官方不推荐) 问题-浏览器问题 web组件h5页面嵌入快应用快应用发送消息到h5页面h5页面接收快应用发送的消…

网络攻击(一)--安全渗透简介

1. 安全渗透概述 目标 了解渗透测试的基本概念了解渗透测试从业人员的注意事项 1.1. 写在前面的话 在了解渗透测试之前&#xff0c;我们先看看&#xff0c;信息安全相关的法律是怎么样的 中华人民共和国网络安全法 《中华人民共和国网络安全法》由全国人民代表大会常务委员会…