Qt连接MySQL数据库最详细的教程

news/2024/5/10 2:56:06/文章来源:https://blog.csdn.net/m0_46577050/article/details/130377947

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.直接通过MySQL的驱动加载数据库
    • 1)所需代码
    • 2)解决QMYSQL driver not loaded
  • 2.通过ODBC连接MySQL数据库
    • 1)官方解释
    • 2)下载ODBC
    • 3)连接MySQL数据库
    • 4)qt通过ODBC连接MySQL
  • 3.qt通过ODBC操作数据库
    • 1)查询数据
    • 2)插入数据
    • 3)更新数据
  • Win10安装MySQL出现错误2503 2502 的解决办法
  • QT使用ODBC连接MySQL


原文链接:https://blog.csdn.net/joey_ro/article/details/105411135

被Qt连接数据库折磨了三天之后终于连接成功了,记录一下希望对看到的人有所帮助。

1.直接通过MySQL的驱动加载数据库

1)所需代码

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("127.0.0.1");db.setPort(3306);db.setDatabaseName("数据库名");db.setUserName("用户名");db.setPassword("密码");bool ok = db.open();if (ok){QMessageBox::information(this, "infor", "success");}else {QMessageBox::information(this, "infor", "open failed");qDebug()<<"error open database because"<<db.lastError().text();}

当然要在.pro文件中添加一行引入

QT += sql

如果显示:
在这里插入图片描述
那么恭喜你太幸运了,你已经成功连接MySQL数据库了,快去使用吧。
如果显示:
在这里插入图片描述
也不要灰心接着往下看我的电脑就一直显示失败
在这里插入图片描述
没有QMYSQL的驱动,这是怎么回事呢?

2)解决QMYSQL driver not loaded

Qt连接到mysql的过程:app->Qt的数据库插件->mysql动态库->mysql服务。

Qt的数据库插件位于“C:\Qt(安装路径)(Qt版本)\版本号(库)\mingw49_32(编译器)\plugins(插件)\sqldrivers(数据库插件)” 下的qsqlmysqld.dll(debug版本用) qsqlmysql.dll(release版本用).

mysql动态库位于“C:\Qt\MySQLServer5.5(mysql安装路径)\lib”下的“libmysql.dll“

i:将mysql下的ilbmysql.lib和libmysql.dll复制到Qt的bin目录下
ii:查看自己的qt中有没有qsqlmysqld.dll(debug版本用) qsqlmysql.dll(release版本用)
如果都有:
运行一下代码:

//输出可用数据库qDebug()<<"available drivers:";QStringList drivers = QSqlDatabase::drivers();foreach(QString driver, drivers)qDebug()<<driver;

如果输出中含有MySQL,那么恭喜你说明你的qt有MySQL驱动了:
在这里插入图片描述
如果没有,不要灰心,因为我的就是一直没有MySQL驱动:
在这里插入图片描述
大家可以重新下载一些不同的版本尝试一下,我尝试了无数次后不得不放弃,就选择了另一条路,通过ODBC连接MySQL数据库。

2.通过ODBC连接MySQL数据库

1)官方解释

ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来访问数据库管理系统(DBMS)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC的设计者们努力使它具有最大的独立性和开放性:与具体的编程语言无关,与具体的数据库系统无关,与具体的操作系统无关。
简单的说就是我的qt中含有ODBC的驱动:

在这里插入图片描述
所以利用ODBC去使用MySQL的数据库。

2)下载ODBC

官网
https://dev.mysql.com/downloads/connector/odbc/

在这里插入图片描述
选择和qt编译器相同的字节比如我的qt使用的是64字节的
在这里插入图片描述

下载的ODBC选择的也是64字节的,选择MSI类型的直接安装就可以
在这里插入图片描述
下载一直点击next即可:
在这里插入图片描述
查看点击小娜,搜索ODBC,
在这里插入图片描述

3)连接MySQL数据库

i添加MySQL的DSN
在这里插入图片描述
红色的可以随便填,是自己对于ODBC驱动的描述,粉色的是MySQL的用户名和密码,数据库选择你在MySQL中创建的数据库名字即可。
在这里插入图片描述
点击test如果出现下图说明连接成功
在这里插入图片描述
在这里插入图片描述
需要依次填写,其中Data Source Name在使用QT连接ODBC时会用到,此处我写了3,自己取个名字即可。对于Description没有要求,随便写个默认的描述就行。最下面的Database要选择你自己电脑中的数据库,比如我的数据库式binshop,我就选择binshop,选择数据库后点击旁边的Test,可以测试时候连接成功。
本文测试用到的sql文件一并放在下载连接里面,需要的可以直接下载。完成后如下所示。多了一条名称为3的描述

