记录c++连接数据库案例

记录c++连接数据库案例,第1张

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

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

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

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

**注意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 << "登录成功!!"<> 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);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2889272.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-14
下一篇 2022-09-14

发表评论

登录后才能评论

评论列表(0条)

保存