Qt 添加MySQL驱动教程 以及 操作数据库(增删查改)

news2024/11/22 14:54:45

前言:
使用MySQL数据库前我们必须添加MySQL驱动,有了驱动我们才能连接数据库,连接数据库成功后才能操作数据库(增删查改)。
Qt 添加MySQL驱动教程 如下(本人亲测成功版):

https://download.csdn.net/download/qq_42432673/88093467

在数据库中创建表,表结构如下:
在这里插入图片描述
现在驱动已经引入完成,数据库表也创建好了,下面我们开始写代码:

引入模块:

QT += core gui sql

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
    // 连接数据库
    void connectDataBase();
    // 查询操作
    void search();
    // 插入操作
    void insert();
    // 修改操作
    void update();
    // 删除操作
    void deleteData();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 连接数据库
    connectDataBase();
    // 查询操作
    search();
    // 插入操作
    insert();
    // 修改操作
    update();
    // 删除操作
    deleteData();
}

MainWindow::~MainWindow()
{
    delete ui;
}
// 连接数据库
void MainWindow::connectDataBase()
{
    // 数据库类型
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    // 数据库主机地址
    db.setHostName("127.0.0.1"); 
    // 数据库用户名
    db.setUserName("root");
    // 数据库密码
    db.setPassword("123456");
    // 数据库名称
    db.setDatabaseName("practice");
    // 打开数据库
    if(false == db.open())
    {// 数据库打开失败
        qDebug()<<"数据库连接失败!!!";
        qDebug()<<db.lastError().text();
    }
    else
    {// 数据库打开成功
        qDebug()<<"success...";
    }
}
// 查询操作
void MainWindow::search()
{
    QString sql = "select * from user";
    QSqlQuery query;
    // 执行 sql 语句
    query.exec(sql);
    // 遍历完为 false
    while(query.next())
    {
        // 使用下标的方式查询表中数据
        qDebug()<<query.value(0).toInt()<<query.value(1).toString()<<query.value(2).toInt();
        // 使用字段的方式查询表中数据
        qDebug()<<query.value("id").toInt()<<query.value("name").toString()<<query.value("age").toInt();
    }
}
// 插入操作
void MainWindow::insert()
{
    // 注意:插入的主键(id)不能重复,否则插入失败
    QString sql = "insert into user(id,name,age) values(3,'小王',20)";
    QSqlQuery query;
    if(query.exec(sql))
    {
        // 数据插入成功
        qDebug()<<"insert success...";
    }
    else
    {
        // 数据插入失败
        qDebug()<<query.lastError().text();
    }
}
// 修改操作
void MainWindow::update()
{
    QString sql = "update user set name = '小张',age = 100 where id = 1";
    QSqlQuery query; 
    query.exec(sql);
}
// 删除操作
void MainWindow::deleteData()
{
    QString sql = "delete from user where id = 2";
    QSqlQuery query;
    query.exec(sql);
}

除了上面简单的增删查改以外,还可以多语句执行:

// 多语句执行
// 每条语句用分号隔开就可以同时执行多条语句
// 同时对表格进行增加、删除和更新操作
void MainWindow::multiQuery()
{
    QString sql = "insert into user(id,name,age) values(4,'小王',20);delete from user where id = 2;update user set name = '小张',age = 100 where id = 1;";
    QSqlQuery query;
    if(query.exec(sql))
    {
        // 执行成功
        qDebug()<<"multiQuery() success...";
    }
    else
    {
        // 执行失败
        qDebug()<<query.lastError().text();
    }
}

批处理执行(方法一):

// 批处理 方法一
// addBindValue()绑定值的顺序需要与 id、name、age 的顺序一致
void MainWindow::batchQuery()
{
    QSqlQuery query;
    // 待输入的值用通配符 “?” 代替
    query.prepare("insert into user(id,name,age) values(?,?,?)");
    
    // 创建 id 列表
    QVariantList idList;
    idList << 10 << 11 << 12;
    // 完成第一个 ? 的绑定
    query.addBindValue(idList); 
    
    // 创建 name 列表
    QVariantList nameList;
    nameList << "小明" << "小米" << "小艾";
    //完成第二个 ? 的绑定
    query.addBindValue(nameList);
    
    // 创建 age 列表
    QVariantList ageList;
    ageList << 18 << 19 << 20;
    // 完成第三个 ? 的绑定
    query.addBindValue(ageList);
    
    // 执行批处理
    query.execBatch();
}

