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

涉及到数据库,首先安利一个软件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文件里面写入:

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);//表名,列名查询储位名

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

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

cpp 复制代码
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,并且想里面插入值:

cpp 复制代码
    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里面插入数据的功能实现如下所示:

cpp 复制代码
 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";
       }

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

cpp 复制代码
    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和插入数据的功能实现,下面我们就谈一谈这个数据库的删除功能的视线,代码部分,如下所示:

cpp 复制代码
     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!";
     }
相关推荐
敲上瘾7 分钟前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
不会写代码的ys13 分钟前
【类与对象】--对象之舞,类之华章,共绘C++之美
c++
兵哥工控15 分钟前
MFC工控项目实例三十二模拟量校正值添加修改删除
c++·mfc
tatasix23 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
长弓聊编程25 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.32 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
南城花随雪。36 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了37 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度39 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮42 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql