记录c++连接数据库案例(Windows平台、vs2022)

记录c++连接数据库案例--推箱子获取数据地图案例
来源于B站的《C语言/C++连接mysql 项目实战+数据库学习入门 》作者:Linux高性能服务器开发

目标:在数据库中建立用户表,游戏地图表,在c++中调用mysql获取数据库中信息,并更新信息

涉及到 :1.mysql数据库制作 2 .c++用户登录功能  3.读取用户信息,地图信息  4。更新用户信息

每段代码都带上了main函数,为了说明如何使用,在整体使用时,将所有main函数体中的代码放入一个main主函数中即可

1.制作数据库

1.1.制作箱子数据库

show tables;
create database  box;
select  database();
use box;

1.2制作玩家用户表

create table user(
    id int(11) NOT NULL PRIMARY KEY auto_increment,
    username varchar(64) not null unique ,
    password varchar(32) not null ,
    leve_id int default 1
);
show tables;

insert into user values(1000,'yzy',md5(12345),1);
select *from user;

1.3制作游戏地图表

create  table levels(
    id int not null  primary key default 1,
    name varchar(64) not null  unique ,
    map_row int not null ,
    map_col int not null ,
    map_data varchar(4096) not null  ,
    next_map int default 0
);
desc levels;

insert into levels values (1,'牛刀小试',9,12,'0,0,0,0,0,0,0,0,0,0,0,0|0,1,0,1,1,1,1,1,1,1,0,0|0,1,4,1,0,2,1,0,2,1,0,0|
0,1,0,1,0,1,0,0,1,1,1,0|0,1,0,2,0,1,1,4,1,1,1,0|0,1,1,1,0,3,1,1,1,4,1,0|0,1,2,1,1,4,1,1,1,1,1,0|0,1,0,0,1,0,1,1,0,0,1,0|
0,0,0,0,0,0,0,0,0,0,0,0',2);

insert into levels values (2,'牛刀大试',9,12,'0,0,0,0,0,0,0,0,0,0,0,0|0,1,0,1,1,1,1,1,1,1,0,0|0,1,4,1,0,2,1,0,2,1,0,0|
0,1,0,1,0,1,0,0,1,1,1,0|0,1,0,2,0,1,1,4,1,1,1,0|0,1,1,1,0,3,1,1,1,4,1,0|0,1,2,1,1,4,1,1,1,1,1,0|0,1,0,0,1,0,1,1,0,0,1,0|
0,0,0,0,0,0,0,0,0,0,0,0',1);

2.c++调用数据库

2.1项目属性设置

2.1.1在项目-属性-VC++目录-包含目录添加C:\Program Files\MySQL\MySQL Server 8.0\include

2.1.2在项目-属性-VC++目录-库目录添加C:\Program Files\MySQL\MySQL Server 8.0\lib

具体个人路径可在命令行查询 开始右键-运行-cmd-path 查看MySQL Shell 8.0所在绝对路径

2.1.3在连接器-输入 -附加默认项中添加libmysql.lib

2.1.4将C:\Program Files\MySQL\MySQL Server 8.0\lib目录下的libmysql.dll复制到C:\Windows\System32或者项目文件目录下。

2.1.5头文件应用#include<mysql.h>

**注意VS使用的平台是64/86!!

3定义表结构体

至此c++项目已连接到mysql库

3.1定义用户表结构体

typedef struct _userinfo {
	 int id;
	 string username;
	 string password;
	 int level_id;
 }userinfo;

///
//
struct userinfo {
	 int id;
	 string username;
	 string password;
	 int level_id;
 };

推荐第一种定义方式

3.2定义地图结构体

typedef struct _levelinfo {
	int id;
	string name;
	int map_row;
	int map_column;
	string map_data;
	int next_level;
}levelinfo;

3.3其余头文件宏定义与函数

using namespace std;
#define DB_name "box"
#define DB_host "127.0.0.1"
#define DB_port 3306
#define DB_user "root"
#define DB_user_password "5965424"
#define MAX_LOGIN_TIMES  4

//用户登录
bool logi(userinfo &user);

//连接数据库
bool connectsql(MYSQL& mysql);

//获取地图信息
bool getmap(levelinfo &map, int mapid);

//更新用户信息
bool updata(userinfo& user, int next_id);

4.用户登录设计

int main()
{ 



//定义用户
    userinfo user;
    // 定义当前地图
    levelinfo map;

    //用户登录
    bool ret = false;
    int test_time = 0;
    while (!ret)
    {
        ret = logi(user);
        test_time++;
        if (test_time > MAX_LOGIN_TIMES)
        {
            cout << "+++++++++++++++++++++++++++++++++++++" << endl;
            cout << "++++++错误次数过多,退!退!退!" << endl;
            cout << "+++++++++++++++++++++++++++++++++++++" << endl;
            system("pause");
            exit(-1);
        }
            
        if (ret == false)
        {
            cout << "登录失败,重新登陆" << endl;        
        }
        else
        {
            cout << "登录成功!!"<<endl<<"用户ID:"<<user.id<<"您所在的关卡是:"<<user.level_id << endl;
            system("pause");
        }
    }



}



bool logi(userinfo &user)
{
    MYSQL mysql;
    MYSQL_RES* res;//查询结果集
    MYSQL_ROW row;//记录结构体
    char sql[256];
    bool ret = false;

    cout << "请输入用户名:";
    cin >> user.username;
    cout << "请输入密码:";
    cin >> user.password;

    //连接数据库
    if (connectsql(mysql) == false)
    {
        return false;
    }
    //查询数据
    snprintf(sql, 256, "select id,leve_id from user where username='%s' and password=md5(%s);", user.username.c_str(), user.password.c_str());
    ret = mysql_query(&mysql, sql);//成功返回0
    if (ret)
    {
        cout << "连接失败" << endl;
        cout << "错误原因  " << mysql_error(&mysql) << endl;
        mysql_close(&mysql);
        return false;
    }
    //返回结果
    res = mysql_store_result(&mysql);
    row = mysql_fetch_row(res);
    if (row == NULL)//没有查到记录
    {
        mysql_free_result(res);
        mysql_close(&mysql);
        return false;
    }
    user.id = atoi (row[0]);
    user.level_id = atoi(row[1]);
   
    //释放数据库
    mysql_free_result(res);
    mysql_close(&mysql);
    return true;

}

bool connectsql(MYSQL& mysql)
{
    mysql_init(&mysql);
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    if (mysql_real_connect(&mysql, DB_host, DB_user, DB_user_password, DB_name, DB_port, NULL, 0) == NULL)
    {
        cout << "连接失败" << endl;
        cout << "错误原因  " << mysql_error(&mysql) << endl;
        return false;
    }
    return true;
}

main函数就是意思意思,无实际用处灵活使用。

5.获取地图数据

int main()
{ 

  //定义用户
    userinfo user;
    // 定义当前地图
    levelinfo map;

//获取地图数据

    if (getmap(map, user.level_id))
    {
        cout << "地图数据获取成功!" << endl;
    }
    else
    {
        cout << "地图数据获取失败!" << endl;
    }
}
bool getmap(levelinfo &map,int mapid)
{
    MYSQL mysql;
    MYSQL_RES* res;//查询结果集
    MYSQL_ROW row;//记录结构体
    char sql[256];
    bool ret = false;
    //连接数据库
    if (connectsql(mysql) == false)
    {
        return false;
    }
    //根据mapid获取data
    snprintf(sql, 256, "select id,name,map_row,map_col,map_data,next_map from levels where id=%d;", mapid);
    ret = mysql_query(&mysql, sql);//成功返回0
    if (ret)
    {
        cout << "数据库查询失败!" << endl;
        cout << "错误原因  " << mysql_error(&mysql) << endl;
        mysql_close(&mysql);
        return false;
    }
    //返回结果
    res = mysql_store_result(&mysql);
    row = mysql_fetch_row(res);
    if (row == NULL)//没有查到记录
    {
        mysql_free_result(res);
        mysql_close(&mysql);
        return false;
    }

    map.id = atoi(row[0]);
    map.name = row[1];
    map.map_row = atoi(row[2]);
    map.map_column = atoi(row[3]);
    map.map_data = (row[4]);
    map.next_level = atoi(row[5]);

    cout << "地图行数:" << map.map_row << "地图列数:" << map.map_column << endl;
    cout << "地图名称:" << map.name << endl;

    //释放数据库
    mysql_free_result(res);
    mysql_close(&mysql);
    return true;
}

连接数据库的方式大同小异

6.更新数据库设计

  int main()
{ 
    updata(user, map.next_level);
    cout << "当前玩家游玩关卡:" << user.level_id << endl;
    system("pause");
    return 0;

}


bool updata(userinfo& user, int next_id)
{
    MYSQL mysql;
    MYSQL_RES* res;//查询结果集
    MYSQL_ROW row;//记录结构体
    char sql[256];
    bool ret = false;
    //连接数据库
    if (connectsql(mysql) == false)
    {
        return false;
    }

   snprintf(sql, 256, "update user set leve_id = %d  where id=%d;", next_id,user.id);
    ret = mysql_query(&mysql, sql);//成功返回0
    if (ret)
    {
        cout << "更新数据失败" << endl;
        cout << "错误原因  " << mysql_error(&mysql) << endl;
        mysql_close(&mysql);
        return false;
    }

    user.level_id = next_id;
    mysql_close(&mysql);
    return true;
}

7.最后附上常用典型连接数据库例子

void testsql()
{
    MYSQL mysql;//数据库句柄
    MYSQL_RES* res;//查询结果集
    MYSQL_ROW row;//记录结构体

    //初试化数据库
    mysql_init(&mysql);

    //设置字符编码
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

    //连接数据库
    if (mysql_real_connect(&mysql, "127.0.0.1", "root", "5965424", "yzytest", 3306, NULL, 0) == NULL)
    {
        cout << "连接失败" << endl;
        cout << "错误原因  " << mysql_error(&mysql) << endl;
        exit(-1);
    }

    //查询数据
    int ret = mysql_query(&mysql, "select*from emp;");
    cout << "员工明细: " << ret << endl;

    //获取数据集
    res = mysql_store_result(&mysql);

    //给row赋值,判断row是否为空,不空就打印
    while (row = mysql_fetch_row(res))
    {
        cout << row[0] << "  ";
        cout << row[1] << "  ";
        cout << row[2] << "  ";
        cout << row[7] << "  " << endl;
    }
    //释放结果集
    mysql_free_result(res);

    //关闭数据库
    mysql_close(&mysql);
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用DevC++连接MySQL数据库,首先需要确保已经安装了MySQL数据库,并且了解所需的头文件和库文件。 1. 首先,确保已经下载并安装了MySQL数据库。你可以从官方网站上下载最新的MySQL Community Edition版本。 2. 在DevC++中创建一个新的C++项目。 3. 打开项目的设置(Project Options)。 4. 在Compiler Options选项卡下的"Add these commands when calling the compiler"中添加以下代码来引入所需的头文件: ```cpp -I"path_to_mysql_include_folder" ``` 这里的"path_to_mysql_include_folder"是你安装MySQL时所选择的头文件的路径。 5. 在Linker Options选项卡下的"Add these commands when calling the linker"中添加以下代码来引入所需的库文件: ```cpp -L"path_to_mysql_lib_folder" -lmysql ``` 这里的"path_to_mysql_lib_folder"是你安装MySQL时所选择的库文件的路径。 6. 在代码中包含MySQL的头文件,并在需要连接数据库的地方编写连接代码。下面是一个简单的示例: ```cpp #include <mysql/mysql.h> #include <iostream> int main() { // 创建连接 MYSQL *conn = mysql_init(NULL); // 连接数据库 if (!mysql_real_connect(conn, "hostname", "username", "password", "database", 0, NULL, 0)) { std::cout << "连接数据库失败: " << mysql_error(conn) << std::endl; return 1; } // 连接成功后可以执行数据库操作 // 关闭连接 mysql_close(conn); return 0; } ``` 在上面的代码中,你需要将"hostname"替换为MySQL服务器的主机名或IP地址,"username"和"password"分别替换为登录MySQL所使用的用户名和密码,"database"替换为要连接的数据库的名称。 7. 编译并运行项目,如果一切顺利,你的程序将成功连接到MySQL数据库。 请注意,这只是一个简单的示例,你可以根据自己的需求进行更多的数据库操作。同时,确保在使用MySQL数据库时遵循安全的实践,如防止SQL注入攻击等。<span class="em">1</span> #### 引用[.reference_title] - *1* [dev c++ 连接 mysql 方法、库](https://download.csdn.net/download/downk/18493753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值