批处理执行(方法二):

// 批处理 方法二
// 使用自定义的名称来完成绑定,这时绑定顺序可以自己决定
void MainWindow::batchQuery2()
{
    QSqlQuery query;
    // :id :name :age 是自定义的
    query.prepare("insert into user(id,name,age) values(:id,:name,:age)");
    
    // 创建 id 列表
    QVariantList idList;
    idList << 20 << 21 << 22;
    // 完成 :id 的绑定
    query.bindValue(":id",idList);
    
    // 创建 name 列表
    QVariantList nameList;
    nameList << "小明" << "小米" << "小艾";
    // 完成 :name 的绑定
    query.bindValue(":name",nameList);
    
    // 创建 age 列表
    QVariantList ageList;
    ageList << 18 << 19 << 20;
    // 完成 :age 的绑定
    query.bindValue(":age",ageList);

    //执行批处理
    query.execBatch();
}

一定要注意,插入数据的时候,主键id不能重复,否则插入失败,切记!!!

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

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

相关文章

【SQL语句】

目录 一、SQL语句类型 1.DDL 2.DML 3.DLL 4.DQL 二、数据库操作 1.查看 2.创建 2.1 默认字符集 2.2 指定字符集 3.进入 4.删除 5.更改 5.1 库名称 5.2 字符集 三、数据表操作 1.数据类型 1.1 数值类型&#xff08;常见&#xff0c;下同&#xff09; 1.1.1 T…

【IDEA】IDEA 中点击Download Source(下载源码)后,下载的源码存储到哪了?

【问】如上图&#xff0c;IDEA 中点击 Download Source&#xff08;下载源码&#xff09;后&#xff0c;下载的源码存储到哪了&#xff1f; 【答】 先找到此源码所属 Jar 包在哪&#xff1b;点击 Download Source&#xff08;下载源码&#xff09;后&#xff0c;会发现存储 J…

文件读写流函数

文件 文件读写 链接 std::ifstream---std::ofstream 头文件--#include <fstream> 执行都是类&#xff0c;用这些类操作文件都要建立对象流。 1&#xff0c;建立对象流 流对象的建立有两种方式&#xff1a; &#xff08;1&#xff09;使用fstream类可以不指定文件和…

C# winform子窗口向父窗口传值

这里我使用一个简单的方法。只需要在父窗口定义一个静态变量就行。 父窗体为Form1,子窗体为Form2。 public static int get_num0; 子窗体直接给get_num赋值即可。 Form1.get_num2; 这样父窗体就能获得get_num修改后这个值了

若依vue 多table前端HTML页面导出一张Excel表

前言 导入依赖&#xff0c;具体前端vue配置就不介绍了&#xff0c;直接晒具体细节代码 实现 需要在多table外加div&#xff0c;其他都是基本操作js代码 import FileSaver from file-saver import * as XLSX from "xlsx";const htmlToExcel {getExcelNew(classNam…

实验二十四、滞回比较器电压传输特性的测量

一、题目 滞回比较器电压传输特性的测量。 二、仿真电路 电路如图1所示。 为便于观察电压传输特性的变化&#xff0c;输入信号采用信号发生器产生的幅值为 10 V 10\,\textrm V 10V、频率为 20 Hz 20\,\textrm{Hz} 20Hz 的三角波电压。采用虚拟的运算放大电路&#xff0c;其…

自学网络安全(黑客)两个月都没入门?

最近我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给你一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之后…

DP学习第三篇之不同路径

DP学习第三篇之不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 一.题目解析 二. 算法原理 状态表示 tips: 经验题目要求。以[i,j]位置为结尾&#xff0c;。。。 dp[i][j]: 走到[i, j]位置时&#xff0c;一共多少种路径 状态转移方程 tips: 用之前或之后的状…

Visual Studio 2022 cmake配置opencv开发环境

1. 环境与说明 这里我用的是 widnows 10 64位&#xff0c;Visual Studio 用的 Visual Studio Community 2022 (社区版) 对于Android开发工程师来说&#xff0c;为什么要使用Visual Studio 呢 ? 因为在Visual Studio中开发调试OpenCV方便&#xff0c;可以开发调试好后&#xf…

