抛开映射关系,不oo的数据访问写法
日常的开发中,数据访问层是程序员不得不去面对的重复劳动,基本上现在每个公司或个人都有自己的DbHelper,像自己日常用的有微软petshop中的几个dbhelper,或者nhibernate,或者IbatisNet,或者我自己写的数据访问工具-Qing,本来是想写成类似linq的一个工具,大家看qing的代码也可以看出一点意图,但是,不可否认,代码设计方面确实是有点垃圾,呵呵,见笑了!,现在想来,还有一个SubSonic已经很成熟地实现了类似的查询功能了!
最近在改一个项目,以前留下来的,汗,项目虽然不大,但是数据量也有好几万,访问量也不低,然后每次客户都投诉说速度很慢,分页用的竟然是gridview自带的,当然,更夸张的是查询的结果是先搜索出所有的结果的dataTable,然后在内存里面通过Filter过滤,更汗!本来一句select * form table where id=1,现在变成了select * from table 然后再在内存中过滤!
好拉,问题找出来了,改就是了,自定义分页导航可以选择AspNetPage,也可以自己写,不是本随笔的关键,先看看分页所需要的,我们除了要查询分页的数据外,还要知道表的总记录数!一般我们都是有写两个方法,一个返回分页的数据,一个返回总记录数,这样做很明显是要访问两次数据库了,创建数据库连接可是很昂贵的,所以我把他封在一个类里面,达到只创建一个连接,返回总纪录数和分页数据,先看代码
DataManager
这里面用到了范型,其中T继承了ITableSchema,这个接口定义了数据表的结构接口,里面的东西大家看看就知道是怎么回事了,直接点就是一个映射对应表的结构的接口,包括了主键,外键,字段集合等。
public interface ITableSchema
{
string TableName{get;}
string PrimaryKey{get;}
Dictionary<string,string> ForeignKeyList{get;}//<表,外键名称>
List<string> Fields { get;}//字段集合,取需要的字段
}
然后我们写一个继承自这个接口的类,就可以了,就不是我们所写的实体类了,直接面向数据表!
public class TestTable:ITableScheman
{
![](/Images/OutliningIndicators/InBlock.gif)
TableInterface 成员
}
接下来是测试
Northwind.Web.DB.DataManager<Northwind.Web.DB.TestTable> p = new Northwind.Web.DB.DataManager<Northwind.Web.DB.TestTable>();
using (IDataReader dr = p.QueryAndGetPageCount())
{
while (dr.Read())
{
this.DropDownList1.Items.Add(new ListItem(dr[1].ToString()));
}
this.Label1.Text = p.PageCount.ToString();
}
这里我只是绑定到一个列表上去,而且分页的sql语句只是简单的top而已,大家可以替换为自己的sql分页语句,这里只是一个思路而已。
我们可以根据思路继续拓展,包括修改数据的功能!
结论:虽然不oo,但是思路清晰,不失为一个轻量级的访问数据层,希望有帮助咯!
最近在改一个项目,以前留下来的,汗,项目虽然不大,但是数据量也有好几万,访问量也不低,然后每次客户都投诉说速度很慢,分页用的竟然是gridview自带的,当然,更夸张的是查询的结果是先搜索出所有的结果的dataTable,然后在内存里面通过Filter过滤,更汗!本来一句select * form table where id=1,现在变成了select * from table 然后再在内存中过滤!
好拉,问题找出来了,改就是了,自定义分页导航可以选择AspNetPage,也可以自己写,不是本随笔的关键,先看看分页所需要的,我们除了要查询分页的数据外,还要知道表的总记录数!一般我们都是有写两个方法,一个返回分页的数据,一个返回总记录数,这样做很明显是要访问两次数据库了,创建数据库连接可是很昂贵的,所以我把他封在一个类里面,达到只创建一个连接,返回总纪录数和分页数据,先看代码
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
然后我们写一个继承自这个接口的类,就可以了,就不是我们所写的实体类了,直接面向数据表!
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Northwind.Web.DB.DataManager<Northwind.Web.DB.TestTable> p = new Northwind.Web.DB.DataManager<Northwind.Web.DB.TestTable>();
using (IDataReader dr = p.QueryAndGetPageCount())
{
while (dr.Read())
{
this.DropDownList1.Items.Add(new ListItem(dr[1].ToString()));
}
this.Label1.Text = p.PageCount.ToString();
}
这里我只是绑定到一个列表上去,而且分页的sql语句只是简单的top而已,大家可以替换为自己的sql分页语句,这里只是一个思路而已。
我们可以根据思路继续拓展,包括修改数据的功能!
结论:虽然不oo,但是思路清晰,不失为一个轻量级的访问数据层,希望有帮助咯!