qt6(mingw64)连接mysql的过程
防止自己忘记,进行记录
之前版本的解决方案
【经验分享】Qt连接Mysql_哔哩哔哩_bilibili
解决过程
Qt要先连接到qt的数据库插件
连接mysql的动态库,最后连接mysql
qt的数据库插件需要编译,不同版本对应的插件不同。
遇到问题
mysql的动态库在mysql中,需要复制到qt的bin路径下面
不同的地方,因为版本原因,QT6的这个下面,没有.pro(使用的是qmake)
因为使用的是cmake来编译的
E:\program\Qt\6.5.2\Src\qtbase\src\plugins\sqldrivers\mysql
我们需要查看一下readme
您需要安装MySQL开发头文件和库
在编译此插件之前。
有关编译Qt-SQL的更多信息,请参阅Qt-SQL文档
驱动程序插件(sqldriver.html)。
参考文档
SQL Database Drivers | Qt SQL 6.7.1
我们跳转到这个界面
Qt SQL 模块使用驱动插件与不同的数据库 API 通信。由于 Qt 的 SQL 模块 API 与数据库无关,所有与数据库相关的代码都包含在这些驱动程序中。Qt 提供了多个驱动程序,还可以添加其他驱动程序。我们还提供了驱动程序源代码,可作为编写自己的驱动程序的范本。
根据表格,我们需要的驱动是QMYSQL
用于 MySQL 或 MariaDB 5.6 及更高版本的 QMYSQL
MariaDB是MySQL的一个分叉,旨在保持GNU通用公共许可证下的自由和开源软件。MariaDB旨在保持与MySQL的高度兼容性,确保可直接替换,并与MySQL API和命令完全匹配。因此,MySQL 和 MariaDB 的插件合并为一个 Qt 插件。
MySQL 在 SQL 层支持存储过程,但没有控制 IN、OUT 和 INOUT 参数的 API。因此,必须使用 SQL 命令而不是 QSqlQuery::bindValue() 来设置和读取参数。
create procedure qtestproc (OUT param1 INT, OUT param2 INT)
BEGIN
set param1 = 42;
set param2 = 43;
END
嵌入Mysql服务
MySQL 嵌入式服务器可直接替代普通客户端库。有了嵌入式 MySQL 服务器,使用 MySQL 功能就不需要 MySQL 服务器了。
要使用嵌入式 MySQL 服务器,只需将 Qt 插件链接到 libmysqld 而不是 libmysqlclient。这可以通过在 configure 命令行中添加 -DMySQL_LIBRARY=<path/to/mysqld/>libmysqld.<so|lib|dylib> 来实现。
有关 MySQL 嵌入式服务器的更多信息,请参阅 MySQL 文档 "libmysqld,嵌入式 MySQL 服务器库 "一章。
How to Build the QMYSQL Plugin on Windows
你需要获取 MySQL 安装文件(如 MySQL 网页安装程序或 MariaDB C Connector)。运行安装程序,选择自定义安装并安装与 Qt 安装(x86 或 x64)相匹配的 MySQL C Connector。安装完成后检查所需文件是否存在:
<MySQL dir>/lib/libmysql.lib
<MySQL dir>/lib/libmysql.dll
<MySQL dir>/include/mysql.h
and for MariaDB
<MariaDB dir>/lib/libmariadb.lib
<MariaDB dir>/lib/libmariadb.dll
<MariaDB dir>/include/mysql.h
注:自 MySQL 8.0.19 起,C 连接器不再作为独立的可安装组件提供。相反,你可以通过安装完整的 MySQL 服务器(仅限 x64)或 MariaDB C 连接器获得 mysql.h 和 libmysql.*。
按如下方式构建插件(此处假定 <MySQL 目录> 为 C:\mysql-8.0.22-winx64):
mkdir build-sqldrivers
cd build-sqldrivers
qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers
-DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform>
-DMySQL_INCLUDE_DIR="C:\mysql-8.0.22-winx64\include"
-DMySQL_LIBRARY="C:\mysql-8.0.22-winx64\lib\libmysql.lib"
cmake --build .
cmake --install .
分发应用程序时,请记住在安装包中包含 libmysql.dll / libmariadb.dll。libmysql.dll 还需要 MSVC 运行库,这些运行库可通过 vcredist.exe 安装。
在使用qt-make之前,我们要确保Qt的工具链在我们的系统环境变量中,我们可以访问到。
把E:\program\Qt\6.5.2\mingw_64\bin
添加到环境变量当中
cmake构建
在选择构建系统时,我们也是有依赖性的,即对于使用的 mingw64的系统,我们的G后的变量"MinGW Makefiles"而不是Ninja,在设定好下面的变量和路径之后,我们就在当前文件夹开始mysql的配置。
qt-cmake -G "MinGW Makefiles" E:\program\Qt\6.5.2\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=E:\program\Qt\6.5.2\mingw_64
-DMySQL_INCLUDE_DIR="C:\Program Files\MySQL\MySQL Server 8.0\include"
-DMySQL_LIBRARY="C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.lib" && cmake --build . && cmake --install .
运行结束后的效果
即获得了第一 个过程中的对应的文件。我们把文件放在指定位置进行测试。
即拷贝过程
把qsqlmysql.dll和qsqlmysql.debug放到我使用的mingw的对应的sqldrivers路径下面
E:\program\Qt\6.5.2\mingw_64\plugins\sqldrivers
我们发现已经存在了
把mysql对应的libmysql.dll复制到对应版本的bin目录下面E:\program\Qt\6.5.2\mingw_64\bin
连接数据库的代码
//可以是指定的类,此处使用在学生管理系统中使用
void StudentDialog::CreatDatabaseFunc()
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
// 设置数据库连接参数
db.setHostName("localhost"); // 数据库服务器主机名或IP地址
db.setDatabaseName("Stuinfo"); // 数据库名称,记得用命令创建数据库
db.setUserName("root"); // MySQL用户名
db.setPassword("123456"); // MySQL密码
// 尝试连接到数据库
if (db.open()) {
qDebug() << "Connected to MySQL database!";
// 在这里可以执行数据库操作
} else {
qDebug() << "Failed to connect to MySQL database!";
qDebug() << "Error: " << db.lastError().text();
}
连接成功
21:35:41: Starting E:\program\coding\project\qt\build-studentMis-Desktop_Qt_6_5_2_MinGW_64_bit-Debug\debug\studentMis.exe…
Connected to MySQL database!