当前位置: 首页 > news >正文

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

相关文章:

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

Qt编译MySql插件教程 帮助&#xff1a; SQL Programming QSqlDatabase 静态函数 1.drivers()&#xff0c;得到可以使用的数据库驱动名字的集合 [static] QStringList QSqlDatabase::drivers();2.addDatabase()&#xff0c;添加一个数据库实例 [static] QSqlDatabase QSql…...

postgresql设置免密登录

您提供的步骤描述了在 PostgreSQL 数据库环境中配置服务器间的 SSH 无密码登录和数据库用户认证的过程。这些步骤主要用于设置一个高可用性、负载平衡的数据库集群环境。让我们逐一解释这些步骤的目的和应用场景&#xff1a; 1. 启动 PostgreSQL 服务 systemctl start postgr…...

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?

国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…...

机器学习-逻辑回归

一、引言 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的监督学习算法。尽管名字中含有“回归”二字&#xff0c;但这并不意味着它用于解决回归问题。相反&#xff0c;逻辑回归专注于解决二元或多元分类问题&#xff0c;如邮件是垃圾邮件还是…...

Edge调用Aria2下载

一、准备工作 1、Edge浏览器&#xff1a;Windows系统自带或点击下载&#xff1b;   2、Aria2 gui&#xff1a;点击github下载或自行搜索下载其他版本&#xff1b; 二、启动Aria2 gui 解压下载的Aria2 gui到任意目录&#xff0c;点击“Aria2c启动器”或“AriaNg启动器”皆可。…...

解密QQ号——C语言

题目&#xff1a; 有一串已加密的数字“6 3 1 7 5 8 9 2 4”解密规则&#xff1a;首先将第1个数字删除&#xff0c;紧接着将第2个数字放到这串数字的末尾&#xff0c;再将第3个数字删除并将第4个数字放到这串数字的末尾&#xff0c;再将第5个数删除 代码实现&#xff1a; #inc…...

三、jvm中的对象及引用

一、对象在jvm的创建过程 检查加载-->分配内存-->内存空间初始化-->设置-->对象初始化 1) 检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查类是否已经被加载、解析和初始化过。 虚拟机遇到一条 new 指令时&#xf…...

Docker网络架构介绍

本文主要介绍了Docker容器的单机网络架构与集群网络架构&#xff0c;辅以演示&#xff0c;并简单介绍了网络管理中的命令。 前文&#xff1a; Docker的安装与简单操作命令-CSDN博客 docker网络原理介绍 与ovs类似&#xff0c;docker容器采用veth-pair linux bridge (虚拟交…...

Android studio新版本aar包导入项目中配置

目录 1、so、aar导入在项目build.gradle中配置 2、新版本迁移到setting.grade配置 1、so、aar导入在项目build.gradle中配置 repositories {flatDir {dirs libs} }2、新版本迁移到setting.grade配置 flatDir {dirs libs } 如下图所示 pluginManagement {repositories {gra…...

HBase-架构与设计

HBase架构与设计 一、背景二、HBase概述1.设计特点2.适用场景2.1 海量数据2.2 稀疏数据2.3 多版本数据2.4 半结构或者非结构化数据 三、数据模型1.表逻辑结构2.RowKey3.Column Family4.TimeStamp5.存储结构 四、HBase架构图1.Client2.Zookeeper3.HMaster4.HRegionServer5.HRegi…...

SpringBoot基础系列:工具类使用

断言 Assert // 要求参数 object 必须为非空&#xff08;Not Null&#xff09;&#xff0c;否则抛出异常&#xff0c;不予放行 // 参数 message 参数用于定制异常信息。 void notNull(Object object, String message) // 要求参数必须空&#xff08;Null&#xff09;&#xff…...

使用 nohup java - jar 不输出日志

要在使用nohup java -jar命令时不输出日志&#xff0c;可以将标准输出和标准错误输出重定向到特殊设备文件/dev/null。这样做将会丢弃所有的输出。 以下是在Linux中使用nohup java -jar命令并禁止输出日志的示例&#xff1a; 复制代码 nohup java -jar your-application.jar …...

前端开发学习 (五) 生命周期函数、Ajax请求

关于vue实例的声明周期&#xff0c;从Vue实例创建、运行、到销毁期间&#xff0c;总是伴随着各种各样的事件&#xff0c;这些事件&#xff0c;统称为生命周期 &#xff08;https://cn.vuejs.org/v2/guide/instance.html#实例生命周期 &#xff09; 而声明周期勾子就是生命周期…...

TypeScript中的单件设计模式

基本概念 &#xff08;1&#xff09; 了解设计模式 设计模式通俗的讲&#xff0c;就是一种更好的编写代码方案&#xff0c;打个比喻&#xff1a;从上海到武汉&#xff0c;你可以选择做飞机&#xff0c;做轮船&#xff0c;开车&#xff0c;骑摩托车多种方式&#xff0c;把出行…...

【无标题】安装环境

这里写目录标题 清华镜像加速 安装cuda11.3 PyTorch 1.10.1https://pytorch.org/get-started/previous-versions/[如果没有可以点Previous pyTorch Versions&#xff0c;这里面有更多的更早的版本](https://pytorch.org/get-started/locally/) 复制非空文件夹cp: -r not specif…...

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面&#xff0c;去思考他的设计层面时&#xff0c;你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释&#xff0c;在各个百科以及算法的书中&#xf…...

qt 使用百度在线地图 方法1

在使用Qt和百度在线地图时&#xff0c;你需要从百度地图开放平台获取API密钥&#xff0c;并使用该密钥在Qt应用程序中集成百度地图。以下是一个简单的示例&#xff0c;演示了如何在Qt中使用百度在线地图&#xff1a; 1&#xff0c;首先&#xff0c;从百度地图开放平台获取API密…...

轻快小miniconda3在linux下的安装配置-centos9stream-Miniconda3 Linux 64-bit

miniconda与anaconda的区别&#xff1a; Miniconda 和 Anaconda 是用于管理环境和安装软件包的 Python 发行版。它们之间的主要区别在于以下几点&#xff1a; 1. 安装内容和大小&#xff1a; Anaconda&#xff1a; Anaconda 是一个完整的 Python 数据科学平台&#xff0c;包含…...

C语言——字符函数和字符串函数(一)

&#x1f4dd;前言&#xff1a; 这篇文章对我最近学习的有关字符串的函数做一个总结和整理&#xff0c;主要讲解字符函数和字符串函数&#xff08;strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat&#xff09;的使用方法&#xff0c;使用场景和一些注意事项&…...

15.Java程序设计-基于SSM框架的微信小程序校园求职系统的设计与实现

摘要&#xff1a; 本研究旨在设计并实现一款基于SSM框架的微信小程序校园求职系统&#xff0c;以提升校园求职流程的效率和便捷性。通过整合微信小程序平台和SSM框架的优势&#xff0c;本系统涵盖了用户管理、职位发布与搜索、简历管理、消息通知等多个功能模块&#xff0c;为…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...