C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库

本篇 核心知识点 :部署 MySQL、数据库环境安装排错、数据库 / 数据表创建、MySQL C# 驱动引用、DBHelper 单例数据库工具封装、数据表设计(玩家 User 表)、数据库增删改查全套封装、UserInfo 玩家实体类、服务端对接数据库、注册 / 登录业务数据库校验、常见运行报错排查、游戏业务落地完整流程

一、MySQL 环境部署:PHPStudy 小皮面板

1 部署工具介绍

PHPStudy(小皮)集成 MySQL、Apache、Nginx,一键安装数据库,无需复杂环境变量配置,适合学习开发;推荐版本MySQL 5.7.26,兼容性强,极少语法兼容报错。

2 完整安装步骤

  1. 下载小皮面板安装包,右键以管理员身份运行安装(避免权限不足安装失败);

  2. 打开软件「软件管理」→数据库分类,找到 MySQL5.7.26 点击一键安装;

  3. 安装完成后首页点击「启动」数据库服务;

  4. 数据库默认通信端口:3306,固定端口不要修改,C# 代码统一写 3306 连接。

3 安装 & 启动常见故障排错

  1. 安装失败:关闭杀毒、防火墙,管理员运行安装程序;

  2. 启动数据库自动闪退 / 停止:本机其他程序占用 3306 端口、之前残留 MySQL 服务冲突,卸载旧数据库再重装;

  3. 无法打开数据库管理工具:数据库服务未正常启动,先确认启动按钮为绿色运行状态。

4 创建游戏专属数据库

  1. 打开小皮内置数据库可视化工具;

  2. 新建数据库,命名game2602(项目编号命名规范);

  3. 数据库账号、密码统一设为game2602,方便代码配置,正式项目需设置复杂密码;

  4. 保存后刷新列表,确认数据库创建成功。

二、C# 数据库驱动配置(MySql.Data.dll)

1 驱动作用

C# 程序无法直接操作 MySQL,必须引入官方驱动 dll,封装底层 TCP 通信、SQL 语句执行逻辑。

2 配置流程

  1. 下载MySql.Data.dll驱动文件,固定文件夹存放;

  2. 创建DB 类库项目(DBDLL),专门封装数据库操作;

  3. 右键项目「添加引用」→浏览,选中 dll 文件导入;

  4. 代码头部引入命名空间:using MySql.Data.MySqlClient;,无引用会全代码报错。

拓展规范

服务端、客户端共用 MyNet 网络库,数据库操作单独封装 DLL,分层解耦,业务层不直接写原生 SQL。

三、DBHelper 单例数据库工具类(核心封装)

1 设计思路

采用饿汉式单例,全局仅一个数据库连接实例,避免重复创建连接浪费资源;所有数据库操作统一封装方法,业务层无需手写原生 SQL。

2 核心配置参数

复制代码
// 数据库连接字符串关键配置
string connStr = "server=127.0.0.1;port=3306;database= ;user= ;password= ";

server:本机回环地址 127.0.0.1;

port:固定 3306;

database:刚刚创建的库名;

user/pwd:数据库账号密码。

3 DBHelper 内置全套方法

1)Init () 初始化数据库连接

程序启动时调用,建立与 MySQL 长连接,连接失败抛出日志提示。

2)CreateTable (string tableName, 字段配置)

自动创建数据表,游戏玩家表固定结构;

类比 Excel:表名 = 工作表,字段 = 表头,每行 = 单条玩家数据。

玩家 UserTable 标准字段:

字段名 类型 作用 特性
UserId int 玩家唯一 ID 自增主键,自动累加 1、2、3
UserName varchar(100) 登录账号 不可重复
Password varchar(100) 登录密码
NickName varchar(100) 游戏昵称
Lv int 玩家等级 默认 0
Gold int 金币 默认 0
Diamond int 钻石 默认 0
3)AddColumn 扩展表字段

游戏版本更新新增属性(攻击力、公会 ID)时,动态追加列;

缺点:线上项目频繁改表会同步修改客户端实体,尽量前期预留字段。

4)InsertData 插入单条数据

注册账号核心方法,新玩家信息写入数据库生成新 UserId。

5)CheckExist (列名,值)

查询指定字段是否存在对应数据;注册时检测账号是否重复。

6)GetUserInfoByName(string account)

根据账号查询完整玩家信息,登录校验核心接口。

7)UpdateField 单字段更新

玩家升级、获取金币时,仅修改对应字段,无需覆盖整条数据。

8)DeleteData 按条件删除玩家数据

谨慎调用,线上游戏禁止随意删除账号数据。

4 线程安全补充

数据库操作方法内部加lock锁,多客户端并发注册 / 查询避免 SQL 并发错乱。

四、UserInfo 玩家实体类

1 概念

实体类和数据库表字段一一对应,作为数据库查询结果载体,服务端接收登录 / 注册消息后,转换为 UserInfo 对象处理业务。

完整实体结构

复制代码
public class UserInfo{
    public int UserId;
    public string UserName;
    public string Password;
    public string NickName;
    public int Lv;
    public int Gold;
    public int Diamond;
}

规范

数据库查询后自动填充实体所有字段,登录成功将 UserInfo 序列化发给 Unity 客户端,刷新大厅 UI(等级、金币展示)。

五、DBUser 业务数据库操作类(服务端专用)

1 定位

封装游戏业务专属数据库逻辑,基于底层 DBHelper 二次封装,分离底层 SQL 与业务注册 / 登录逻辑。

核心业务方法

  1. bool CheckAccountExist(string acc)检测账号是否已注册,返回 true = 账号存在,注册拦截;

  2. int Register(string acc, string pwd, string nick)新账号插入数据库,返回 0 成功、1 账号重复失败;

  3. UserInfo LoginCheck(string acc, string pwd)根据账号查询数据,密码匹配返回完整玩家信息;账号不存在 / 密码错误返回 null;

  4. void UpdateUserLv(int uid, int newLv)玩家升级更新数据库等级;

  5. void UpdateGold(int uid, int goldNum)充值、任务奖励更新金币。

2 服务端初始化流程

  1. 程序启动优先调用DBHelper.Instance.Init()连接数据库;

  2. 再启动 TCP 监听,防止未连库就接收客户端注册消息;

  3. 全局单例调用DBUser.Instance执行数据库业务。

六、登录 / 注册完整数据库业务流程

1 注册全流程

1 Unity 客户端发送 C2S_REG 消息(账号、密码、昵称);

2 服务端收到消息,调用DBUser.CheckAccountExist()

3 账号已存在:返回 S2C_REG_RESP Result=1(注册失败,弹窗提示账号重复);

4 账号不存在:执行 Register 插入数据库,返回 Result=0,注册成功自动登录跳转大厅。

2 登录全流程

1 客户端发送 C2S_LOGIN(账号 + 密码);

2 服务端调用DBUser.LoginCheck(账号)

3 返回 UserInfo 为空:账号不存在,返回错误码;

4 实体存在但密码不匹配:返回登录失败;

5 账号密码全部匹配:将 UserInfo 封装进回复消息下发客户端,大厅加载玩家数据。

七、服务端代码分层依赖关系

1 底层 DBDLL:MySql 驱动 + DBHelper(原生 SQL 封装);

2 业务层 DBUser:基于 DBHelper 封装游戏注册 / 登录;

3 LoginServer 服务端:引入 DBUser,处理网络消息 + 数据库交互;

4 客户端 Unity:仅收发消息,不直接操作数据库,所有数据校验交给服务端(防外挂作弊)。

核心安全拓展

客户端无法直接读写数据库,所有账号、金币、等级校验逻辑放在服务端数据库,杜绝本地修改数据作弊。

八、高频报错与解决方案

  1. MySql.Data.dll 引用报错:未添加项目引用、命名空间未 using;

  2. 数据库连接失败:MySQL 服务未启动、端口 3306 被占用、库名 / 账号密码写错;

  3. 注册重复账号未拦截:CheckExist 查询逻辑遗漏;

  4. 登录返回空:数据库密码字段和客户端传入密码不匹配;

  5. 消息接收数组越界:消息处理后 Uid 未重置,连续收发下标错乱;

  6. 数据库未初始化就处理消息:服务端启动顺序颠倒,先连库再开监听。

九、拓展

1 MySQL5.7 小皮一键部署流程,3306 端口作用;

2 DBHelper 单例设计优势,并发数据库操作加锁必要性;

3 玩家数据表字段设计思路,自增主键 UserId 作用;

4 注册账号查重业务逻辑,登录密码校验流程;

5 分层设计:底层数据库工具与业务操作分离;

6 游戏安全规范:数据库操作全部放在服务端,客户端无权读写库;

7 实体类 UserInfo 与数据库表一一映射的设计意义;

8 线上项目数据表优化建议:前期预留扩展字段,避免频繁 Alter 改表。

相关推荐
土星云SaturnCloud1 小时前
边缘计算驱动绿氢生产过程智能寻优:电解槽级实时优化技术解析
服务器·人工智能·ai·边缘计算
铅笔侠_小龙虾1 小时前
Rust 学习目录
开发语言·学习·rust
云泽8082 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦2 小时前
GO---可见性规则
开发语言·golang
IvorySQL2 小时前
PG 日报|社区讨论重构 pg_hba 配置文件格式
数据库·人工智能·postgresql·重构·ivorysql
逝水无殇2 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
Web极客码2 小时前
突破并发瓶颈:云端高性能架构如何赋能海外 AI Agent 矩阵的高效产出
服务器·人工智能·架构
一个有温度的技术博主3 小时前
【VulnHub 实战】DC-1 靶机渗透测试笔记(一):信息收集与主机发现
服务器·网络·笔记