这一节主要说一下配置文件(xml),它是这一切的关键,它描述了你的DB Server都有那些通讯协议,以及都需要的访问那些数据库,还有就是你的每个网络消息都要对应到数据中的那些表和字段上去。下面对这几部分进行一下说明:
第一部分:
<ProtoFile>
<FileItem Title="测试消息协议文件" FileName= "DBStudent.proto" /> //协议文件,你可以在这添加多个协议文件。
</ProtoFile>
我想这个大家都能看明白,就是列举一下服务都需要那些Proto文件,当然例子中只提供了一个DBStudent.proto文件,实际上这没什么好多说的,唯一需要说的就是Title可以为空。这只是给写配置文件的人看的。
第二部分:
<DBCfg>
<DBItem Title="DB标题1" KeyIdx="1" DBName= "test" DSN="test" UserName= "test" Password = "test" SqlConnectCount="0" />
<DBItem Title="DB标题2" KeyIdx="11" DBName= "test" DSN="test" UserName= "test" Password = "test" SqlConnectCount="128" />
</DBCfg>
这部分是配置你的服务都需要访问那些数据库。就本例来说,这个是需要你在odbc上配置的。当然这里面列出的两个数据库实际上指向的是一个。SqlConnectCount="128" 是服务联接到数据库的联接数,如果你服务的并发数很大的时候最好也将这个数设置的大一些。当然写零的话,程序为有默认的联接数。 KeyIdx =1 这是给当前的数据库联接分配一个整形的索引数值,这个数为什么是手动写的,而不是程序自动分配的,等下一个版本出现后,你就会明白这个手动配置的重要性了。 这部分同样可讲的不多,当然在下一个版本里面,还会有Redis服务器的联接信息区段。
第三部分
<MsgList>
</MsgList>
这里面就是具体的消息处理过程了,共有select、update、Insert、delete和存储过程共五种类型,他包括了访问数据库的最常用几种方式,下面分别来说一下。
1、select语句
<MsgItem ID= "123" MsgName="Msg123" AckID="8123" ProtoMsgName="GetStudent" AckMsgName="AckStudent" ResultAckField="Result" MainKeyIdx="-1" SubKeyIdx="-1" > //ResultAckField="Result" 结果应答字段 将本次操作成功与否写入应答消息的这个字段,必须int32类型,可选项
<DBIdx>1</DBIdx>
<OperType>1</OperType> // 1 Select;2 Insert;3 update; 4 delete ; 5存储过程 ;
<TableName>Achievement</TableName>
<ColInfo ColName="StudentName" DataType="string" DataSize="20" WhereStr="" AckIdx="6" AckSubIdx="1" /> //
<ColInfo ColName="sum(Mark) as sumMark" DataType="int" DataSize="8" WhereStr="" AckIdx="6" AckSubIdx="2" />
//WhereStr 简单条件 MsgIdx为收到的Proto消息序字段号索引 AckIdx 为应答内容应写入的索引 AckSubIdx 为应答时的重复字段
<WhereInfo WhereStr="and RecTime >= '%s' " MsgValueIdx= "2"/> //MsgValueIdx 消息变量的索引,将其按类型拼成Where条件,变量会自动转成字符串
<WhereInfo WhereStr="and CurriculumID = %s " MsgValueIdx= "1"/> //MsgValueIdx 消息变量的索引,将其按类型拼成Where条件,变量会自动转成字符串
<GroupInfo>StudentName</GroupInfo>
<OrderInfo>sumMark desc</OrderInfo>
</MsgItem>
Select语句是最复杂的,如果把他看明白了,后面的语句就是很轻松的了。当然在看这个配置的时候,还是要对照着proto协议。建议大家在用这个动态库的时候,先准备好表结构和定议好proto协议后在来配置这个XML文件。
MsgItem ID= "123" 这是你消息的ID号,本质上来说,你只要所有的消息不重就可以。没有其它的规则,但我想你的服务一定会对消息号的区段有整体规划。这里的数值123是十进制的。
MsgName="Msg123" 消息名称,这个写不写无所谓。
AckID="8123" 应答的消息ID号,
ProtoMsgName="GetStudent" 请求消息体的名字,这个配置就要具体看你的DBStudent.proto文件了,这个名称就是告诉服务来一段数据,他的解码协议是那个。如果协议中消息名修改了,这里也一定要做相应的修改。
AckMsgName="AckStudent" 应答消息体的名字,
ResultAckField="Result" 结果应答字段 将本次操作成功与否写入应答消息的这个字段,必须int32类型,可选项
以上的几个信息就是描述你发来的消息ID是那个,发来消息应当用什么协议去解析,查询的结果要按照什么协议格式去赋值,服务应当返回什么样的应答ID。
MainKeyIdx="-1" SubKeyIdx="-1" 这两项现在未用,他会在下一个版本中使用。
<DBIdx>1</DBIdx> 这项指明这个操作要在那个数据库上进行参见,这里的是<DBItem Title="DB标题1" KeyIdx="1" /.> 与KeyIdx="1"对应。
<OperType>1</OperType> 操作类型 取值为 1 Select;2 Insert;3 update; 4 delete ; 5存储过程 ; 这里设为1 表明现在要做的是个查询
<TableName>Achievement</TableName> Achievement 要查询的表名 在这一项里,可以是几个表的表名及别名。如
<TableName>Achievement a ,Curriculum b</TableName> 。这就是我们要关联查询两张表,并为每个表都取了一个别名。分别叫a和b.。当然在下面的的列信息中,列名前就要加上a或b了。 (如果你的表名有架构名的话,也一定要在表名前把它加上) 看下面列信息这行。
<ColInfo ColName="a.StudentName" DataType="string" DataSize="20" WhereStr="" AckIdx="6" AckSubIdx="1" />
ColName 这项就是你数据库里面那一列的名字,前面是否要加别名,刚才以经说过了,要看你的表名是如何写的。当然这一项也可以写统计函数什么的,如
<ColInfo ColName="sum(Mark) as sumMark" DataType="int" DataSize="8" WhereStr="" AckIdx="6" AckSubIdx="2" >
总之一句话,他是你select 关键字 后面用豆号分开的每一列。而Tablename是from和Where关键字中间部分。
下面正式讲列信息
<ColInfo ColName="sum(Mark) as sumMark" DataType="int" DataSize="8" WhereStr="" AckIdx="6" AckSubIdx="2" >
ColName前面说了, DataType="int" 指定这一列是什么数据类型的 DataSize="8" 指定这类型多长,当然对 int指定长度没意议,主要针对的是DataType="string" 也就是字符串类型。 WhereStr="" 针对这列的条件字段,可以为空,条件在下面集中写也是可以的。
AckIdx="6" AckSubIdx="2" 这要和proto协议一起看了。这段指定,从数据库中查出的数据(这一列)。要写到那个proto字段中。看下协议
message StudentRecData
{
optional string StudentName = 1 ;
optional int32 Mark = 2 ;
optional string CurriculumName =3 ; //学科名
}
message AckStudentRec
{
optional int32 Ret = 3 ;
repeated StudentRecData DataItems = 6 ;
}
AckIdx="6" 指明把数据写到 AckStudentRec的 DataItems 项 .AckSubIdx="2" 标明写到optional int32 Mark = 2 ; 这是个proto的嵌套协议。 当然如果不是嵌套的 AckSubIdx项不用填。
<WhereInfo WhereStr="and RecTime >= '%s' " MsgValueIdx= "2"/>
<WhereInfo WhereStr="and a.CurriculumID <=%s and a.CurriculumID = b.CurriculumID " MsgValueIdx= "1"/>
所有的WhereStr会联起来,组合成一个条件语句,即使只有一行条件,前面也要以 and 关键字开头,因为系统默认前面有个 1=1 。MsgValueIdx 消息变量的索引,将其按类型拼成Where条件,变量会自动转成字符串。也就是说,将请求消息转成字符串,并替换 WhereStr 串中的 %S
<GroupInfo>StudentName</GroupInfo> 有些select语句是要按一些字段进行分组的,这些分组信息就写在这里。当然如果你是多个表关联查询的话,还要指出表名或者别名。多字段以逗号分开。
每一个消息中,只能存在一个GroupInfo OrderInfo 也是一样的。
<OrderInfo>a.CurriculumID , a.Mark desc</OrderInfo> 这里列出查询结果是按那几个字段进行排序。
这章会把xml讲完,待 续.....