原文链接:https://blog.csdn.net/weixin_43552197/article/details/123550924
在这里插入图片描述

4)qt通过ODBC连接MySQL

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");db.setHostName("127.0.0.1");db.setPort(3306);db.setDatabaseName("是你在ODBC中创建的Data source name");db.setUserName("用户名");db.setPassword("密码");bool ok = db.open();if (ok){QMessageBox::information(this, "infor", "success");}else {QMessageBox::information(this, "infor", "open failed");qDebug()<<"error open database because"<<db.lastError().text();}

运行程序:
在这里插入图片描述
大功告成

3.qt通过ODBC操作数据库

1)查询数据

代码:

//查询数据库中所有表的名称QStringList tables = db.tables();foreach(QString table, tables)qDebug()<<table;//ODBC查询数据QSqlQuery result = db.exec(" select * from users");while(result.next()){qDebug()<<"user_id:"<<result.value("user_id").toInt();qDebug()<<"name:"<<result.value("name").toString();qDebug()<<"password:"<<result.value("password").toString();qDebug()<<"score:"<<result.value("score").toInt()<<endl;}

2)插入数据

//ODBC插入数据result.clear();bool result_successed = result.exec("insert into users(name,password,score) values ( 'joe2y','123456',0)");if(result_successed){qDebug()<<"插入成功!";}else {qDebug()<<"插入失败!";
}

3)更新数据

//ODBC更新数据result.clear();bool result_successed2 = result.exec("update users set score=10 where user_id=2");if(result_successed2){qDebug()<<"更新成功!"<<endl;}else{qDebug()<<"更新失败!"<<endl;}

Win10安装MySQL出现错误2503 2502 的解决办法

原文链接:https://blog.csdn.net/qq_43422918/article/details/116202995

  1. 打开任务管理器:Ctrl+Alt+Del。

  2. 点击任务管理器左上角的文件按钮:
    在这里插入图片描述

  3. 再点击 运行新任务(n)按钮。

  4. 手动输入所下载的MySQL安装文件的地址+文件名。比如我放在D:\MySQL文件夹里,文件名为:mysql-installer-web-community-5.7.21.0.msi,就输入:D:\MySQL\mysql-installer-web-community-5.7.21.0.msi,务必要打上 下面的勾。
    在这里插入图片描述

  5. 点击确定进行安装,祝安装成功!

QT使用ODBC连接MySQL

https://blog.csdn.net/weixin_43552197/article/details/123550924?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168247337716800180645494%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168247337716800180645494&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-123550924-null-null.142v86control,239v2insert_chatgpt&utm_term=qt%20odbc%E8%BF%9E%E6%8E%A5mysql&spm=1018.2226.3001.4187

