虚幻引擎(UE5)中接入MySQL数据库(附工程源码)

前言

本文主要讲解借助“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

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索引关系。

 1// Copyright 2015-2023 UEJoy 自动生成文件 Version 1.1.0
 2
 3using UnrealBuildTool;
 4using System.IO;
 5
 6public class MeetMySql : ModuleRules
 7{
 8   public MeetMySql(ReadOnlyTargetRules Target) : base(Target)
 9    {
10        Type = ModuleType.External;
11        //库文件路径
12        PublicSystemLibraryPaths.Add(Path.Combine(ModuleDirectory, "lib"));
13        //头文件路径
14        PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));
15        //添加静态库
16        PublicSystemLibraries.Add(Path.Combine(ModuleDirectory, "lib", "mysqlcppconn-static.lib"));
17        // //加入动态库
18        RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "lib", "libcrypto-1_1-x64.dll"));
19        RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "lib", "libssl-1_1-x64.dll"));
20    }
21}

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

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

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

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

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

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

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

6、添加测试代码

  • 在启动项目的build.cs文件中引入“MeetMySql”模块
1PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MeetMySql" });
  • 编写测试代码,我添加到了gamemode的函数中,并将函数标注为指令函数(UFUNCTION(Exec)),以下是函数定义,实现了向数据库中添加表格,并插入元素。
 1void AMySqlExampleGameModeBase::TestMySql()
 2{
 3	try
 4	{
 5		sql::mysql::MySQL_Driver* driver;
 6		sql::Connection* con;
 7
 8		driver = sql::mysql::get_mysql_driver_instance();
 9		con = driver->connect("tcp://localhost:3306", "root", "abc123456");
10
11		sql::Statement* stamt = con->createStatement();
12
13		stamt->execute("create DATABASE " "Pome");
14		stamt->execute("USE " "Pome");
15		stamt->execute("DROP TABLE IF EXISTS website");
16		stamt->execute("CREATE TABLE website(id INT, name CHAR(100), domain CHAR(200))");
17		stamt->execute("INSERT INTO website(id, name, domain) VALUES (1, 'pome', 'htts://www.pome.cc')");
18
19		delete stamt;
20		delete con;
21
22		UE_LOG(LogTemp, Log, TEXT("Create db was succeed!"));
23	}
24	catch (const std::runtime_error err)
25	{
26	}
27	catch (const sql::SQLException&)
28	{
29	}
30	catch (const std::bad_alloc& )
31	{
32	}
33}
  • 在此声明函数的头文件中,加入如下头文件引用
1#define STATIC_CONCPP
2#include "mysql_driver.h"
3#include "cppconn/prepared_statement.h"
4#include "cppconn/driver.h"
5#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

文章评论