QT实现连接MySQL数据库以及查询等操作

这篇具有很好参考价值的文章主要介绍了QT实现连接MySQL数据库以及查询等操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT实现连接数据库以及查询等操作

实现效果

qt mysql,QT,数据库,qt,mysql,sql,database,c++,学习
功能包含数据库的增删改查和界面的显示,因为没有用.ui文件所以控件的位置都是手动设置的,写的有点费劲

建立数据库

首先打开Navicat,新建一个名字为bak_db的数据库,然后新建查询导入下面的sql语句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `permission` int(2) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 40 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (1, 'admin', '123456', 1);
INSERT INTO `users` VALUES (32, 'xfgc', 'dfhgrj', 2);
INSERT INTO `users` VALUES (39, '123', '456', 1);

SET FOREIGN_KEY_CHECKS = 1;

然后刷新显示表已经创建好了,接下来就开始进行操作了:

代码实现

文件结构

qt mysql,QT,数据库,qt,mysql,sql,database,c++,学习
源码在我的github上,感兴趣的话可以下载运行试一下欢迎fork和star
运行不成功的可能是MySQL数据库的动态库没有导入,可以看一下这篇文章

连接数据库

首先是使用QSqlDatabase来创建数据库对象,使用

QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");

后设置端口号、数据库地址、用户名、密码、数据库名

    db.setPort(3306);
    db.setHostName(hostname);//localhost
    db.setPassword(sqlpasswd);//数据库密码
    db.setUserName(sqlname);//数据库登录名
    db.setDatabaseName(dbname);//数据库的名字 我用的上面的数据库为bak_db

执行项目中的conn()函数就可以发现数据库连接成功了
关于从数据库中读取出来的信息,数据先存在二维数组中,后遍历二维数组放到QTableWidget中

void Mysql::flush_data(QVector<QVector<QString>>&userinfo)
{
    table->clear();
    if(!userinfo.size())return;
    table->setRowCount(userinfo.size());
    table->setColumnCount(4);
    for(int i=0;i<userinfo.size();i++)
    {
        for(int j=0;j<userinfo[0].size();j++)
        {
            table->setItem(i,j,new QTableWidgetItem(userinfo[i][j]));
        }
    }
     table->setHorizontalHeaderLabels({"id","用户名","密码","权限"});
}

bool Mysql::adduserinfo(QString user, QString passwd, QString per)
{
    QSqlQuery query(db);
    query.prepare("insert into users(username,password,permission) values(:user,:passwd,:per);");
    query.bindValue(":user",user);
    query.bindValue(":passwd",passwd);
    query.bindValue(":per",per);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}

按姓名删除


bool Mysql::del_byname(QString name)
{
    QSqlQuery query(db);
    query.prepare("delete from users WHERE  username=:user;");
    query.bindValue(":user",name);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}

按权限删除

bool Mysql::del_bypermission(QString permissionn)
{
    QSqlQuery query(db);
    query.prepare("delete from users WHERE  permission=:permission");
    query.bindValue(":permission",permissionn);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}

按名字查询

bool Mysql::updateuserinfo(QString user, QString passwd, QString per)
{
    QSqlQuery query(db);
    query.prepare("UPDATE users SET username=:user, password=:passwd ,permission=:per WHERE  username=:user;");
    query.bindValue(":user",user);
    query.bindValue(":passwd",passwd);
    query.bindValue(":per",per);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}


查询表中所有数据

void Mysql::findall()
{
    userinfo.clear();
    QSqlQuery query(db);
    query.prepare("select * from users;");
    if(query.exec())
    {
         while (query.next()) {
             QVector<QString>rec;
             for(int i=0;i<query.record().count();i++)
             {
                 rec.push_back(query.record().value(i).toString());
             }
             userinfo.push_back(rec);
         }
    }
}

按名字查询

bool Mysql::find_byname(QString name)
{
    userinfo.clear();
    QSqlQuery query(db);
        query.prepare("select * from users where username=:name;");
        query.bindValue(":name",name);
        if(query.exec())
        {
             while (query.next()) {
                 QVector<QString>rec;
                 rec.push_back(query.record().value("id").toString());
                 rec.push_back(query.record().value("username").toString());
                 rec.push_back(query.record().value("password").toString());
                 rec.push_back(query.record().value("permission").toString());

                 userinfo.push_back(rec);
             }
             return true;
        }
            return false;
}

按权限查询

