Winform开发框架之数据访问层的设计

我在前面几篇介绍过我的Winform开发框架的相关内容,其中主要集中在界面展现以及各层的总体设计上,还没有空来得及深入进行各个重要细节的讲解,今天我们来介绍、讨论下我的Winform开发框架之数据访问层的设计方面的知识,希望对大家有所帮助。

前面介绍过,该Winform开发框架支持多种数据库的访问,只需要对配置进行修改即可切换,如下图所示。

 

其中我们可以看到,里面有几种数据访问层的相关数据,大致知道是通过同一的IDAL数据访问层接口派生出几个对应不同数据库的操作层,由业务逻辑层BLL进行相应的调用,但是具体细节从上图并不能了解到。

其实他们的大致关系如下图所示。 

 

首先BLL层,通过BLLFactory对象,根据配置信息,实例化不同的业务访问对象,转换为数据访问层接口进行调用的,BLLFactory通过反射间接方式,构建出不同数据库对象的数据访问层,而数据访问对象,他们都集成了基类BaseDAL,这个基类封装类了绝大多数的增删改查等基础性操作,并通过高度抽象,只需要继承该基类的子类重载部分函数即可完成较为丰富的操作实现。具体的继承关系如下图所示。

 

由于每个不同数据库都需要拥有一个BaseDAL,那么很多相同的操作代码就会发生冗余,因为大多数数据库的基础操作是一样的,只有一部分比较特别,需要进行个性化处理,因此对以上的数据访问层进行优化设计,得到下面的设计图,如下所示。

 

由于把BaseDAL层的通用操作,进一步提升抽象到AbstractBaseDAL 类里面进行管理,因此,BaseDAL虽然在各种数据库的数据访问层中存在,但是,却只是需要实现很少的代码,如下所示。

 

因为不同的数据库,FindFirst(查找第一条)、FindLast(查找最后一条)、Insert2(插入记录后,返回新增的主键值)、以及分页查询FindToDataTable、FindWithPager等不同。因此数据访问层的BaseDAL子类需要覆盖基类AbstractBaseDAL的这些实现。

通过实现部分个性化数据库操作的函数及强大的基类

AbstractBaseDAL实现,我们可以看到,整个数据访问层基类得到非常强大的操作功能,如下所示。

 

 

为了说明问题,我列举几个上面函数不同的实现给读者,以便说明问题。

1)SqlServer的FindFirst语句如下:

            string sql = string.Format("Select top 1 {0} From {1} Order by {2} ASC", selectedFields, tableName, GetSafeFileName(sortField));

2)Oracle的FindFirst语句如下:

  string sql = string.Format(@"Select * from (Select {0} From {1} Order by {2} ASC)   WHERE ROWNUM <= 1 ORDER BY ROWNUM ASC", selectedFields, tableName, GetSafeFileName(sortField)); 


3)Sqlite的FindFirst语句如下:  

  string sql = string.Format("Select {0} From {1} Order by {2} ASC LIMIT 1", selectedFields, tableName, GetSafeFileName(sortField)); 

为了实现功能强大的数据访问基类,并尽可能减少重复代码,高度提炼基类是很有效的方法。适当的集成关系,使得代码量更少,扩展更加容易,这个就是我的Winform框架的优化思想。

 

主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
专注于Winform开发框架、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  http:
//www.iqidi.com 
    

posted on 2012-01-16 21:26 伍华聪 阅读(2406) 评论(9) 编辑 收藏

评论

#1楼  回复 引用 查看   

求源码。。楼主 能给我一份?609722679@qq.com
2012-01-17 00:10 | walleyekneel      

#2楼  回复 引用 查看   

顶一下,思路很清晰。
2012-01-17 04:56 | 吉日嘎拉(杭州)      

#3楼  回复 引用 查看   

要支持多个数据库, 首先写出来的SQL要支持多数据库,SQL不支持,代码支持也没用。
2012-01-17 08:43 | Do you know, jack?      

#4楼[楼主]  回复 引用 查看   

引用Do you know, jack?:要支持多个数据库, 首先写出来的SQL要支持多数据库,SQL不支持,代码支持也没用。

这个肯定是需要的了,文章最后给出了个不同数据库实现不同的Sql语句例子。
2012-01-17 08:59 | 伍华聪      

#5楼  回复 引用 查看   

在实际应用中,当我们准备把一个项目移交至客户手中使用时,我们需要把库中所有表先前的测试数据清空,以给客户一个干净的数据库,如果涉及的表很多,要一一的清空,不仅花费时间,还容易出错以及漏删,在这儿,可快捷有效的清空指定数据库所有表的数据。仅供参考,欢迎交流不同意见。
http://www.cnblogs.com/huyong/archive/2012/01/17/2323663.html
2012-01-17 08:59 | 海南.胡勇      

#6楼  回复 引用 查看   

学习,可以做到根据不同的数据库连接,直接生成支持不同数据库的SQL,DAL完全不予理会,程序员焦点在业务层即可。这样IDAL似乎就不用了。
2012-01-17 09:32 | 中尉      

#7楼[楼主]  回复 引用 查看   

@中尉
见仁见智,经常使用接口操作,好处还多的。
2012-01-17 10:53 | 伍华聪      

#8楼  回复 引用 查看   

分享一下源码吧
2012-01-17 16:12 | cxlings      

#9楼  回复 引用 查看   

学习 study
2012-01-17 23:23 | never_give_up      

导航

<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

公告

昵称:伍华聪
园龄:6年7个月
荣誉:推荐博客
粉丝:676
关注:23

搜索

 

常用链接

最新随笔

我的标签

随笔档案(202)

文章分类(14)

文章档案(15)

相册

我的好友

我的技术支持站点(http://www.iqidi.com)

积分与排名

  • 积分 - 629355
  • 排名 - 79

最新评论

阅读排行榜

评论排行榜

推荐排行榜