widget.h文件如下

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QStringList>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QString>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void QueryData(QSqlDatabase db);private slots:void on_pushButton_clicked();void on_tableView_doubleClicked(const QModelIndex &index);private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp如下

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::QueryData(QSqlDatabase db)
{// 查询数据库中所有表的名称QStringList tables = db.tables();foreach(QString table, tables)qDebug()<<table;// ODBC查询数据QSqlQuery result = db.exec("select * from commodity");while(result.next()){qDebug()<<"user_id:"<<result.value("ID").toInt();qDebug()<<"name:"<<result.value("name").toString();qDebug()<<"password:"<<result.value("type").toString();qDebug()<<"score:"<<result.value("price").toInt()<<endl;}// 将数据库的内容显示到tableview控件中static QSqlQueryModel *mode= new QSqlQueryModel(ui->tableView);mode->setQuery("select * from commodity");mode->setHeaderData(0,Qt::Horizontal,tr("ID"));mode->setHeaderData(1, Qt::Horizontal, tr("name"));mode->setHeaderData(2,Qt::Horizontal,tr("type"));mode->setHeaderData(3, Qt::Horizontal, tr("price"));ui->tableView->setModel(mode);}// 查询按钮
void Widget::on_pushButton_clicked()
{// 通过ODBC连接MYSQL数据库QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");db.setHostName("127.0.0.1");db.setPort(3306);// 使用ODBC连接时自己设置的名字(data source name)db.setDatabaseName("3");db.setUserName("root");db.setPassword("123456");bool ok = db.open();// 判断数据库是否连接成功if (ok){// QMessageBox::information(this, "infor", "success");}else {// QMessageBox::information(this, "infor", "open failed");qDebug()<<"error open database because"<<db.lastError().text();}//db.exec("insert commodity values('005','显卡','RTX3090',9500)");// 指定条件查询QSqlQuery query("SELECT * FROM `commodity` where price > 8000",db);QSqlRecord rec = query.record();while(query.next()){rec = query.record();int id = rec.indexOf("ID");QString ID = query.value(id).toString();qDebug()<<"ID"<<ID;int na = rec.indexOf("name");QString name = query.value(na).toString();qDebug()<<"name"<<name;}QueryData(db);
}
// 给tableview添加双击事件。
void Widget::on_tableView_doubleClicked(const QModelIndex &index)
{int row=index.row();int col=index.column();// qDebug()<<row;// qDebug()<<col;QString id = ui->tableView->model()->index(row,col).data().toString();qDebug()<<id;
}

main.cpp如下

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

UI文件如下
在这里插入图片描述
只增加了一个按钮和一个tableview。
,程序运行的结果如下
在这里插入图片描述

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

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

相关文章

taro之项目初始化模版

项目初始化模板 一直以来&#xff0c;在使用 Taro CLI 的 taro init 命令创建项目时&#xff0c;CLI 会提供若干内置模板给开发者选择。但是很多团队都有自己独特的业务场景&#xff0c;需要使用和维护的模板也不尽一致&#xff0c;因此 Taro 支持把项目模板打包成一个能力赋予…

《Netty》从零开始学netty源码(四十四)之PoolChunk释放内存

free 当PoolChunk需要释放内存空间时可调用free方法&#xff0c;具体的源码过程如下&#xff1a; 在这个过程中最重要的是第三步的collapseRuns方法&#xff0c;当释放了空间以后要更新runsAvail和runAvailsMap的信息&#xff0c;如果handle对应的内存空间的上边界以及下边界是…

任务调度原理 通俗详解(FreeRTOS)

寄存器说明 以cortex-M3&#xff0c;首先先要了解比较特别的几个寄存器&#xff1a; r15 PC程序计数器&#xff08;Program Counter&#xff09;,存储下一条要执行的指令的地址。 r14 LR连接寄存器&#xff08;Link Register &#xff09;&#xff0c;保存函数返回地址&#x…

代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和、474.一和零

文章目录 背包问题题型1049. 最后一块石头的重量 II494. 目标和474.一和零 背包问题题型 等和子集 —0-1背包能否装满最后一块石头—0-1背包尽量装满目标和—0-1背包装满&#xff0c;且有多少种装的方式&#xff08;组合问题&#xff09; 1049. 最后一块石头的重量 II 题目链…

从数据处理到人工智能(常用库的介绍)

Python库之数据分析 ​​​​​​​​​​​​ 可以这么理解pandas通过扩展了对一维数据和二维数据的一种表示&#xff0c;因而能够形成更高层对数据的操作&#xff0c;简化数据分析的运行 Python库之数据可视化 Matplotlib — Visualization with Python seaborn: statistic…

C++ 编程笔记(本人出品,必属精品)

文章目录 Part.I IntroductionChap.I 快应用 Part.II C 基础Chap.I 一些待整理的知识点Chap.I 常用的库或类 Part.III 杂记Part.X Others WorkChap.I 大佬的总结Chap.II 大佬的轮子 Part.I Introduction 前言&#xff1a;C 用的人还是比较多的&#xff0c;主要是它比较快并且面…

不是什么高深玩意,Arrays.asList、ArrayList.subList需要注意的坑

前言 集合是日常工作中几乎每天都在用的玩意&#xff0c;也是八股文中被翻烂的东西&#xff0c;诸如List、Map&#xff0c;确实很重要也很实用&#xff0c;但是不注意细节就比较容易踩坑。比较常见的就是今天要整理的Arrays.asList和ArrayList.subList。不是什么高深的东西&…

Oracle跨服务器取数——DBlink 初级使用

前言 一句话解释DBlink是干啥用的 实现跨库访问的可能性. 通过DBlink我们可以在A数据库访问到B数据库中的所有信息,例如我们在加工FDS层表时需要访问ODS层的表,这是就需要跨库访问 一、DBlink的分类 private&#xff1a;用户级别&#xff0c;只有创建该dblink的用户才可以使…

一篇文章告诉你金融行业如何高效管理文件

由于金融行业的行业属性&#xff0c;信息安全万分重要。因此在文件管理工具时&#xff0c;要注意数据安全问题&#xff0c;那么金融行业如何高效管理文件呢&#xff1f; 首先金融行业在文件管理时可能面临以下问题&#xff1a; 1&#xff0c;资料繁杂&#xff0c;整理困难&…

starrocks基于prometheus实现监控告警

监控报警 本文介绍如何为 StarRocks 设置监控报警。 StarRocks 提供两种监控报警的方案。企业版用户可以使用内置的 StarRocksManager&#xff0c;其自带的 Agent 从各个 Host 采集监控信息&#xff0c;上报至 Center Service&#xff0c;然后做可视化展示。StarRocksManager …

虹科新品 | 用于医疗应用的压力和气体流量传感器

ES Systems在创新MEMS方面拥有丰富的经验&#xff0c;设计了高质量和高性能的气体流量和压力传感器&#xff0c;由于其技术规格&#xff0c;出色的可靠性和有竞争力的价格&#xff0c;这些传感器在竞争产品中具有独特的品质。 Part.01 应用背景 众所周知&#xff0c;在医疗领域…

在函数中使用变量

shell脚本编程系列 向函数传递参数 函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。其中函数名保存在$0变量中&#xff0c;函数参数则依次保存在$1、$2等变量当中&#xff0c;也可以使用特殊变量$#来确定参数的个数 在脚本中调用函数时&#xff0c;必须将参…

【SWAT水文模型】SWAT水文模型建立及应用第四期: 气象数据的准备(待更新)

SWAT水文模型建立及应用&#xff1a; 气象数据的准备 1 简介2 气象数据的准备&#xff08;传统气象站&#xff09;2.1 天气发生器各参数的计算2.2 降水及气温输入数据的准备 3 气象数据的准备&#xff08;中国区域高精度同化气象站CMADS&#xff09;参考 本博客主要介绍气象数据…

本周一至周三总结

周一 学习如何进行竞品分析 对软件杯项目进行了竞品分析&#xff0c;测试了十余个强相关网站&#xff0c;为团队写好了竞品分析报告 分别对主要目标&#xff0c;竞品优劣点&#xff0c;竞品选择原因&#xff0c;产品创新点等进行了分析和阐述 周二 下午晚上刷了五道题 题解…

Android 项目必备(四十五)-->2023 年如何构建 Android 应用程序

Android 是什么 Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备包括智能手机、平板电脑、电视和智能手表。 目前&#xff0c;Android 是世界上移动设备使用最多的操作系统; 根据 statcounter 的一份最近 12 个月的样本报告;Android 的市场份额…

Xcode14 设置Display Name不生效问题

一、前言 早在Xcode13苹果就对Info.plist做了一次大改革&#xff0c;新建的OC项目默认Info.plist文件是“空的”&#xff0c;Swift项目甚至干脆连Info.plist文件都没有了&#xff0c;苹果这样做是为了建立一个新的Info.plist管理方式&#xff0c;把Info.plist物理文件中的配置…

根据虚拟地址,如何求出页号和偏移量?

方法掌握 虚拟地址划分成虚拟页号和虚拟页偏移量。 物理地址同样可划分为物理页号和物理页偏移量 如何划分&#xff0c;关键点在于页面的大小。 假设给你一个十进制表示的地址20000&#xff0c;一个页面的大小为4KB&#xff0c;那么如何找出地址20000的具体位置呢&#xff1f…

合并两个有序链表

文章目录 1.题目描述2.解题思路方法1&#xff1a;方法2&#xff1a; 1.题目描述 题目链接&#xff1a;力扣21&#xff0c;合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1&#xff1a;…

脚本函数基础

shell脚本编程系列 函数是一个脚本代码块&#xff0c;可以为其命名并在脚本中的任何位置重用它。每当需要在脚本中使用该代码块时&#xff0c;直接写函数名即可。称作调用函数。 创建函数 方式1&#xff1a; function name {commands }name定义了该函数的唯一名称&#xff0…

1分钟学会Midjourney十种绘图风格关键词

Midjourney最新V5版的卡通模型中最流行的就是皮克斯&#xff0c;今天介绍十种绘图风格。我们统一用如下描述词来绘制&#xff0c;每次只是风格不一样&#xff0c;对比看看。 首先我们先画一个皮克斯风格(Pixar)&#xff0c;打开ai绘图软件&#xff0c;点击左上角的图像绘制&a…