bool Mysql::find_bypermission(QString permissionn)
{
    userinfo.clear();
    QSqlQuery query(db);
        query.prepare("select * from users where permission=:permission;");
        query.bindValue(":permission",permissionn);
        if(query.exec())
        {
             while (query.next()) {
                 QVector<QString>rec;
                 rec.push_back(query.record().value("id").toString());
                 rec.push_back(query.record().value("username").toString());
                 rec.push_back(query.record().value("password").toString());
                 rec.push_back(query.record().value("permission").toString());
                 userinfo.push_back(rec);
             }
             return true;
        }
        return false;
}

所用类及其函数解释

所用的类:

类名 作用 解释
QSqlDatabase 用于管理和操作数据库连接的类 QSqlDatabase类提供了与数据库建立连接、执行查询和事务处理相关的功能。
QTableWidget 用于显示和编辑二维表格数据的控件 QTableWidget类是Qt中用于展示和编辑二维表格数据的控件,允许用户直接在表格中进行修改、选择和排序。
QVector 动态数组容器类,用于存储任意类型的数据 QVector类是Qt中的一个动态数组容器,可以存储和操作各种类型的数据,支持自动内存管理和高效的插入、删除操作。
QSqlQuery 用于执行SQL查询语句并处理结果的类 QSqlQuery类提供了执行SQL查询语句、处理结果集以及绑定参数等功能,可以方便地进行数据库的查询和数据操作。
QRecord 代表数据库结果集中的一行数据的类 QRecord类用于代表数据库查询结果集中的一行数据,可以通过字段名或索引来访问和操作每个字段的值。

在项目中用到的函数的解释:

函数名 返回值 参数 作用
QSqlDatabase ::setPort() void int 设置数据库连接的端口号
QSqlDatabase :: setHostName() void QString 设置数据库连接的主机名
QSqlDatabase ::setPassword() void QString 设置数据库连接的密码
QSqlDatabase ::setUserName() void QString 设置数据库连接的用户名
QSqlDatabase ::setDatabaseName() void QString 设置数据库连接的数据库名
QTableWidget::clear() void 清除QTableWidget中的所有表项
QVector::clear() void 清除QVector中的所有元素
QSqlQuery::prepare() bool QString 准备SQL查询语句
QSqlQuery::exec() bool 执行SQL查询或执行上次准备的查询语句
QSqlQuery::exec(bool) bool QString 执行SQL查询语句,并将结果存储于内存以供后续访问
QSqlQuery::size() int 获取查询结果的记录数
QSqlQuery::bindValue() void QString, QVariant 将参数绑定到SQL查询语句中的占位符
QRecord::count() int 返回QRecord中的字段数
QRecord::value() QVariant int 获取指定字段的值

源代码

mysql.pro

QT       += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mysql.cpp

HEADERS += \
    mysql.h

FORMS +=

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

mysql.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QWidget>
#include<QSql>
#include<QSqlDatabase>
#include<QDebug>
#include<QSqlQuery>
#include<QSqlRecord>
#include <QSettings>
#include <QTableWidget>
#include <QPushButton>
#include <QLineEdit>
#include<QMessageBox>
QT_BEGIN_NAMESPACE
QT_END_NAMESPACE

class Mysql : public QWidget
{
    Q_OBJECT
public:
    Mysql(QWidget *parent = nullptr);
    ~Mysql();
    QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
    QString sqlname,hostname,sqlpasswd,dbname,sqlport;
    //查
    QPushButton* findname;
    QPushButton* findpermission;
    QLineEdit* inputinfo;
    //增
    QPushButton* addinfo;
    QLineEdit* user,*passwd,*permission;
    //改
    QPushButton* updateinfo;
    //删
    QPushButton* delname;
    QPushButton* delpermission;
    QLineEdit* inputdelinfo;
    QVector<QVector<QString>>userinfo;
    QTableWidget* table;
    QPushButton* all;
    //建立连接
    void conn();
    void init();
    //登录
    bool isAdmin;//判断是否是管理员
    bool isuser(QString username,QString password);
    void findall();//查看所有用户
    void flush_data(QVector<QVector<QString>>&userinfo);
    bool find_byname(QString name);
    bool find_bypermission(QString permission);
    bool adduserinfo(QString user,QString passwd,QString per);
    bool updateuserinfo(QString user,QString passwd,QString per);
    bool del_byname(QString name);
    bool del_bypermission(QString permissionn);
private:
};

#endif // MAINWINDOW_H

mysql.cpp

#include "mysql.h"

