QT的mysql(数据库)最佳实践和常见问题解答

news2025/4/12 7:11:33

涉及到数据库,首先安利一个软件Navicat Premium,用来查询数据库很方便 

QMysql驱动是Qt SQL模块使用的插件,用于与MySQL数据库进行通信。要编译QMysql驱动,您需要满足以下条件:

  • 您需要安装MySQL的客户端库和开发头文件,这些文件通常随MySQL的安装程序一起提供,或者可以从MySQL官网下载。请注意,您需要根据您的Qt架构(32位或64位)选择正确的数据库库文件。
  • 您需要获取Qt的源代码,这些代码可以从Qt官网下载。您可以选择与您的Qt版本相匹配的源代码,也可以选择最新的源代码。
  • 您需要使用qmake和make工具来编译QMysql驱动,这些工具通常随Qt的安装程序一起提供,或者可以从Qt官网下载。请注意,您需要根据您的操作系统和编译器选择正确的工具。

由于现在版本的QT的Qmysql在安装的时候没有,需要自行去编译这个dll文件出来。

编译出QMysql的相关dll文件的步骤如下:

  • 打开Qt命令提示符,进入Qt源代码目录下的qt/src/plugins/sqldrivers/mysql文件夹,例如:
F:\QT\5.12.9\Src\qtbase\src\plugins\sqldrivers\mysql

然后把下面这一行代码注释掉:并且配置mysql的地址,如下面所示:

Copy

  • 运行qmake命令,指定MySQL的头文件和库文件的路径,例如:

INCLUDEPATH += "E:/mysql/mysql-5.7.27-winx64/include"
DEPENDPATH += "E:/mysql/mysql-5.7.27-winx64/include"
LIBS += "E:/mysql/mysql-5.7.27-winx64/lib/libmysql.lib"
DESTDIR = ../mysql/mylib

Copy

  • 运行make或mingw32-make命令,根据您的编译器类型(如果是在VS环境下使用sql,那么就只需要在VS的编译器下面进行编译)选择合适的命令,例如:
mingw32-make

Copy

  • 如果编译成功,您将在当前目录下看到一个名为qsqlmysql.dll的文件,这就是QMysql插件。您需要将这个文件复制到您运行Qt应用程序时使用的Qt目录下的qt/plugins/sqldrivers文件夹中,例如:
F:\QT\5.12.9\msvc2017_64\plugins\sqldrivers

以上就是我们的准备工作:

然后就是如何在QT里面使用Qmysql功能;首先,咱们需要先引入头文件,文件如下:

#include <QtSql/QSqlDatabase>	// 连接数据库
#include <QtSql/QSqlError>		// 数据库连接失败打印报错语句
#include <QtSql/QSqlQuery>		// 数据库操作(增删改查)
#include <QSqlQueryModel>

我定义了一下函数名,用来在cpp文件里面写入:

 Q_OBJECT
public:
    mysql(QWidget *parent);
    ~mysql();
    void insert(QString InserName,int id,QString symbol,QString value);
    void insert_line(QString InserName,QString id,QString symbol,QString value,QString v,QString despoitory);

    void data_connect(bool,bool);//连接数据库
    void data_test_connect(QStringList);//测试能否成功连接数据库
    void close_data();
    void creat_table(QString TableName);//创建一个表
    void update_table(QString InserName,QString id,QString key,QString value);//更新数据库
    void delete_table(QString TableName,QString id);//删除数据库
    void find_alltable(QString datebase);//查找所有数据路表格
    void find_table_inf(QString TableName);//查询某个表中的数据
    void find_table_row(QString TableName,QString row_name,QString col_name);//查询表中某一行的数据
    void find_table_col(QString TableName,QString col_name);//表名,列名
    void find_table_desposite(QString TableName,QString col_name);//表名,列名查询储位名

对应的函数名里面,实现的功能如下所示:

首先是连接数据库部分功能

QSettings *myini=new QSettings("info.ini", QSettings::IniFormat);//构造QSettings对象,访问ini文件
        QStringList info_digitial={"digitial_type","hostname","port","database_name","user_name","password"};
        QStringList s;
        //设置键值对
        s.clear();
        myini->beginGroup("digital");
        for(int i=0;i<info_digitial.size();i++)
        {
           s.append(myini->value(info_digitial[i]).toString());
        }
        myini->endGroup();
        delete myini;
    //输出可用数据库
        qDebug()<<"available drivers:";
        QStringList drivers = QSqlDatabase::drivers();
        foreach(QString driver, drivers)
        qDebug()<<driver;//输出中含有MySQL,那么恭喜你说明你的qt有MySQL驱动了

        QSqlDatabase db = QSqlDatabase::addDatabase(s[0]);
        db.setHostName(s[1]);
        db.setPort(s[2].toInt());
        db.setDatabaseName(s[3]);//数据库名
        db.setUserName(s[4]);//用户名
        db.setPassword(s[5]);//密码
        bool ok = db.open();//打开并连接数据库
        if(message_prompt)
        {
            if (ok){
                QMessageBox::information(this, "infor", "success connect");
            }
            else {
                QMessageBox::information(this, "infor", "open failed");
                qDebug()<<"error open database because"<<db.lastError().text();
            }
        }

