您的位置:首页 > 其它

一个基于DataTable的后台框架的实现

2010-12-14 19:57 274 查看
如果谁对这个东西有兴趣,可以给我留言。源码奉上,初来乍到,大家捧捧场。

背景

公司做项目用的是Framework 2.0 ,经常开发的是基于webservice 的后台,使用传统的Sql方式,数据库不容易维护,使用ORM时,Webserive对自定义数据类型的支持个人感觉不是很好,装换效率低下,加上有些项目不是很大,用NHibernate显得有点重量级。于是,自己写了一个基于DataTable的分层框架,封装了事务,典型的增删改查,缓存(包括服务缓存和查询缓存)。

设计思路

该框架主要是基于DataTable进行构建,以DataTable作为标准数据接口来方便WebService的调用。封装了基本的增删改查和数据缓存功能。

使用方法

1 准备工作

1.1 将数据中每个表对应为程序中的实体,实体必须继承抽象类AbstractEntiy,并实现其抽象方法。基本格式如下:

public class FZGL:AbstractEntiy //继承抽象实体

{

#region 字段

public static string TableName = "FZGL";//定义改实体对应的数据库中表名字

//定义一些常量字符串,为从数据库中的字段对应的在系统中的名字

public static string FZID = "FZID";

public static string FZMC = "FZMC";

public static string FZSM = "FZSM";

#endregion

public FZGL(){

//添加映射,第一个字符串是在系统中的列的名字,第二个是在数据库中列的名字

filedMapping.AddWithOutError(FZID, "FZID");

filedMapping.AddWithOutError(FZMC, "FZMC");

filedMapping.AddWithOutError(FZSM, "FZSM");

}

//返回系统主键,暂时不支持多主键

internal override string GetPrimaryKey()

{

return FZID;

}

//返回实体对应的数据表名字

internal override string GetTableName()

{

return TableName;

}

internal override System.Collections.Generic.IList<string> GetUnUpdateColumns()

{

IList<String> unUpdateColumns = new List<string>();

//unUpdateColumns.Add();

return unUpdateColumns;

}

}

注:考虑到反射比较耗时,加上时间仓促,所以采用了自己设定,而不是由程序反射或特性来实现与数据库的映射

1.2 定义数据业务类,继承:EntiyBL

如下:

public class XTFWBL : EntiyBL<XTFW>

{

}

至此,业务对象XTFWBL拥有了增删改查操作

2 使用

以查询“应用最新组件”为例

2.1 查询

[WebMethod]

public DataTable GetNewestCompant(string AppId)

{

//对大数据量对象或这频繁访问的数据对象做业务缓存,格式如下

//业务缓存名格式: 命名空间+类目+方法名+“(”+每个参数值+“)”

string cacheServiceName = "XTFWService.GetNewestCompant(" + AppId + ")";

if (DataCache.ExistServiceCache(cacheServiceName))

{

return DataCache.GetServiceCache(cacheServiceName);

}

//调用Search方法查询对应的数据,条件格式为“条件1&&条件2||条件3”

//找到系统所有的分组

DataTable dtXTYFZLX = blXTYFZLX.Search(XTYFZLX.APP_ID + "=" + AppId);

//找到分组所有的信息

DataTable dtNewestZJ = null;

foreach (DataRow row in dtXTYFZLX.Rows)

{

DataTable dtTempZJ = blZJGL.Search(ZJGL.FZID + "=" + row[XTYFZLX.FZID]);

dtTempZJ.Merge(dtTempZJ, true, MissingSchemaAction.Add);

}

DataCache.SetServiceCache(cacheServiceName, dtNewestZJ);

return dtNewestZJ;

}

注:blXTFW.SearchBySql(sql)//对于特殊的可以采用传递Sql语句,尽量不要用,否则更改数据库字段后难以维护

2.2 更新

XTFWBL blXTFW = new XTFWBL();

blXTFW.SaveOrUpdate(dtNeedUpdateOrSave);// dtNeedUpdateOrSave更改后的数据表,可自动判断是更新还是新增,从效率方向考虑,应该每次只传递更改后的数据行

2.3 删除

XTFWBL blXTFW = new XTFWBL();

blXTFW.Del(idStr);

idStr:要删除的行的行号,分号分割,格式:1;2;8

前台:

1 需要做的工作:

新建对应实体: 格式如下

/// <summary>

/// 系统服务

/// </summary>

public class XTFW

{

//这个字段和后台要对应

#region 字段

public const string TableName = "XTFW";

public const string APP_ID = "APP_ID";

public const string SERVERIP = "SERVERIP";

public const string XT_ID = "XT_ID";

public const string APPTITLE = "APPTITLE";

public const string XTMC = "XTMC";

public const string SERVERPORT = "SERVERPORT";

public const string SERVERTYPE = "SERVERTYPE";

public const string SERVERURL = "SERVERURL";

public const string SERVERWSDLURL = "SERVERWSDLURL";

#endregion

}

本来准备支持多对多,一对多等关系,现在也没有时间,加上发现微软后期的产品加入了对ORM的支持,所以觉得适用范围会越来越窄,就不打算在做了,如果谁对这个东西有兴趣,可以联系我。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: