QT - QT5.14.2 连接并操作MySQL8.0

1、前言

本文主要介绍怎么在QT中连接并操作MySQL数据库。由于在QT的最新版本中没有默认自带MySQL的动态链接库,需要自己编译生成,所以会带来一些问题,在此进行记录以方便日后查看。

我的QT版本为 qt-opensource-windows-x86-5.14.2。这是QT官方能提供的自带安装包的最近版本,更新的版本需要自己编译源代码,可点击此链接进行下载:https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 。另外,在安装QT的时候一定要安装源代码!一定要安装源代码!一定要安装源代码!不然到时候还要重新安装,只需要在安装的时候勾选上安装 Source 即可,如下所示:

QT - QT5.14.2 连接并操作MySQL8.0_第1张图片

我的MySQL版本为 mysql8.0.16,可通过mysql -V命令进行查看,如下所示:

该版本的MySQL是64位的!记住,这个很重要!一定要保证QT工程的位数和Mysql的位数一致!

2、准备工作

要在QT中操作MySQL数据库,需要在QT的工程文件.pro中添加如下命令:

点加完之后别忘了保存,并重新编译一下工程。

在QT中可以打印一下当前QT版本支持的数据库:

#include 

qDebug() << QSqlDatabase::drivers();

打印出的结果如下:

通过查看QT的安装目录,也可以发现在QT的安装目录中并没有MySQL的动态链接库,我的查看目录如下所示:

QT - QT5.14.2 连接并操作MySQL8.0_第2张图片版本不同目录可能不一样,但基本上都是在mingwXX_XX\plugins\drivers目录下。需要注意的是,mingwXX_XX一定要和你的QT工程采用的编译器保持一致!

可见,当前QT版本并不支持MySQL。

所以我们需要通过重新编译的方式生成MySQL的动态链接库。

3、重新编译MySQL动态链接库

首先找到QT的源代码安装目录(这就是为什么一定要安装QT的Source,我当时找不到这个郁闷了半天),找到mysql.pro工程,我的具体目录如下所示:

QT - QT5.14.2 连接并操作MySQL8.0_第3张图片

然后在QT中打开mysql.pro,配置工程,选择编译器,和你的QT工程的编译器保持一致:

QT - QT5.14.2 连接并操作MySQL8.0_第4张图片

然后按照如下方式修改mysql.pro文件:

QT - QT5.14.2 连接并操作MySQL8.0_第5张图片

首先注释掉 QMAKE_USE += mysql ,然后分别添加INCLUDEPATH(在mysql安装目录下)和LIBS(在mysql安装目录下),和DESTDIR(这个是动态库的生成目录,可以直接参考这种写法)。.pro文件修改完成之后保存,然后直接编译(点击QT左下角的锤子标志),直接编译即可,其他的不用管。此时,就可以下当前工程目录下找到新生成的mysql动态库文件,如下所示:

QT - QT5.14.2 连接并操作MySQL8.0_第6张图片

至此,mysql的动态链接库生成完毕。

4、配置QT

前面已经生成好mysql的动态链接库,接下来需要将生成的库拷贝到正确的目录下就可以了。

首先,将生成的三个库文件全部拷贝到QT的数据库引擎目录下(注意编译器的选择,和你的QT工程保持一致),如下所示:

QT - QT5.14.2 连接并操作MySQL8.0_第7张图片

然后将,MySQL安装目录下的mysql库文件,如下所示:

QT - QT5.14.2 连接并操作MySQL8.0_第8张图片

拷贝到QT的目录下,目录如下所示(注意编译器文件的选择):

QT - QT5.14.2 连接并操作MySQL8.0_第9张图片

此时,关于QT中MySQL的配置已经全部完成。通过上面的语句可以看到,当前的QT已经支持MYSQL了:

5、MySQL的简单操作

5.1、连接数据库

    //链接数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    db.setHostName("127.0.0.1");
    db.setUserName("root");
    db.setPassword("pwd");
    db.setDatabaseName("db_test");
    if(!db.open()){
        qDebug() << "未成功链接到数据库";
    }else{
        qDebug() << "成功链接到数据库";
    }

5.2、插入数据

    QSqlQuery query(db);
    bool re = query.exec("INSERT INTO table_name (col1, col2, col3) VALUES (1, 1, 2)");
    //bool re = query.exec("insert into table_name values(3, 1, 2)");

    if(!re){
        qDebug() << "操作数据库失败!" ;
    }else{
        qDebug() << "操作数据库成功!" ;
    }

5.3、更新数据表

    bool re = query.exec("update table_name set col2=2, period=1 where col1=1");

    if(!re){
        qDebug() << "操作数据库失败!" ;
    }else{
        qDebug() << "操作数据库成功!" ;
    }

5.4、读取数据表

    QSqlQuery db_cursor(db);
    QString cmd = QString("select * from table_name");
    db_cursor->exec(cmd);

    if(db_cursor->size() == -1){
        qDebug() << QString("数据表  操作异常,请检查... ");
        return;
    }else if(db_cursor->size() == 0){
        qDebug() << QString("数据表  没有数据,请检查... ");
        return;
    }else{
        while(db_cursor->next()){
            int  col0= db_cursor->value(0).toInt();
            QString col1= db_cursor->value(1).toString();
        }
    }

6、MySQL中InnoDB和MyISAM的对比

QT - QT5.14.2 连接并操作MySQL8.0_第10张图片

你可能感兴趣的:(Mysql,QT)