我这里是通过读取ini文件里面存储的信息,来获得数据库的设置,主要包含有: 

定义一个QSqlDatabase 对象db,实例化它,如果能够成功connect,则会返回一个布尔值,在这里我通过这个bool值来判断,是否成功连接上数据库了。

然后就是在数据库里面创建一个table,并且想里面插入值:


    QSqlQuery query;
    QString sql=QString("create table %1(订单号 text, 料号 text, 品名 text, 数量 text,储位 text);").arg(TableName);//"订单号","料号","品名","数量"
    qDebug()<<"SQL"<<sql;

    //创建表是否成功

    if (!query.exec(sql))//.exec(),作用是开启一个循环,执行一个事件,相当于while(1)

    {
        qDebug() << QString::fromLocal8Bit("creat table failed:") << query.lastError();

    }

    else

    {
        qDebug() << QString::fromLocal8Bit("creat table success!");

    }

在表table里面插入数据的功能实现如下所示:

 QSqlQuery query;
       QString str=QString("insert into %4(序号,标签,value) values(%1,'%2','%3')").arg(id).arg(symbol).arg(value).arg(InserName);
       if(query.exec(str)==false)
       {
            qDebug() << "insert failed";
            QMessageBox::warning(this,u8"数据插入错误",u8"请检查数据是否正确");
       }
       else
       {
           QMessageBox::information(this, "insert", "insert connect");
            qDebug() <<"insert success";
       }

更新数据的功能实现,代码部分如下所示:

    QSqlQuery query;
    QString updata = QString("update %1 set  %2='%3' where 订单号='%4'").arg(InserName).arg(column).arg(value).arg(row);
    qDebug()<<"--update--"<<updata;
    if (!query.exec(updata))
    {
        qDebug() << QString::fromLocal8Bit("updata failed!") << query.lastError();
    }
    else
    {
        qDebug() << QString::fromLocal8Bit("updata success!");
    }

前面我们提了如何创建数据库的table和插入数据的功能实现,下面我们就谈一谈这个数据库的删除功能的视线,代码部分,如下所示:

     QSqlQuery query;
     QString sql = QString("delete from %1 where  订单号 = '%2'").arg(TableName).arg(id);
     if(query.exec(sql))
     {
         qDebug()<<"delete success!";
     }
     else
     {
         qDebug()<<"delete failed!";
     }

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

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

相关文章

三生ONE物,无限可能|博睿数据上市三周年!

2020年8月17日&#xff0c;北京博睿宏远数据科技股份有限公司作为国内A股市场上的“APM应用性能监控第一股”公司&#xff0c;在科创板荣登上市&#xff01;&#xff08;股票号688229&#xff09; 2023年8月17日&#xff0c;三载日夜更替&#xff0c;博睿一路砥砺前行&#xf…

Eclipse集成MapStruct

Eclipse集成MapStruct 在Eclipse中添加MapStruct依赖配置Eclipse支持MapStruct①安装 m2e-aptEclipse Marketplace的方式安装Install new software的方式安装&#xff08;JDK8用到&#xff09; ②添加到pom.xml 今天拿到同事其他项目的源码&#xff0c;导入并运行的时候抛出了异…

Channel是什么?FileChannel类的常用方法

Channel 是一个接口对象,它类似于传统的流对象,但与传统的流对象又有些不同&#xff0c;具体表现如下: • Channel可以异步地执行I/O读写操作。 • Channel的读写操作是双向的,既可以从 Channel中读取数据,又可以写数据到Channel,而流的读写操作通常都是单向的。 • Channel…

Can‘t find end of central directory : is this a zip file ? at XMLHttpRequest

导出woed出现这个报错,原因其实很简单,路径写错了, 这个word首先必须是docx格式,然后必须放在public文件包下 如果放在public文件包下还没有用,则放在public包下 参考帖子: https://www.cnblogs.com/hejun26/p/13647927.html

VR漫游:720度实景参观,打造魅力生态小区

随着城市的不断发展&#xff0c;小区的建设越发具有生态化、绿色化的特点&#xff0c;人们也会偏向选择更加适合居住的小区。为了让更多的用户体验小区的舒适性&#xff0c;不少地产开发商准备引入VR漫游技术。 VR漫游不仅能够真实地展示现场环境&#xff0c;还可以改变传统网络…

shell编程 基础

将content.txt文件中的内容输出到控制台上 将content.txt中有tom的行输出到控制台 将$2文件中含有gree的行输出到控制台 case语法 简易计算器 查找有root的行 查找以root开头的行 查询时忽略大小写 grep -E 则适用于复杂的正则表达式&#xff0c;可以使用多项选择、重复和子表达…

