前言

本文主要讲解借助“MySQL Connector/c++”在虚幻引擎中完成Windows平台的MySQL数据库操控。

Windows平台MySQL Server部署,请移步这里

实施

1、新建项目并配置第三方库导入

新建C++ UE5项目,创建成功后在Source文件夹中添加ThirdParty文件夹。在ThirdParty文件夹中添加导入库模块“MeetMySql”(名称随意),并参照下图完成文件夹与文件创建。

项目工程文件参考
项目工程文件参考

2、下载“MySQL Connector/c++”

本文使用的是非安装版本的“MySQL Connector/c++”,下载地址,需要注意版本号是8.0.32。

mysql-connector-c++-8.0.32-winx64
mysql-connector-c++-8.0.32-winx64

3、导入头文件与库文件

解压缩mysql-connector-c++-8.0.32-winx64文件,按照以下步骤拷贝内容:

头文件:将解压内“include\jdbc”中的所有内容拷贝到虚幻项目“Source\ThirdParty\MeetMySql\include”下

头文件
头文件

库文件:将解压文件夹内库“libcrypto-1_1-x64.dll,libssl-1_1-x64.dll,mysqlcppconn-static.lib”拷贝到虚幻项目“Source\ThirdParty\MeetMySql\lib”下

库文件
库文件

4、编写build.cs文件

参照如下代码,编写build.cs文件,用于UBT索引关系。

c#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// Copyright 2015-2023 UEJoy 自动生成文件 Version 1.1.0

using UnrealBuildTool;
using System.IO;

public class MeetMySql : ModuleRules
{
   public MeetMySql(ReadOnlyTargetRules Target) : base(Target)
    {
        Type = ModuleType.External;
        //库文件路径
        PublicSystemLibraryPaths.Add(Path.Combine(ModuleDirectory, "lib"));
        //头文件路径
        PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));
        //添加静态库
        PublicSystemLibraries.Add(Path.Combine(ModuleDirectory, "lib", "mysqlcppconn-static.lib"));
        // //加入动态库
        RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "lib", "libcrypto-1_1-x64.dll"));
        RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "lib", "libssl-1_1-x64.dll"));
    }
}

5、修改driver头文件编译冲突

在头文件路径下找到driver头文件路径:“\include\cppconn\driver.h”,由于虚幻引擎中有check断言宏,但此头文件中有如下代码

c++
1
2
CPPCONN_PUBLIC_FUNC void check(const std::string &);
CPPCONN_PUBLIC_FUNC void check(const std::map<std::string,std::string> &);

如果不处理,则导致编译错误,解决方法,编译此头文件可先去掉check宏声明,加如下代码

c++
1
2
3
4
//暂时去掉check宏定义
#undef check
CPPCONN_PUBLIC_FUNC void check(const std::string &);
CPPCONN_PUBLIC_FUNC void check(const std::map<std::string,std::string> &);

然后在此头文件尾加上原有的断言check宏,如下代码:

c++
1
2
3
#ifndef check
#define check(expr)				UE_CHECK_IMPL(expr)
#endif

6、添加测试代码

  • 在启动项目的build.cs文件中引入“MeetMySql”模块
c#
1
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MeetMySql" });
  • 编写测试代码,我添加到了gamemode的函数中,并将函数标注为指令函数(UFUNCTION(Exec)),以下是函数定义,实现了向数据库中添加表格,并插入元素。
c++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void AMySqlExampleGameModeBase::TestMySql()
{
	try
	{
		sql::mysql::MySQL_Driver* driver;
		sql::Connection* con;

		driver = sql::mysql::get_mysql_driver_instance();
		con = driver->connect("tcp://localhost:3306", "root", "abc123456");

		sql::Statement* stamt = con->createStatement();

		stamt->execute("create DATABASE " "Pome");
		stamt->execute("USE " "Pome");
		stamt->execute("DROP TABLE IF EXISTS website");
		stamt->execute("CREATE TABLE website(id INT, name CHAR(100), domain CHAR(200))");
		stamt->execute("INSERT INTO website(id, name, domain) VALUES (1, 'pome', 'htts://www.pome.cc')");

		delete stamt;
		delete con;

		UE_LOG(LogTemp, Log, TEXT("Create db was succeed!"));
	}
	catch (const std::runtime_error err)
	{
	}
	catch (const sql::SQLException&)
	{
	}
	catch (const std::bad_alloc& )
	{
	}
}
  • 在此声明函数的头文件中,加入如下头文件引用
c++
1
2
3
4
5
#define STATIC_CONCPP
#include "mysql_driver.h"
#include "cppconn/prepared_statement.h"
#include "cppconn/driver.h"
#include "cppconn/exception.h"

STATIC_CONCPP:宏必须添加,否则编译错误。

7、拷贝动态库到执行路径

将lib路径中的dll文件拷贝到“MySqlExample\Binaries\Win64”文件夹下,这样保证运行时可以找到关联动态库。

路径参考
路径参考

8、执行并查询库

执行代码后,通过数据库下的bin中的mysql登录库,查看库中内容:

查询截图
查询截图

结语

本文内的导入库只测试Windows平台,其他平台无法保证使用。

关于如何操作MySQL的增删改查,可以参考《使用 Connector/C++ 在 Azure Database for MySQL 中进行连接并查询数据》

版本

系统:win10

虚幻引擎:5.2

MySQL数据库版本:mysql-8.0.33-winx64

MySQL Connector C++版本:mysql-connector-c++-8.0.32-winx64

参考资料

1、MySQL Connector/C++: Usage Examples

2、使用 Connector/C++ 在 Azure Database for MySQL 中进行连接并查询数据

3、Github mysql-connector-cpp(github源码)

Github源码

MySqlExample