DDQN求解FJSP问题

柔性调度问题代码&#xff0c;DDQN求解FJSP问题 迭代曲线图 奖励函数迭代曲线 makespan迭代曲线 代码&#xff01;&#xff01; 全部见我的git仓库: DFJSP_Share DDQN算法主体 import csv import os from environment2.Environment import Environment import torch from …

生物信息学_玉泉路_课堂笔记_05 第五章 从头基因组组装与注释

&#x1f345; 课程&#xff1a;生物信息学_玉泉路_课堂笔记 中科院_2022秋季课 第一学期 &#x1f345; 个人笔记使用 &#x1f345; 2023/7/20 上周回顾 从头基因组组装与注释 第一节 基因组调查 最左边的 error-peak 是测序错误导致的 杂合导致的峰 重复序列 在纯和峰值的右…

简单明了证明多态虚表是位于常量区

证实虚表存储与常量区 class Person { public:virtual void BuyTicket() { cout << "买票-全价" << endl; }virtual void Func1() {cout << "Person::Func1()" << endl;}virtual void Func2() {cout << "Person::Func…

2 mybatis常见错误汇总

2.1 org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 6; 不允许有匹…

ubuntu 20.04 rtc时间显示问题探究

1、硬件与软件 本次测试的硬件为RK3568芯片&#xff0c;操作系统为ubuntu 20.04。 2、RTC与系统时间 先说结果&#xff0c;如果RTC驱动不可用或者RTC内部存储的时间非法&#xff0c; 那么操作系统会存储上一次有效的时间&#xff0c;当再次上电时&#xff0c;date命令会使用存储…

gitee上创建新仓库如何clone到本地,并初始化项目

目录 一、克隆 方法一 方法二 二、初始化项目 构建基本框架 自动生成代码 一、克隆 方法一 由于github速度较慢&#xff0c;这里我们使用gitee。我们在gitee上面创建一个仓库&#xff0c;然后我们可以通过ideal直接克隆下来&#xff0c;仓库设置如下 接着使用ideal将项…

Matlab 点云平面特征提取

文章目录 一、简介二、实现代码2.1基于k个邻近点2.2基于邻近半径参考资料一、简介 点云中存在这各种各样的几何特征,这里基于每个点的邻域协方差来获取该点的所具有的基础几何特征(如下图所示),这样的做法虽然不能很好的提取出点云中的各个部分,但却是可以作为一种数据预处…

超越POSIX:一个时代的终结?

在本文中&#xff0c;我们通过对Portable Operating System Interface&#xff08;POSIX&#xff09;抽象的历史演变进行系统性的回顾&#xff0c;提供了一个全面的视图。我们讨论了推动这些演变的一些关键因素&#xff0c;并确定了在构建现代应用程序时使它们不可行的缺陷。 …

想要快速进阶车载测试!这些基础问题你一定要知道

1.简述ADCU(域控)有哪些基本组成单元&#xff1f; MCU,SOC,加解串器&#xff0c;CAN收发器&#xff0c;网络交换机&#xff0c;电源管理模块芯片PMIC等。 2.MCU和SOC的区别是什么&#xff1f;主要应用场景分别有哪些&#xff1f; MCU为主控芯片&#xff0c;底盘域以及车身域等…

拓扑排序模板(附带题解:有向图的拓扑序列+Fine Logic)

目录 应用的问题&#xff1a; 原理解释及性质&#xff1a; 原理&#xff1a; 性质&#xff1a; 解题模板&#xff1a; 模板1&#xff1a; 模板2&#xff1a; 例题&#xff1a; 例题1&#xff1a;有向图的拓扑序列 题目描述&#xff1a; 思路&#xff1a; 代码详解&…

【Linux】文件描述符及重定向

目录 文件描述符的引入 什么是文件描述符 文件描述符的分配规则 重定向 输出重定向 输入重定向 追加重定向 dup2() 文件描述符的引入 上一章&#xff0c;我们讲解了系统接口&#xff0c;了解了open()函数的返回值是一个整数.那么这个整数究竟是什么呢&#xff1f;我们可…