开发者不可错过的提效工具——低代码开发

开发者不可错过的提效工具 基础低码功能及搭建 01、代码生成器 02、工作流程 03、门户设计 04、大屏设计 05、报表设计 06、第三方登录 07、多租户实现 08、分布式调度 为什么低码平台能够成为开发者的宠儿&#xff1f; 1.低码平台能够大幅提高开发效率 2.低码平台具备高度的可…

QString常用函数介绍

此篇博客核心介绍QT中的QString类型的常用函数&#xff0c;介绍到的函数均从帮助手册或其他博客中看到 QString 字符串类 Header: #include qmake: QT core 一、QString字符串转换 1、QString类字符串转换为整数 int toInt(bool *ok Q_NULLPTR, int base 10) cons…

NOTA标记多肽氨基酸试剂,NOTA-E(cRGDfK)2的化学特性

今日文章关键词&#xff1a;DOTA 偶联肽&#xff0c;NOTA-E(cRGDfK)2&#xff0c;NOTA标记多肽氨基酸试剂 产品描述&#xff1a;DOTATATE acetate 是一种 DOTA 偶联肽&#xff0c;可以被放射性核素标记以用于正电子发射断层扫描 (PET) 成像和肽受体放射性核素治疗 (PRRT)。 英…

LLM的生成配置中参数含义

LLM的生成配置中参数含义 我们在Huggingface中第一次使用大模型的时候,常常会看到一些需要调整的参数,这个参数也是需要了解的。 文中都是来自对于 LLM 一些学习资料的整理 在上图中有 4 个配置的参数分别是 Max new tokens、top-k、top-p以及 Temperature。 token相信大家都…

idea 转换为 Maven Project 的方法

选项&#xff1a; Add as Maven Project

Android 12 源码分析 —— 应用层 一(SystemUI准备篇)

Android 12 源码分析 —— 应用层一&#xff08;SystemUI准备篇&#xff09; 在接下来的时间中&#xff0c;将会使用Pixel 3(blueline)作为研究对象&#xff0c;选用AOSP的android-12.0.0_r34分支作源代码。 先从android的应用层进行探析&#xff0c;然后慢慢深入android的fr…

运维节点CPU飙升问题分析

工作内容,不对外开放 前言 首先问题是这样的,周五正在写文档,突然收到了线上报警,发现cpu占用达到了90多,上平台监控系统查看容器,在jvm监控中发现有一个pod在两个小时内产生了61次youngGc一次fullGc,这个问题特别严重且少见,由于我之前也没有排查过此类问题,所以也是…

8个免费的在线思维导图制作工具推荐,节省时间提高效率!

思维导图&#xff0c;也称为心智图或思维图&#xff0c;最初由英国的心理学家Tony Buzan提出。它是一种图形化的思维工具&#xff0c;旨在帮助我们组织信息、理解知识和激发创新思维。思维导图最大特点是其中心放射式的结构。一张思维导图通常由一个中心主题发散出各个子主题&a…

真知灼见|鲸图知识图谱平台,助力金融业务深度洞察(下)

导语 大数据时代的背景下&#xff0c;数据早就成为数字经济重要的生产资料。对数据的挖掘能力成为企业数字化转型的驱动力。就金融行业来说&#xff0c;如果经营和管理方式跟不上大数据时代的发展脚步就会使得数据价值无法得到充分发挥。知识图谱作为一个结合了知识存储、知识…

HVV(护网)行动详解

前言 最近的全国护网可谓是正在火热的进行中&#xff0c;有很多网安小白以及准大一网安的同学在后台问我&#xff0c;到底什么是护网啊&#xff1f;怎么参加呢&#xff1f;有没有相关的学习资料呢&#xff1f;在下不才&#xff0c;连夜整理出来了这篇护网详解文章&#xff0c;希…

msvcp110.dll是什么意思,msvcp110.dll丢失的解决方法

装好软件或游戏之后&#xff0c;一打开就跳出各种报错信息的情况小伙伴一定见过&#xff0c;其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪&#xff0c;用得好好的电脑&#xff0c;怎么会缺文件呢&#xff1f;为啥其他游戏/应用就没事呢&#xff1f;其实这些“丢失”的…

java生成Excel表格

public HSSFWorkbook CreateJZZJSList() {// 绘制ExcelString fileName "自动分析详情";HSSFWorkbook wb new HSSFWorkbook();//创建工作相簿对象HSSFSheet sheet wb.createSheet(fileName); // --->创建了一个工作簿sheet.setDefaultRowHeight((short) 600);…

【Vue】Hbuilder x代码风格设置

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 一、Hbuilder x 默认代码风格太乱1.在工具中找到设置&#xff0c;点击插件设置2.代开jsbeautify.js配置 一、Hbuilder x 默认代码风格太乱 1…