Mysql::Mysql(QWidget *parent)
    : QWidget(parent)
{
    conn();
    init();
}

Mysql::~Mysql()
{}

void Mysql::conn()
{
    sqlname="root";
    sqlpasswd="123456";
    hostname="localhost";
    dbname="bak_db";
    db.setPort(3306);
    db.setHostName(hostname);
    db.setPassword(sqlpasswd);
    db.setUserName(sqlname);
    db.setDatabaseName(dbname);
    if(db.open())
    {
        qDebug()<<"success!";
    }
    else {qDebug()<<"failed!";}
   // db.close();
}

void Mysql::init()
{
    this->setFixedSize(1000,1000);
    table=new QTableWidget(this);
    table->move(20,200);
    table->setFixedSize(500,500);
    QStringList headers;
    headers << "id" << "用户名" << "密码"<<"权限";
    table->setColumnCount(4);
    table->setHorizontalHeaderLabels(headers);

    inputinfo=new QLineEdit(this);
    inputinfo->setPlaceholderText("请输入姓名 / 权限");
    inputinfo->move(20,50);

    findname=new QPushButton("按姓名查询",this);
    findname->move(180,30);
    connect(findname,&QPushButton::clicked,[this](){
        QString name=inputinfo->text();
        if(find_byname(name))
        {
            flush_data(userinfo);
            userinfo.clear();
        }else  QMessageBox::critical(nullptr, "错误", "something wrong!", QMessageBox::Retry);
    });

     findpermission=new QPushButton("按权限查询",this);
     findpermission->move(180,70);
     connect(findpermission,&QPushButton::clicked,[this](){
         QString name=inputinfo->text();
         if(find_bypermission(name))
         {
             flush_data(userinfo);
             userinfo.clear();
         }
        else QMessageBox::critical(nullptr, "错误", "something wrong!", QMessageBox::Retry);
     });

     inputdelinfo=new QLineEdit(this);
     inputdelinfo->setPlaceholderText("请输入姓名 / 权限");
     inputdelinfo->move(280,50);

     delname=new QPushButton("按姓名删除",this);
     delname->move(440,30);
     connect(delname,&QPushButton::clicked,[this](){
         QString name=inputinfo->text();
         if(del_byname(name))
         {
             flush_data(userinfo);
             userinfo.clear();
         }else  QMessageBox::critical(nullptr, "错误", "something wrong!", QMessageBox::Retry);
     });

     delpermission=new QPushButton("按权限删除",this);
     delpermission->move(440,70);
     connect(delpermission,&QPushButton::clicked,[this](){
         QString name=inputinfo->text();
         if(del_bypermission(name))
         {
             flush_data(userinfo);
             userinfo.clear();
         }else  QMessageBox::critical(nullptr, "错误", "something wrong!", QMessageBox::Retry);
     });

     addinfo=new QPushButton("添加信息",this);
     addinfo->move(440,100);
     connect(addinfo,&QPushButton::clicked,[this](){
         if(adduserinfo(user->text(),passwd->text(),permission->text()))
         {
             flush_data(userinfo);
         }
     });

     updateinfo=new QPushButton("修改信息",this);
     updateinfo->move(440,130);
     connect(updateinfo,&QPushButton::clicked,[this](){
         if(updateuserinfo(user->text(),passwd->text(),permission->text()))
         {
             flush_data(userinfo);
         }
     });
     
     user=new QLineEdit(this);
     user->move(20,120);
     user->setPlaceholderText("请输入用户名");

     passwd=new QLineEdit(this);
     passwd->move(160,120);
     passwd->setPlaceholderText("请输入密码");

     permission=new QLineEdit(this);
     permission->move(300,120);
     permission->setPlaceholderText("请输入权限(1/2)");

     all=new QPushButton("查看所有信息",this);
     all->move(20,160);
     connect(all,&QPushButton::clicked,[this](){
         findall();
         flush_data(userinfo);
     });
    findall();
    flush_data(userinfo);
}

bool Mysql::isuser(QString username, QString password)
{
    QSqlQuery query1(db),query2(db);
    query1.prepare("select * from  users where username=:username "
                   "and password=:password and permission=1;");//查询是否为管理员
    query1.bindValue(":username",username);
    query1.bindValue(":password",password);

    query2.prepare("select * from  users where username=:username,"
                  "and password=:password and permission=2;");//查询是否为普通职员
    query2.bindValue(":username",username);
    query2.bindValue(":password",password);

    if (query1.exec()) {
        isAdmin=true;
        qDebug()<<"管理员登陆成功";
        return true;
    }
    else if(query2.exec())
    {
        isAdmin=false;
        qDebug()<<"普通职员登陆成功";
        return true;
    }
    else
     {
        qDebug()<<"用户名或密码错误!";
    }
    return false;
}

