抛开映射关系,不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
    
{

        
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,但是思路清晰,不失为一个轻量级的访问数据层,希望有帮助咯!
posted @ 2008-03-16 14:09  Awen  阅读(695)  评论(4编辑  收藏  举报