DbConnection - ScutGame/Scut GitHub Wiki

此章节介绍如何使用服务端的关系型数据库

对传统关系型数据库支持

Scut可以支持MSSQL(微软的数据库)和MySql两种数据库的操作,数据库切换只需要更改配置即可完成,开发者不需要过于关注数据库的知识,对于从事客户端的开发者是一个很大的便利。

游戏中配置连接

在GameServer.exe.config文件中配置connectionStrings节点,如下配置:

<connectionStrings>
    <add name="{连接Key}" providerName="{使用的数据库驱动类型}[SqlDataProvider|MySqlDataProvider]" connectionString="Data Source={数据库所在的服务器地址};Database={你的数据库名};Uid={登录数据库的账号};Pwd={登录数据库的密码};" />
</connectionStrings>

配置参数说明:

{连接Key}: 配置数据库连接信息的Tag标签,在实体定义时EntityTable配置中使用

{使用的数据库驱动类型}:提供配置使用哪种数据库,SqlDataProvider指定使用MSSQL数据库,MySqlDataProvider指定使用MySql数据库

{数据库所在的服务器地址}:数据库地址,如果是本机,使用localhost

{你的数据库名}: 需要连接的数据库名

{登录数据库的账号}:MSSQL默认账号是sa,MySql默认账号是root

{登录数据库的密码}:安装数据时的输入的密码

  • 使用MSSQL数据库配置
<connectionStrings>
    <add name="ConnKey1" providerName="SqlDataProvider" connectionString="Data Source=localhost;Database=MyDataDb;Uid=sa;Pwd=123456;" />
</connectionStrings>
  • 使用MySql数据库配置
<connectionStrings>
    <add name="ConnKey1" providerName="MySqlDataProvider" connectionString="Data Source=localhost;Database=MyDataDb;Uid=root;Pwd=123456;" />
</connectionStrings>

实体定义示例需要配置如下(配置中的Tag:“ConnKey1”需要在以下中对应):

[EntityTable(CacheType.Entity, "ConnKey1")]
public class UserRanking : ShareEntity
{
}

调用操作方法

提供了DbConnectionProvider类操作数据库的方法,使用CreateDbProvider方法创建一个操作数据库连接;

var dbProvider = DbConnectionProvider.CreateDbProvider("ConnKey1");
int id;
//查询2015年后等级等于10级的所有记录, 以时间降序
var command = dbProvider.CreateCommandStruct("MyTable", CommandMode.Inquiry);
command.Columns = "Id, Name, Lv, createTime";
command.Filter = dbProvider.CreateCommandFilter();
command.Filter.Condition = string.Format("{0} AND {1}", dbProvider.FormatFilterParam("createTime", ">"), dbProvider.FormatFilterParam("Lv"));
command.Filter.AddParam("createTime", "2015-01-01");
command.Filter.AddParam("Lv", 10);
command.OrderBy = "createTime desc";
command.Parser();
using (var dr = dbProvider.ExecuteReader(CommandType.Text, command.Sql, command.Parameters))
{
    while (dr.Read())
    {
        id = dr["Id"].ToInt();
    }
}

//更新数据,存在则更新,否则插入
id = 10;
command = dbProvider.CreateCommandStruct("MyTable", CommandMode.ModifyInsert);
command.AddParameter("Name", "Scut");
command.AddParameter("Lv", 11);
command.AddParameter("createTime", DateTime.Now);
command.Filter.Condition = dbProvider.FormatFilterParam("Id");
command.Filter.AddParam("Id", id);
command.Parser();
//放入Redis消息队列中异步写入(默认开启2个队列),1表示分配到哪个队列处理(1对2取模),
dbProvider.ExecuteNonQuery(1, CommandType.Text, command.Sql, command.Parameters);
//及时写入
dbProvider.ExecuteQuery(CommandType.Text, command.Sql, command.Parameters);

//删除
command = dbProvider.CreateCommandStruct("MyTable", CommandMode.Delete);
command.Filter.Condition = dbProvider.FormatFilterParam("Id");
command.Filter.AddParam("Id", id);
command.Parser();
dbProvider.ExecuteQuery(CommandType.Text, command.Sql, command.Parameters);