void Mysql::flush_data(QVector<QVector<QString>>&userinfo)
{
    table->clear();
    if(!userinfo.size())return;
    table->setRowCount(userinfo.size());
    table->setColumnCount(4);
    for(int i=0;i<userinfo.size();i++)
    {
        for(int j=0;j<userinfo[0].size();j++)
        {
            table->setItem(i,j,new QTableWidgetItem(userinfo[i][j]));
        }
    }
     table->setHorizontalHeaderLabels({"id","用户名","密码","权限"});
}

void Mysql::findall()
{
    userinfo.clear();
    QSqlQuery query(db);
    query.prepare("select * from users;");
    if(query.exec())
    {
         while (query.next()) {
             QVector<QString>rec;
             for(int i=0;i<query.record().count();i++)
             {
                 rec.push_back(query.record().value(i).toString());
             }
             userinfo.push_back(rec);
         }
    }
}

bool Mysql::find_byname(QString name)
{
    userinfo.clear();
    QSqlQuery query(db);
        query.prepare("select * from users where username=:name;");
        query.bindValue(":name",name);
        if(query.exec())
        {
             while (query.next()) {
                 QVector<QString>rec;
                 rec.push_back(query.record().value("id").toString());
                 rec.push_back(query.record().value("username").toString());
                 rec.push_back(query.record().value("password").toString());
                 rec.push_back(query.record().value("permission").toString());

                 userinfo.push_back(rec);
             }
             return true;
        }
            return false;
}

bool Mysql::find_bypermission(QString permissionn)
{
    userinfo.clear();
    QSqlQuery query(db);
        query.prepare("select * from users where permission=:permission;");
        query.bindValue(":permission",permissionn);
        if(query.exec())
        {
             while (query.next()) {
                 QVector<QString>rec;
                 rec.push_back(query.record().value("id").toString());
                 rec.push_back(query.record().value("username").toString());
                 rec.push_back(query.record().value("password").toString());
                 rec.push_back(query.record().value("permission").toString());
                 userinfo.push_back(rec);
             }
             return true;
        }
        return false;
}

bool Mysql::adduserinfo(QString user, QString passwd, QString per)
{
    QSqlQuery query(db);
    query.prepare("insert into users(username,password,permission) values(:user,:passwd,:per);");
    query.bindValue(":user",user);
    query.bindValue(":passwd",passwd);
    query.bindValue(":per",per);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}

bool Mysql::updateuserinfo(QString user, QString passwd, QString per)
{
    QSqlQuery query(db);
    query.prepare("UPDATE users SET username=:user, password=:passwd ,permission=:per WHERE  username=:user;");
    query.bindValue(":user",user);
    query.bindValue(":passwd",passwd);
    query.bindValue(":per",per);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}

bool Mysql::del_byname(QString name)
{
    QSqlQuery query(db);
    query.prepare("delete from users WHERE  username=:user;");
    query.bindValue(":user",name);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}

bool Mysql::del_bypermission(QString permissionn)
{
    QSqlQuery query(db);
    query.prepare("delete from users WHERE  permission=:permission");
    query.bindValue(":permission",permissionn);
    if(query.exec())
    {
        findall();
        return true;
    }
    return false;
}

main.cpp

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

后面的话

写的时候发现每个表都需要使用数据类型(一维数组、哈希表、二维数组等)进行存储,而且基本上每涉及一个表就需要单独对这个表写增删改查之类的函数,这样造成了非常大的代码冗余,非常臃肿,但是目前我还没有想到什么办法能减少这种冗余简化代码,有一种方法是把数据库中的表对应的在qt中建立数据类,在类中建立对应表中表项的数据类型,之后查询到的数据对应的放到相应的类中,但是这样只是结构清晰了很多但是使用的内存空间还是同样大甚至更多。
其实也是因为自己这个月初要实现关于数据库的相关操作,然后就研究了一下,写完之后心血来潮想整理一下qt关于数据库的操作。感觉qt配置连接数据库简直比visualstudio简单太多了,甚至至今我还不能在vs上成功连接数据库,只能在vscode中使用cmakelists来连接数据库。文章来源地址https://www.toymoban.com/news/detail-764976.html

