1、整体把握SPL框架的使用流程,理解SPL的思想,从整体全面出发.
2.理解和运用数据库实体类、映射自动生成工具。在这里就需要会运用RootBata,它是一个SPL框架的辅助工具,可以支持Oracle、SQL Server、Access数据库。
3、RobotBata用法的详解。如图所示为配置数据库的连接图:
RobotBat配置数据源界面截图
Provider表示所支持的数据库类型,Password所连接数据系统的密码(这里需要说明的是数据在该方式下一定需要设置密码的,且必须是SQL Server模式下的),User ID 表示连接数据库系统的用户名(同Password),Initial Catalog表示所连接的数据库名称(Test),Data Source表示所连接数据库的资源,这里可以是本地(./127.1.1.0/local)都可以,也可以是网络数据资源(比喻这里连接设置到10.10.80.126是一局域网上的数据源,在写文档时我的IP是10.10.80.154)。将上述资料配置完毕后测试一下是否连接数据源成功,单击【测试】如图示:
RobotBat配置数据源成功
4、单击RobotBat上的【 】图标,则会出现在Test数据中用户已经建立好的所有表,如图所示:
单击【 】后将所有的表都选中以便在后面生成对应的映射文件----XML文件,如图所示:
5、生成映射文件Configs文件夹和TableEntity文件夹。在【文件】à【Save XML To】生成的时候我们需要事先给指定生成文件所在的地方,如图所示:
在【文件】à【Save Code File】生成我们封装好的.cs文件,此时我们亦需要给其指定路径的,如图所示:
选择【是】则保存到默认上述文件夹下面,选择【否】则退出。
在Configs文件夹中有ClassMap.xml、DataBaseMap.xml、Menu.xml三个文件
ClassMap.xml部分内容如下:
<?xml version="1.0" encoding="utf-8"?><map>
<class name="Course" table="Course" database="Test">
<attribute name="CID" column="CID" type="String" key="primary" />
<attribute name="SID" column="SID" type="String" />
<attribute name="Cname" column="Cname" type="String" />
<attribute name="Cgrade" column="Cgrade" type="Integer" />
</class>
<class name="Goods" table="Goods" database="Test">
<attribute name="ID" column="ID" type="Integer" increment="true" key="primary" />
<attribute name="Goods_Name" column="Goods_Name" type="String" />
<attribute name="Goods_Unit_Price" column="Goods_Unit_Price" type="Double" />
<attribute name="Goods_Factory" column="Goods_Factory" type="String" />
</class>
<class name="StuInfo" table="StuInfo" database="Test">
<attribute name="SID" column="SID" type="String" key="primary" />
<attribute name="Sname" column="Sname" type="String" />
<attribute name="Sdept" column="Sdept" type="String" />
</class>
……其他表的属性化没有列出
</map>
DataBaseMap.xml的内容如下:
<?xml version="1.0" encoding="utf-8"?><map>
<database name="Test" type="MsSqlServer">
<parameter name="User ID" value="sa" />
<parameter name="Data Source" value="10.10.80.154" />
<parameter name="Provider" value="SQLOLEDB.1" />
<parameter name="Initial Catalog" value="Test" />
<parameter name="Password" value="sa" />
<classMapFile path="ClassMap.xml" />
</database></map>
……为配置数据库类型连接的相关信息。
Menu.xml的内容如下,为显示本公司综合系统的菜单配置信息。
<?xml version="1.0" encoding="utf-8" ?>
<Menus>
<!-- 目录配置文件,需要配合JsCookMenu来进行显示 -->
<Items>
<item icon="" title="系统管理" url="" target="" description="描述信息" priv="" visible="1">
<item icon="javascript/JSCookMenu/default/category_new.png" title="系统维护" url="" target="" description="系统基础信息维护" priv="" visible="1">
<item icon="javascript/JSCookMenu/default/category.png" title="一级模块" url="Pages/SysManager/AppManager/App_list.aspx" target="" description="描述信息" priv="1-S00M00" visible="1"></item>
<item icon="javascript/JSCookMenu/default/module.png" title="二级模块" url="Pages/SysManager/ModuleManager/Module_list.aspx" target="" description="描述信息" priv="1-S00M07" visible="1"></item>
<item icon="" title="split" url="" target="" description="" priv="" visible="1" />
<item icon="javascript/JSCookMenu/default/report.png" title="数据字典" url="Pages/SysManager/DictManager/Dict_List.aspx" target="" description="描述信息" priv="1-S00M04" visible="1"></item>
<item icon="javascript/JSCookMenu/default/order_status.png" title="环境配置" url="Pages/SysManager/SystemConfig/SystemConfig.aspx" target="" description="描述信息" priv="1-S01M02" visible="1"></item>
<item icon="javascript/JSCookMenu/default/server_info.png" title="系统设置" url="Pages/SysManager/SystemSetting/SysTableSettings_Mantence.aspx" target="" description="描述信息" priv="1-S01M03" visible="1"></item>
<item icon="" title="split" url="" target="" description="" priv="" visible="1" />
<item icon="javascript/JSCookMenu/default/server_info.png" title="运行状态" url="Pages/SysManager/SystemState/SystemState.aspx" target="" description="描述信息" priv="1-S01M00" visible="1"></item>
</item>
<item icon="javascript/JSCookMenu/default/category_new.png" title="操作员管理" url="" target="" description="操作员管理" priv="" visible="1">
<item icon="javascript/JSCookMenu/default/users.png" title="操作员列表" url="Pages/SysManager/UserManager/User_List.aspx" target="" description="描述信息" priv="1-S00M03" visible="1"></item>
<item icon="javascript/JSCookMenu/default/user_group.png" title="角色资料" url="Pages/SysManager/RoleManager/Role_List.aspx" target="" description="描述信息" priv="1-S00M02" visible="1"></item>
<item icon="javascript/JSCookMenu/default/user.png" title="在线用户" url="Pages/SysManager/OnlineUserManager/OnlineUser_List.aspx" target="" description="描述信息" priv="1-S00M06" visible="1"></item>
</item>
<item icon="javascript/JSCookMenu/default/option.png" title="单位管理" url="Pages/SysManager/UnitManager/Unit_Frame.aspx" target="" description="描述信息" priv="1-S00M01" visible="1"></item>
<item icon="javascript/JSCookMenu/default/information.png" title="系统公告" url="Pages/SysManager/NoticeManager/SysNotices_Pub.aspx" target="" description="描述信息" priv="1-S01M04" visible="1"></item>
<item icon="" title="split" url="" target="" description="" priv="" visible="1" />
<item icon="javascript/JSCookMenu/default/review.png" title="事件日志" url="Pages/SysManager/LogManager/Log_List.aspx" target="" description="描述信息" priv="1-S00M05" visible="1"></item>
<item icon="javascript/JSCookMenu/default/review.png" title="错误日志" url="Pages/SysManager/SystemErrorLog/ErrorLog.aspx" target="" description="描述信息" priv="1-S01M01" visible="1"></item>
<item icon="javascript/JSCookMenu/default/users.png" title="密码修改" url="Pages/SysManager/UserManager/UserPwd_Update.aspx" target="" description="描述信息" priv="" visible="1"></item>
<item icon="javascript/JSCookMenu/default/logout.png" title="退出" url="javascript:doLogout();" target="" description="描述信息" priv="" visible="1"></item>
<item icon="javascript/JSCookMenu/default/logout.png" title="余成勇SPL框架测试" url="Pages/Alex/SPLTest.aspx" target="" description="" priv="" visible="1"></item>
</item>
</Items>
</Menus>
在TableEntity文件夹中生成的是所有的表对对象的一个封装,将没给表对象的属性、字段、方法进行封装,以至于在后面可以直接运用,如图所示:
在这里仅仅给出一个文件内容共参看(以Course.cs的内容为例)。
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.1433
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
// -------------------------------------------------------------
//
// Powered By: SR3.1(SmartRobot For SmartPersistenceLayer 3.1) 听棠
// Created By: Administrator
// Created Time: 2009-7-31 11:25:20
//
// -------------------------------------------------------------
namespace Lentro.Web.FrameWork.BusinessEntity
{
using System;
using System.Collections;
using System.Data;
using PersistenceLayer;
/// <summary>该类的摘要说明</summary>
[Serializable()]
public class Course : EntityObject
{
/// <summary>CID</summary>
public const string CID_ = "CID";
/// <summary>SID</summary>
public const string SID_ = "SID";
/// <summary>Cname</summary>
public const string CNAME = "Cname";
/// <summary>Cgrade</summary>
public const string CGRADE = "Cgrade";
private string m_CID;
private string m_SID;
private string m_Cname;
private int m_Cgrade;
/// <summary>构造函数</summary>
public Course()
{
}
/// <summary>属性CID </summary>
public string CID
{
get
{
return this.m_CID;
}
set
{
this.m_CID = value;
}
}
/// <summary>属性SID </summary>
public string SID
{
get
{
return this.m_SID;
}
set
{
this.m_SID = value;
}
}
/// <summary>属性Cname </summary>
public string Cname
{
get
{
return this.m_Cname;
}
set
{
this.m_Cname = value;
}
}
/// <summary>属性Cgrade </summary>
public int Cgrade
{
get
{
return this.m_Cgrade;
}
set
{
this.m_Cgrade = value;
}
}
}
/// Course执行类
public abstract class CourseAction
{
private CourseAction()
{
}
public static void Save(Course obj)
{
if (obj!=null)
{
obj.Save();
}
}
/// <summary>根据主键获取一个实体</summary>
public static Course RetrieveACourse(string CID)
{
Course obj=new Course();
obj.CID=CID;
obj.Retrieve();
if (obj.IsPersistent)
{
return obj;
}
else
{
return null;
}
}
/// <summary>获取所有实体(EntityContainer)</summary>
public static EntityContainer RetrieveCourse()
{
RetrieveCriteria rc=new RetrieveCriteria(typeof(Course));
return rc.AsEntityContainer();
}
/// <summary>获取所有实体(EntityContainer)</summary>
public static DataTable GetCourse()
{
RetrieveCriteria rc=new RetrieveCriteria(typeof(Course));
return rc.AsDataTable();
}
}
}
6、这里还需要注意的是在RootBata生成映射文件的时候,名字空间的匹配与一致问题,因为这里会生成一些DLL文件以及名称空间,而在后需要调用和引用的。如图所示:
7、在配置好上述文件后我们就可以在一个解决方案下新建自己的项目,并且在项目中可以引用我们已经生成好的DLL文件(这里面封装了,具体是什么内容还不清楚,还得等我分析一下里面的具体内容),以及相应的命名空间。在我的SPLTest测试Web测试窗体中我所引用的名称空间如图:
using PersistenceLayer、using Lentro.Web.FrameWork.BusinessEntity的引用都是在RootBata生成的,这里我们是需要对其引用的,还有不部分名称空间引用的原因是在本次测试的过程中调用了Lentro公司(本人所在的)写的基类。
8、引用。必须注意的哦,虽然这是编程中的很小的一部分,但是我们时刻需要注意引用中是否在程序的每个命名空间都已经添加,以防止以后带来不必要的麻烦。在我写Demo的时候,所有引用过的名称空间如图所示:
AspNetPager是应用了分页控件,Lentro.BusinessEntity、PersistenceLayer是引用了RootBata所生成的名称空间,MagicAjax、Lentro.Web.FrameWork、log4net等都是引用了公司内部的名称空间,里面具体有什么内容还不是很清楚。