IPLAT4C开发培训大纲.docx
《IPLAT4C开发培训大纲.docx》由会员分享,可在线阅读,更多相关《IPLAT4C开发培训大纲.docx(31页珍藏版)》请在冰豆网上搜索。

IPLAT4C开发培训大纲
BM2F培训明细
变更历史
2011-01-04创建<初稿>
2011-01-10修改<纠正目录结构>
2011-03-24添加<问答列表1,2,3>
2011-03-24添加<4.1.3.6,4.1.3.7>
2011-05-25添加<3.4,vs2008连接DB2>
第一部分:
培训大纲
第一章:
简介
1.1架构
1.1.1架构图
<1>BM2FrameworkforWindows<以下简称BM2F>是面向企业级业务逻辑运算的分布式应用程序架构,该架构由三个逻辑层组成:
客户端、应用程序服务器与数据库.这些层之间的逻辑关系,如下图所示.
客户端承载用户界面,用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面.用户界面既可以是基于WinForm窗体的应用程序,也可以是WEB浏览器.
应用程序服务器承载了DCDS与WEB服务器.DCDS负责处理来自EI客户端的服务调用请求,调用指定的业务逻辑层服务.WEB服务器负责响应来自浏览器的请求,通过EI客户端组件调用DCDS中指定的服务.
数据库为框架提供数据持久化服务,并保证业务逻辑中数据操作的事务完整性.
<2>组件关系图如下:
<经过框架封装,隐藏了服务调用细节,以与数据库操作细节,使开发者可以只用关心下图橙色的部分
类似权限,管理,代码管理,电文管理,消息通知等,此类基础模块,绝大多数项目都有,所以作为独立模块,集成到框架作为通用的,大家都用..也即
为了实现统一样式,使产品具有相同的风格,便于控制.设计了前台统一组件库
此处实际上是在控件<如button,textbox,label等>和窗体程序之间又加入了一层.如下所示:
1.1.2演示前台、后台、数据库
<1>前台画面
可简单地理解为:
类似主页,已包含导航栏,主菜单,页头,页脚一样,新作的画面只需添加一个菜单项,并添加一个超地址,即可.在点击后显示在预留的内容区域内.
<2>后台启动
启动Server下Ubind文件夹下的cnslhive.exe:
此处架构1是指在Server下Config目录下BM2.xml中的配置.
当启动了Ubind下的cnslhive.exe后,会根据BM2.xml中的配置,寻找Arch文件夹下的对应的CPP/PROC文件夹下的Ubind中的cnslbee.exe.通过后一个cnslbee.exe调用对应的Ubind下的*.dll以与libd下的*.lib.架构1指CPP,架构2指PROC
把配置文件中的Archs配置改为如下所示后,重新启动
注意下面进程路径,,新增了一个cnslbee.exe为Arch\PROC\Ubind\cnslbee.exe
<3>数据库访问
提供了统一的CDbCommand来操作数据库
1.2数据总线
1.2.1数据回路图
为了统一数据传输格式,便于控制,统一前后台调用方式.框架提供的数据容器EIInfo与EIClass,具有序列化与反序列化能力,以适应跨应用程序边界的数据传输.
EIInfo是一个.Net类,用于用户界面层,它内部封装了DataSet类.
EIClass是一个C++类,其内部结构与EIInfo一致,EIInfo与EIClass的架构与数据可以实现互相转换.
这样类似于在前后台之间又加入了一层,如上图所示
1.3数据库访问接口
1.3.1为什么要提供数据访问接口<数据库、操作系统>
不同的数据库提供的数据访问接口不同,对不同操作系统的支持度也不一样,编程方式也有所差异,就像C#前台访问数据库,有SqlConnection,OleDbConnection等一样,为了屏蔽数据库操作的差异,框架中提供了统一的访问接口,便于在不同数据库,不同操作系统上进行移植
1.3.2如何实现一致的数据访问接口
为了屏蔽不同数据库,不同操作系统的操作差异,框架提供了统一的数据访问接口
相当于在各个数据库提供的API与编程人员的后台调用程序之间又加入一层.封装了,不同数据库的判断操作
1.4业务逻辑层数据类型
1.4.1PROC
--待补充--
1.4.2CPP
第二章:
开发用户界面层
2.1创建项目
打开Client端解决方案,新建一个项目DEMP位于Client\DE目录下,项目类型选择类库.<如DEMP,DE是一级模块,MP是二级模块>.一级模块文件夹位于Client下,与EH,EP平行<如DE,FI,QM等>,二级模块在对应的一级模块下<如DEMP在DE文件夹下,FIAA,FIAP在FI文件夹下>,一级模块文件夹<如DE>没有,则新建文件夹,然后再添加新建项目,
修改项目属性:
:
程序集名称:
DEMP,默认名称空间DE,输出类型:
类库,输出路径:
..\<使用相对路径位于一级模块下>.重新生成项目,然后查看项目所在文件夹,在一级模块下会看到刚生成的DLL,如DE下的DEMP.dll
删掉项目下的多余项<如class1.cs.>,为项目添加常用引用EI.dll<使用时,再添加也可以>
2.1.1目录结构
2.1.2命名规范
项目
最长位数
填写方式
中文简称
独立定义
举例:
DEMP.DLL
A
2
字母
一级模块名
Y
DE
B
8
字母
DLL描述
N
MP
C
4
.DLL
DLL文件类型后缀
N
.DLL
2.2创建业务功能主界面
客户端可使用任何形式的窗体,但是如果要在框架主画面中,已Tab页形式打开,必须继承自EFFormMain<或它的子类,如EFForm,EFFormListDetail等>.
2.2.1创建流程
单击选择项目,右击添加新项,选择WindowsForms,选择继承的窗体,输入窗体名称如:
FormDEMP06.cs点击确定.在弹出的继承选择器中,点击浏览,找到Client\EP下的EF.dll,选择要继承的窗体<如EFForm>,点击确定
2.2.1.1命名规范
项目
位数
填写方式
中文简称
独立定义
FormDEMP01
A
4
Form
画面标识
N
Form
B
2
C
一级模块名〔大写〕
Y
DE
C
2
C
二级模块名〔大写〕
Y
MP
D
2
C
流水号
N
01
E
2
C
扩展流水号
N
2.2.1.2EI.xml.配置
如下所示,会根据Defulat名称找默认的配置项,此处为local,根据ServerAddress服务地址,和DefaultPort监听端口,找对应的ServerType类型的服务..
也即EI组件,会根据EI.xml配置会找启动的Server\Ubind\cnslhive.exe..并与之建立通信,当需要时<如调用了CallServers方法>时,调用应用程序服务器端对应的service
2.3添加控件
2.3.1添加工具箱控件
在工具箱上右击,添加选项卡--->然后在上面右击弹出菜单,点击选择项-->根据向导浏览找到EP下的EF.DLL.点击确定
添加成功:
2.3.2创建数据集
在服务器资源管理器窗口,连接数据库.添加成功后.
为项目添加新建项----选择数据集.
然后即可在数据集的设计窗体中,右击添加表,添加列或者从已连接的数据库中拖放相应的表到设计窗体:
修改字段的Caption属性,DataType属性..Caption将作为中文标示,显示在textbox前或显示在列表头部,是日期型的修改DataType
2.3.3向画面添加Grid控件
<1>直接选择数据源中某一表,选择自定义控件找到EFDevGrid,选中后,拖拉到画面即可
或者,先拖放一个EFDevGrid到画面,然后为EFDevGrid创建一个新的GridView,然后设定DevGrid的DataSource.为数据集中某一张表.
2.3.4向画面添加详细控件
如上一,选择详细信息.拖拉到窗体上面即可
拖放详细时,要为字段设计控件<默认为微软的TextBox,DateTimepicker等>.可选择字段,然后点击右边下拉选择自定义,如果自定义中没有要找的控件,需要添加工具箱中的项
若窗体使用了LayoutControl控件<如继承自EFFormListDetail时>,拖放详细时,如果字段较多,会比较慢,请等待下,或单字段拖放
当开发人员的操作是一次性的,或者只是速度,性能上的问题时,建议考虑选择让最终用户操作更方便的开发模式..性能会随着软,硬件技术的提高而改进.方便使用上,却不易改变.<产品的最终发布可能会滞后开发1,2年甚至更久>
2.4数据集EIInfo操作
EI包括标准化的EIInfo和EITuxedo信息转换组件.它完全屏蔽了底层交换细节,解放了开发人员,使开发人员精力集中于业务数据的组织,而不用关心具体的交换机制,实现了数据交换的模块化.
EIInfo是继承自DataSet.并添加了一些属性.<如块的概念,sysInfo等>.此文档暂不考虑通过块来操作EIInfo,建议通过DataTable来操作行列数据.以下对DataSet的操作均可用于EIInfo
2.4.1数据集介绍
--可参考MSDN中定义
DataSet是数据表的集合,它可以包含任意多个数据表〔DataTable〕.数据表实质是有行〔DataRow〕和列〔DataColumn〕组成的集合.为了保护内存中数据记录的正确性,避免并发访问时的读写冲突,DataSet对象中的DataTable负责维护每一条记录,分别保存记录的初始状态和当前状态.
通过添加、更新或删除DataRow对象更改单个DataTable对象中的数据.调用GetChanges方法以创建只反映对数据进行的更改的第二个DataSet.针对DataSet调用AcceptChanges提交更改.或者,调用RejectChanges以取消更改.
可以简单地看做一个数据表的集合,可以通过类似,以下方式访问,表或操作表内信息
操作代码如下
2.4.2添加Table
先获得表对象Tables.可看做一个表的数组,然后为改数组新增,或修改,访问等.
可通过索引或表名称访问数据对象<表DataTable>;
2.4.3添加Column
先获取,表的Columns对象,如上可看做一个数组.
2.4.4添加Row
2.5调用业务逻辑服务
因前后台应用程序分离<使用的语言不一样,操作系统也可能不一样>,为了规范调用方式.框架规定调用方法.同时统一参数类型,要求封装到类似DataSet的EIInfo内.也封装了内部转换细节,前台放到EIInfo,后台对应EIClass..可以认为两者结构完全相同
2.5.1调用后台服务
(1)不需要向后台传入参数的情况
<2>向后台传入参数
2.5.2错误处理
<1>后台的错误信息,放入s.msg..在前台即可通过..进行获取
(2)默认情况下,如果窗体出现未捕获的异常,将向上层抛出,至到Main方法为止,会执行EH如下代码,并弹出与下图类似的弹出框..
要尽量避免弹出此对话框,要在可能出现异常的地方,使用trycatch语句,主动捕获异常,为了统一方便,建议在窗体事件中<包括窗体加载,显示,和由用户触发的一切事件>,添加trycatch语句.类似:
a)错误信息的处理:
可以使用类似this.EFMsgInfo=ex.Message;//在框架左下角显示
也可以用弹出框,提示错误信息
2.6获取后台返回信息
如以上2.5中所讲,在后台service中对参数bcls_ret的操作<添加列,行,赋表名等>,,在前台的调用CallService的返回值中,以同样结构读取即可..
可简单地认为后台对bcls_ret的操作.即是对前台调用CallService方法的返回值outInfo的操作.类型为EIInfo继承自DataSet.可以像操作DataSet一样操作EIInfo
例如:
第三章:
开发业务逻辑层
3.1创建后台项目
因后台项目配置属性较多,建议通过直接复制现有有项目<找目录结构类似,且生成成功的项目来复制>进行修改,然后通过添加现有项,添加到解决方案中..
主要的几点配置项解释如下:
输出目录<在CPP.或PROC对应下的Ubind<发布版在Ubin>目录下.
包含目录,<头文件位置,server下的Include和CPP/PROC下的Include>
附加库<函数库[静态库]存放位置,Libd/Lib目录下
3.1.1目录结构
Server端一级目录主要文件夹如下所示:
其中架构Arch下,包含CPP和Proc两种类型,以下以CPP为例,proc类似
其中Dev下存放,一级目录,然后是二级目录,然后是动态库,静态库文件..<此处没有严格定义,只要生成的静态库lib文件,和动态库dll文件能放到对应的Libd,Ubind下即可.
3.1.2命名规范
动态库以p_开头+模块名称+_服务号,..服务号1000以下为框架预留,业务使用1001~30000
项目
位数
填写方式
中文简称
独立定义
p_demp_18510
A
1
p
程序简称
N
p
B
1
_
分隔符
N
_
C
4
字母
模块名
Y
demp
D
1
_
分隔符
N
_
E
2
数字
服务号
Y
18510
3.2创建服务Service
3.2.1创建流程
在项目下,添加新建项,选择cpp文件,文件名可以取服务名称..
文件写法如下:
3.2.2命名规范
通常取画面名+_功能名称,如demp01_inq.必须唯一,比如demp01_inq不能即出现在18510里面,又出现在4100里面
3.2.3服务入口
//Service入口
BM2F_ENTERACE
3.2.4注册服务
服务的注册其实是插入到了表TEA01中.通过EA01,EA03画面,可按以方法插入:
<1>在EA03页面,添加要注册的服务.程序名称为服务名称,说明是自定义的说明,路径一般为/Dev/DE<其中DE为顶级模块名,可能是FM,YM等>子系统为二级模块名,如DEMO<或者FM下的FMBD等>.程序类别选择S-Service.
<2>在EA01.新增后,根据模块名,或者程序名称,可以在EA01中的待配置服务中,查询到,选择要配置的项,输入Server号,点击<<添加按钮.<注:
如果某一个服务如demp01_inq在EA03中确实添加成功了,而在EA01的带配置项中查找不到,可以在中间的对应关系区查看是不是被添加到其他服务号下面了,如果添加了,则移除掉,重添加---->
3.3调试服务
调试是开发人员在编写程序的过程中,使用工具对程序的执行情况进行跟踪,.可检测执行的结果与预想是否一致,有助于查找错误.提供开发效率.
3.3.1BM2.xml介绍
在第一章做过介绍,BM2.xml位于Server端的Config目录下,主要是配置数据库,以与架构信息,支持.
3.3.2调试服务处理进程
3.3.2.1自动附加
(1)后台调试时,设置成Debug,平台选择Win32〔默认即是〕
(2)设置BM2.Runtime.Cpp.ConsoleBee项目为启动项目,并修改BM2.Runtime.Cpp.ConsoleBee项目属性中---调试属性中的附加--改为"是"
(3)启动Server下的Ubind下的cnslhive.Exe..然后点击运行〔F5〕启动调试.设置断点,执行前台运行画面.即可调试
(4)比起下一节介绍的手动附加,有个缺点就是,当想停止调试时,调试菜单下的全部分离无效,需要点击停止调试或中断..
偶尔会出现把对应的进程cnslbee.exe给停掉,导致下一次点击启动调试时,提示..关掉cnslhive.exe重新启动即可
3.3.2.2手动,选择附加到进程
如下图所示,选择菜单栏调试->附加到进程-->选择cpp项目对应的cnslbee.exe.前面提到过,当启动Server下Ubind下的cnslhive.exe时,会根据bm2.xml中的架构配置信息,到Arch找CPP或<和>PROC的文件夹下的Ubind里面的cnslbee.exe..当启动两个架构时,进程会出现两个cnslbee.exe..不便于区分,选错的话,又启动不了调试,所以建议选择自动附加,按上面的介绍进行调试
如需停止调试,选择调试中的全部分离即可.
3.4编写业务逻辑
业务逻辑用C++实现,可理解为:
除了前台<界面层>传入参数从bcls_rec中读取,要返回的值放入bcls_ret外,其他内容可完全自理<也可使用框架预定义的方法,数据类型,变量等>
3.4.1获取用户界面层输入数据
用户界面层〔前台画面〕输入的数据,放在EIInfo中,到了后台〔框架封装了具体转换过程〕就在第一个参数bcls_rec中,.EIClass也是一个继承自数据集的类对象.bcls_rec为EIClass类型的一个指针,可理解为"指向前台传入的EIInfo值"...而第二个参数bcls_ret即可看成是指向调用CallService的返回值EIInfo的指针.;
->操作符用于指针如:
bcls_rec->Tables定位到表的数组对象;
[]用于数组,下标从0开始,如bcls_rec->Tables[0].取得第一张表
.类对象,使用"."点操作符.如bcls_rec->Tables[0].Rows取得第一张表的行数组
:
:
域操作符,可使用于名称空间如BM2:
:
CStringBM2下的CString类.
可使用于类,如BM2:
:
CConvert:
:
ToString;CConvert的ToString方法<此处是静态方法,否则,需要使用.
框架封装的类:
参考//10.25.18.12/BM2F_Win/文档/BM2FrameworkforWindowsSDK参考.doc>
3.4.1.1CString
Delete;
从指定位置开始,删除指定数量的字符.
voidEmpty<>;
清空当前实例.
intFindconst;
报告指定的CString在此实例中的第一个匹配项的索引.该搜索从指定字符位置开始.
intFindconst;
报告指向字符数组的指定指针指示的值在此实例中的第一个匹配项的索引.该搜索从指定字符位置开始.
BM2_TCHARGetAtconst;
获取当前CString对象中位于指定字符位置的字符.
intGetLength<>const;
获取当前示例包含字符的数目.
CStringInsert;
在此实例中的指定索引位置插入一个指定的CString实例.
CStringInsert;
在此实例中的指定索引位置插入一个指向字符数组的指定指针指示的值.
boolIsEmpty<>const;
报告此示例是否包含任何字符.
CStringReplace;
将此实例中的指定CString的所有匹配项替换为其他指定的CString.
voidSetAt;
设置此示例指定位置的字符.
CStringSubstringconst;
从此实例检索子字符串.子字符串从指定的字符位置开始.
CStringSubstringconst;
从此实例检索子字符串.子字符串从指定的字符位置开始且具有指定的长度.
CStringToLower<>;
返回此String的转换为小写形式的副本
CStringToUpper<>;
返回此String的转换为大写形式的副本,返回时使用当前区域性的大小写规则.
CStringTrim>;
从当前CString对象移除指定的字符的所有前导匹配项和尾部匹配项.
CStringTrimLeft>;
从当前CString对象移除指定的字符的所有前导匹配项.
CStringTrimRight>;
从当前CString对象移除指定的字符的所有尾部匹配项.
3.4.1.2CDecimal
CDecimalAbsconst;
Abs方法获取SqlDecimal参数的绝对值.
CDecimalCeilingconst;
返回大于或等于指定SqlDecimal结构的最小整数.
CDecimalConvertToPrecScaleconst;
将SqlDecimal操作数的值调整为指定精度和小数位数
CDecimalFloorconst;
将指定SqlDecimal数字舍入为下一个较小的整数.
BM2_INT8GetPrecision<>const;
获取用于表示Value属性的最大位数.
BM2_INT8GetScale<>const;
获取Value解析为的小数位数.
boolIsNull<>const;
指示此SqlDecimal结构的Value是否为Null.
boolIsPositive<>const;
指示此SqlDecimal结构的Value是否大于零.
staticCDecimalParse;
将数字的String表示形式转换为其等效的SqlDecimal形式.
staticCDecimalParse;
将数字的String表示形式转换为其等效的SqlDecimal形式.
CDecimalPowerconst;
将指定的SqlDecimal结构的值乘到指定的幂.
CDecimalRoundconst;
以指定精度获取与指定SqlDecimal结构的值最接近的数字.
CDecimalRound