到了这里,关于QT实现连接MySQL数据库以及查询等操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql数据库(五) Mysql命令行客户端:内连接查询、左连接查询、右连接查询、自连接查询、子查询

    目录 一、 连接查询 对多个表进行查询 1.0 数据准备 1.1 连接查询 1.2 内连接 INNER JOIN 1.3 左连接 LEFT JOIN 1.4 右连接 RIGHT JOIN 1.5 FULL OUTER JOIN 1.6 自连接查询 1.7 子查询-嵌套在查询中 在之前的文章当中,我们在 base_1 当中有了一个 stu 表,记录的是学生的name age height等信息 第一步

    2024年02月13日
    浏览(40)
  • MySQL数据库:数据库的约束以及数据的聚合、联合查询

    目录 一.关系模型的简要概述 二.数据库的约束  2.1约束类型         2.2NULL约束 2.3 UNIQUE:唯一约束 2.4 默认约束 2.5 PRIMARY KEY:主键约束 2.6 FOREIGN KEY:外键约束 2.7 CHECK约束 三.高效率查询 3.1高效率查询的分类 3.2聚合查询 3.2.1聚合函数 3.2.2 GROUP BY子句 3.2.3HAVING 3.3.联合查询

    2024年02月10日
    浏览(53)
  • Qt 无法连接MySQL数据库

    Qt 5.15及之后版本缺少mysql驱动:qsqlmysql.dll、qsqlmysqld.dll 下载对应版本驱动:https://github.com/thecodemonkey86/qt_mysql_driver/releases?page=2 拷贝至Qt安装路径下,例如 Qt5.15.25.15.2msvc2019_64pluginssqldrivers 根据mysql版本下载对应mysql压缩包https://downloads.mysql.com/archives/community/ 找到libmysql.dll、

    2024年04月12日
    浏览(46)
  • 【MySQL探索之旅】数据库设计以及聚合查询

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 数据库

    2024年04月09日
    浏览(38)
  • QT连接Mysql数据库(详细成功版)

    QT连接Mysql数据库步骤相对比较麻烦,因此写了篇文章将详细过程呈现给大家,欢迎大家来评论区指导提问。 示例代码: (1)在.pro文件中添加下列代码: (2)在mainwindow.h文件中添加下列头文件:  (3)在main.cpp文件中添加下列代码: 运行代码,如果连接Mysql成功则输出下面

    2024年01月16日
    浏览(39)
  • Qt连接MySQL数据库最详细的教程

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 原文链接:https://blog.csdn.net/joey_ro/article/details/105411135 被Qt连接数据库折磨了三天之后终于连接成功了,记录一下希望对看到的人有所帮助。 当然要在.pro文件中添加一行引入 如果显示: 那么恭喜你太幸

    2024年01月21日
    浏览(39)
  • 查询Oracle和MySQL数据库中当前所有连接信息

    查询Oracle当前所有连接信息: 查询MySQL当前所有连接信息: 在这两个查询中,我为每个字段添加了中文别名,以提高查询结果的可读性

    2024年02月12日
    浏览(53)
  • Mysql 查询数据库或数据表中的数据量以及数据大小

     许多数据库的元数据都是存储在mysql中的,例如hive、startrockes,因此可以通过mysql中的“information_schema.TABLES”表来查询对应数据库或对应数据表的具体信息。 1、查询各个数据库中的数据条数和数据大小 2、查询各个数据表中的数据条数和数据大小 3、查看指定数据库容量大小

    2024年04月27日
    浏览(33)
  • mysql数据库——连接查询(内连接:自然连接,等值连接。外连接:左连接,右连接,全连接)

    🔎这里是数据库加油站 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 数据库版本:mysql8。0.27 如果以下代码执行有问题欢迎留言,一起探讨 内连接INNERJOIN是最常用的连接操作。从数学的角度讲就是求两个表的交集,从笛卡尔积的角度

    2024年02月04日
    浏览(67)
  • Qt连接MySQL数据库(保姆级成功版教程)

    VIP通道可以关注我,私信我,直接给两个动态库,直接起飞。 1、安装Qt时勾选sources 2、配置path环境变量 ① 此电脑-属性-高级系统设置-环境变量 ② 双击path-右上角新建 ③把这两个路径添加进去,最后确定 3、编译mysql驱动(在Qt打开mysql.pro文件) 1)在这条路径中D:QT5.14.25.1

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包