前言
本文主要讲解借助“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
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断言宏,但此头文件中有如下代码
1
2
|
CPPCONN_PUBLIC_FUNC void check(const std::string &);
CPPCONN_PUBLIC_FUNC void check(const std::map<std::string,std::string> &);
|
如果不处理,则导致编译错误,解决方法,编译此头文件可先去掉check宏声明,加如下代码
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宏,如下代码:
1
2
3
|
#ifndef check
#define check(expr) UE_CHECK_IMPL(expr)
#endif
|
6、添加测试代码
- 在启动项目的build.cs文件中引入“MeetMySql”模块
1
|
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MeetMySql" });
|
- 编写测试代码,我添加到了gamemode的函数中,并将函数标注为指令函数(UFUNCTION(Exec)),以下是函数定义,实现了向数据库中添加表格,并插入元素。
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& )
{
}
}
|
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