Qt编译数据库驱动(Qt6)

背景介绍

在高版本的Qt中官方并没有为我们提供可用的mysql和oralce插件,只提供了源代码(不能直接使用),需要我们基于这些源码自行编译得到对应的动态库(静态库)之后,才能被程序加载从而连接上相应的数据库。

关于在程序中连接数据库有很多种处理方式,比如:odbc、ado等,在Qt底层也对数据库的连接进行了封装,基于不同的连接方式为我们提供了不同的插件(二进制代码,在需要的时候被加载,表现形式为动态库、静态库)。

查看Qt版本

查看mysql版本

MySQL的版本是Ver 8.0.31 for Win64 on x86_64。这意味着你的MySQL是运行在64位Windows操作系统上的,并且安装的MySQL版本是64位的。

注意事项

Qt 编译套件的位数和数据库的位数必须相同,都是32位或都是64位。

编译驱动步骤

1.确保Qt下载了源码

2.找到源码目录

3.打开项目文件

问题:发现mysql文件夹中,没有以前版本的mysql.pro文件,可供编译

用MinGW编译

4. 新建一个目录专门用来生成驱动

原因:mysql的默认安装目录存在空格,将会导致找不到对应的文件,所以需要将mysql文件夹中的部分文件夹复制到该临时文件夹中,再进行编译。 

 5.用Qt Creator打开项目

6.选用编译器

7. Qt Creator会自动配置好项目

8.找到mysql的目录

9.将该文件夹下的include和lib文件夹复制到你的另一个工作目录

10.从项目文件中找到并打开.cmake.conf文件

 在末尾增加三句话

规则

        

我的

set(QT_REPO_MODULE_VERSION "6.2.4")
SET(FEATURE_sql_mysql ON)
SET(MySQL_INCLUDE_DIR "D:/Colin/temp/include")
SET(MySQL_LIBRARY "D:/Colin/temp/lib/libmysql.lib")

报错(不一定都有)

1.

在其他地方已经编译过了,将原来的缓存目录(build-sqldrivers-Desktop_Qt_6_2_4_MinGW_64_bit-Debug)删除,

2.

修改D:\App\QT\6.2.4\Src\qtbase\src\plugins\sqldrivers\mysql\qsql_mysql.cpp文件第1256行

11.编译成功 

12.查看生成的文件

路径:D:\App\QT\6.2.4\Src\qtbase\src\plugins\build-sqldrivers-Desktop_Qt_6_2_4_MinGW_64_bit-Debug\plugins\sqldrivers

13. 将编译好的驱动复制到编译器的驱动插件文件夹中

14.将MySQL的lib和dll文件给编译器

15.测试代码 

1)在pro文件中添加数据库模块

2)回想一下密码

3)源文件
Widget::Widget(QWidget *parent)
	: QWidget(parent)
	, ui(new Ui::Widget)
{
	ui->setupUi(this);

	QStringList list = QSqlDatabase::drivers();
	qDebug() << list;

	QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
	if(db.isValid())
	{
		QMessageBox::information(this, "conn", "ok");
	}
	else
	{
		QMessageBox::information(this, "conn", "error");
	}
	db.setHostName("127.0.0.1"); // 本地连接
	db.setPort(3306);       // 如果使用的是默认端口可以不设置
	db.setUserName("root");	// 数据库用户名
	db.setPassword("1234"); // 数据库密码
	db.setDatabaseName("mysql"); // 数据库名字
	if(db.open())
	{
		QMessageBox::information(this, "打开数据库", "数据库打开成功, 可以读写数据了......");
	}
	else
	{
		QString msg = "数据库打开失败: " + db.lastError().text();
		QMessageBox::information(this, "打开数据库", msg);
	}
}