前提:电脑安装mysql和Visual Studio
1.在C++项目中添加创建mysql的库文件
1.1 在Visual Studio建立一个x64的项目。创建一个解决方案或空项目,在配置项目的属性之前,将编译的配置管理器设置为x64。
1.2 在项目的属性中添加创建mysql的库文件
1.2.1 在VC++目录的包含目录中添加下载的mysql的include文件,在库目录中添加下载的mysql的bin文件
1.2.2 在链接器的输入的附加依赖项中添加mysql的bin文件下的libmysql.lib
1.2.3 第一次在Visual Studio连接数据库,需要把libmysql.dll放在C:\Windows\System32下
1.2.4 检查下,是否在电脑的环境变量中加了mysql,否则无法在cmd界面通过命令行直接操作mysql
2.在代码中连接数据库
2.1 引入头文件 #include <mysql.h>
2.2 在代码中连接,例子如下:
/******************************************
*功能:根据用户所在的关卡id获取关卡数据
*输入:
level - 保存关卡信息结构体变量
* level_id - 用户所在关卡id
*返回值:
* 获取成功返回true,失败false
*******************************************/
bool fetch_level_info(LEVELINFO &level, int level_id)
{
/********************************************************************
*注:MYSQL mysql; 和 MYSQL * con = mysql_init(NULL); 作用相同,可互相代替--------???不对,这2个的区别是?
`MYSQL mysql` 是定义了一个 MYSQL 结构体类型的变量 `mysql`,而 `MYSQL * con = mysql_init(NULL)` 定义了一个指针变量 `con`,
并将其初始化为 `mysql_init(NULL)` 的返回值,该函数返回一个指向 MYSQL 结构体的指针。
简单来说,`MYSQL mysql` 是直接定义了一个 MYSQL 结构体的变量,而 `MYSQL * con = mysql_init(NULL)` 是定义了一个指针变量,
并将其指向通过 `mysql_init` 函数初始化的 MYSQL 结构体实例。
通常情况下,使用指针变量可以更灵活地操作和管理内存,并能方便地传递给其他函数进行处理。
MYSQL mysql;
MYSQL_RES * res; //查询结果集
MYSQL_ROW row; //记录结构体
char sql[256];
bool ret = false;
//1.连接数据库
if (connect_db(mysql) == false)
{
return false;
}
********************************************************************/
MYSQL_RES * res; //查询结果集
MYSQL_ROW row; //记录结构体
char sql[256];
bool ret = false;
//1.初始化数据库句柄
MYSQL * con = mysql_init(NULL);
//2.设置字符编码
mysql_options(con, MYSQL_SET_CHARSET_NAME, "gbk");
//3.连接数据库:127.0.0.1是本地IP,root、admin_123是安装mysql数据库时设置的用户名和密码,box_man是连接的mysql中的具体的数据库(需要先在数据库创建),3306是连接端口,NULL和0一般写死即可
if (mysql_real_connect(con, "127.0.0.1", "root", "admin_123", "box_man", 3306, NULL, 0) == NULL)
{
printf("数据库连接出错, 错误原因:%s\n", mysql_error(con));
return false;
}
//2.获取用户信息
snprintf(sql, 256, "SELECT name, map_row, map_column, map_data, next_level_id FROM levels WHERE id='%d';", level_id);
ret = mysql_query(con, sql); //成功返回0
if (ret)
{
printf("数据库查询出错, 错误原因:%s\n", mysql_error(con));
mysql_close(con);
return false;
}
//3.获取结果
res = mysql_store_result(con);
row = mysql_fetch_row(res);
if (row == NULL) //没有查找到记录
{
mysql_free_result(res);
mysql_close(con);
return false;
}
level.id = level_id;
level.name = row[0];
level.map_row = atoi(row[1]);//查找到的记录是字符,转为整型
level.map_column = atoi(row[2]);
level.map_data = row[3];
level.next_level = atoi(row[4]);
printf("id: %d name: %s map_row: %d map_column: %d map_data:%s next_level: %d\n",
level.id, level.name.c_str(), level.map_row, level.map_column, level.map_data.c_str(), level.next_level); //打印ID
//4.返回结果
mysql_free_result(res); //释放结果集
mysql_close(con); //关闭数据库
return true;
}