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);