前提条件:
1、Visual Studio 2022 社区版(免费版)
2、Qt-6.5.1版本
3、MySQL 8
本文Qt 6 安装目录地址: D:\Qt\6.5.1\msvc2019_64\plugins\sqldrivers
第一步:将qsqlmysql.dll 和qsqlmysql.dll.debug 拷贝至Qt 6 安装目录下的插件/驱动目录中( D:\Qt\6.5.1\msvc2019_64\plugins\sqldrivers)
第二步:Qt 6 验证MySQL 8 驱动是否安装成功
首先使用Vistual Studio 2022 创建Qt 6 项目,项目名称为:QtWidgetsApplicationTwo
选择 Qt Widgets Application 项目,再点击下一步。
创建项目名称:QWidgetApplicationTwo,再点击下一步。
直接点击Next 按钮。
默认Qt 版本、系统、平台和Qt 模块,点击Next 按钮.
直接点击Finsh,完成项目创建。
运行QtWidgetApplicationTwo 项目的效果。
本章节知识重点:
首先在对应Qt项目qmark 中的*.pro文件中设置Qt += sql 如下:
Visual Studio 默认Qt 项目中的qmark 文件地址:E:\visual_workspace\QtWidgetsApplicationTwo\x64\Debug\qmake\temp\qtvars.proc
原文:
CONFIG += no_fixpath
QT += core gui widgets
原文添加sql:
CONFIG += no_fixpath
QT += core gui widgets sql
其次,修改QtWidgetsApplicationTwo.h 头文件对应的实现QtWidgetsApplicationTwo.cpp,在UI初始化函数添加如下代码片段:
// 输出可用数据库
qDebug() << "available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << driver;
QtWidgetsApplicationTwo.cpp 源码
#include "QtWidgetsApplicationTwo.h"
#include "QtSql/QSqlDatabase"
#include "QtSql/QSqlQuery"
#include "QString"
#include "QMessageBox"
#include "QDebug"
QtWidgetsApplicationTwo::QtWidgetsApplicationTwo(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
// 输出可用数据库
qDebug() << "available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << driver;
}
QtWidgetsApplicationTwo::~QtWidgetsApplicationTwo()
{}
运行QtWidgetApplicationTwo 项目,在控制台找到Qt 项目支持的数据库驱动信息输出。
将libmysql.dll 和libmysql.lib 拷贝至D:\Qt\6.5.1\msvc2019_64\bin目录下。
本章节知识重点:
修改QtWidgetsApplicationTwo.h 头文件对应的实现QtWidgetsApplicationTwo.cpp,在UI初始化函数添加如下代码片段:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//首次需要添加数据库驱动(必须在main程序中),第二次只需QSqlDatabase::database("QMYSQL")(其他文件中,防止多次使用);
db.setHostName("192.168.43.10");//设置ip
db.setPort(3306);//端口号
db.setDatabaseName("usc");//数据库名称
db.setUserName("root");//用户名
db.setPassword("123456");//密码
QSqlQuery query = QSqlQuery(db);//db对象
bool ok = db.open();//连接数据库
if (db.open()) {
QMessageBox::information(this, "infor", "success");//成功
qDebug() << "success!!!";
}
else {
QMessageBox::information(this, "infor", "open failed");
qDebug() << "error open database because";//失败
}
运行QtWidgetApplicationTwo 项目,在控制台找到Qt 项目支持的数据库驱动信息输出。
问题一: error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static class QList
__cdecl QSqlDatabase::drivers(void)" (__imp_?drivers@QSqlDatabase@@SA?AV?$QList@VQString@@@@XZ),函数 "public: __cdecl QtWidgetsApplicationTwo::QtWidgetsApplicationTwo(class QWidget *)" (??0QtWidgetsApplicationTwo@@QEAA@PEAVQWidget@@@Z) 中引用了该符号
1>E:\visual_workspace\QtWidgetsApplicationTwo\x64\Debug\QtWidgetsApplicationTwo.exe : fatal error LNK1120: 1 个无法解析的外部命令
产生此问题原因:Qt 项目没有添加Qt SQL 模块。
解决办法:
拓展->Qt VS Tool ->Qt Project Settings
上图,是VS 创建Qt 项目默认加载的Qt 模块。
上图,是为Qt 项目添加的sql 模块.
问题二:QSqlDatabase:MYSQL driver not loaded
产生此问题的原因:从CSDN 资源下载器下载的Qt 6 关于MySQL 8.0.23 驱动有错误才导致上述问题的产生。
解决办法如下:
Qt 对应MySQL 驱动下载 ,https://github.com/thecodemonkey86/qt_mysql_driver/releases
根据自己本地Qt 版本和平台架构选择对应的MySQL 驱动包.
本文演示Qt 版本详情信息:
Qt 6.5.1_64位
Windows 系统
基于MSVC_2019
我选择的驱动版本为:qsqlmysql.dll_Qt_SQL_driver_6.5.1_MSVC2019_64-bit.zip
解压后的目录:
1、 将上图目录中libmysql.dll 拷贝至D:\Qt\6.5.1\msvc2019_64\bin目录下,替换原有libmysql.dll 并删除libmysql.lib。
2、将sqldrivers 目录中的qsqlmysql.dll 和qsqlmysqld.dll拷贝至Qt 6 安装目录下的插件/驱动目录中( D:\Qt\6.5.1\msvc2019_64\plugins\sqldrivers),替换原有qsqlmysql.dll 并删除qsqlmysql.dll.debug
#include
#include
#include
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "buildAbi: " << QSysInfo::buildAbi();
qDebug() << "buildCpuArchitecture: " << QSysInfo::buildCpuArchitecture();
qDebug() << "currentCpuArchitecture: " << QSysInfo::currentCpuArchitecture();
qDebug() << "kernelType: " << QSysInfo::kernelType();
qDebug() << "kernelVersion: " << QSysInfo::kernelVersion();
qDebug() << "machineHostName: " << QSysInfo::machineHostName();
qDebug() << "prettyProductName: " << QSysInfo::prettyProductName();
qDebug() << "productType: " << QSysInfo::productType();
qDebug() << "productVersion: " << QSysInfo::productVersion();
return a.exec();
}
控制台输出结果:
buildAbi: "x86_64-little_endian-llp64"
buildCpuArchitecture: "x86_64"
currentCpuArchitecture: "x86_64"
kernelType: "winnt"
kernelVersion: "10.0.22621"
machineHostName: "LAPTOP-8R0KHL88"
prettyProductName: "Windows 11 Version 22H2"
productType: "windows"
productVersion: "11"
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
241448b9f8d6 mysql:8.0.23 "docker-entrypoint.s…" 7 months ago Up 3 weeks 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
1c3d38b948ba zookeeper "/docker-entrypoint.…" 13 months ago Up 3 weeks 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp zookeeper
62233dfad35b minio/minio "/usr/bin/docker-ent…" 13 months ago Up 3 weeks minio-server
[root@localhost ~]# docker exec -it 241448b9f8d6 bash
root@241448b9f8d6:/# mysql --version
mysql Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL)
Qt 编译MySQL 8 驱动:Qt Creator 6.1.0连接MySql8.0.23配置
Qt 连接MySQL 数据库: Qt配置mysql8