马上要毕业了,心里很迷茫,感觉真的时间飞逝,软件真的博大精深,特别.NET平台在Microsoft下变化之迅猛,个人总是赶不上技术的日新月异。哎,希望自己能早日走上设计之路。

闲来无事便根据自己大学四年项目实践经验,想实现一些常用模块的抽象和集成。考虑了一下觉得先该从分页查询入手,便简单的设计了下,现目前版本实现了单表的基本分页查询。我知道已经有很多前辈做了这个,本人设计能力和前辈们比那就欠缺多了,有那里不足的望指出,大家共同进步。

下载代码:WolfPager下载

主要采用工厂模式创建实现了PageSqlBase的对象,然后可以利用对象的GetSql()方法返回查询Sql语句。我的目的是生成sql语句并非直接从数据库取得数据,因为我认为如果这样将会增加耦合度增加,不易于移植通用,也不与分页控件结合,于是为了降低耦合度,我认为分页控件的职责是UI的显示而并非分页算法等的处理,更非数据的读取。

1.VS类图为:分页查询算法实践_Microsoft


2其中PageSqlBase抽象类为:




代码    1 namespace Wolf.Pager   2 {   3     public abstract class PageSqlBase   4 {   5 //查询信息   6         public SearchInfo SearchInfo   7         {   8             get;   9             set;  10         }  11 //Page信息  12         public PageInfo PageInfo  13         {  14             get;  15             set;  16         }  17         public abstract string GetSql();  18     }  19 }  20

3 我在类库实现了多种分页算法,网上到处都有算法的描述,在这里我就不讲解了。只展示一下针对SqlServer低版本(2000)的分页算法选择类,因他的算法用Top并且不同的算法针对不同的主键和排序形式,为了效率的优化故应该选择不同的算法。它采用的适配器的方式实现的。

代码    1 using System;   2 using System.Collections.Generic;   3 using System.Linq;   4 using System.Text;   5    6 namespace Wolf.Pager   7 {   8     public class SQLServerLowerLevelPageSql:PageSqlBase   9     {  10         public override string GetSql()  11         {  12             if (PageInfo == null || SearchInfo == null)  13             {  14                 throw new ArgumentNullException("Page信息和Search信息不能为空!");  15             }  16             return PageSqlChoise().GetSql();  17         }  18   19         protected virtual PageSqlBase PageSqlChoise()  20         {  21             if (SearchInfo.UniqueFieldCollection != null)  22             {  23                 if (SearchInfo.UniqueFieldCollection.Count == 1)  24                 {  25                     if (SearchInfo.OrderExpress != null)  26                     {  27                         if (SearchInfo.OrderExpress.Count == 1 && SearchInfo.OrderExpress[0].Filed.ToLower()  28                             .Equals(SearchInfo.UniqueFieldCollection[0].Name.ToLower()))  29                         {//单键唯一排序字段  30                             return InitPageSql(new TOPMAXPageSql());  31                         }  32                         else// 单键多排序  33                         {  34                             return InitPageSql(new TOPMutilpOrderPageSql());  35                         }  36                     }  37                     else//单键无排序(默认键值排序)  38                     {  39                         return InitPageSql(new TOPMAXPageSql());  40                     }  41                 }  42                 else//联合(多)键  43                 {  44                     return InitPageSql(new TopMutilpKeyPageSql());  45                 }  46             }  47             else if (SearchInfo.OrderExpress != null && SearchInfo.OrderExpress.Count > 0)  48                 //无键(联合建作为排序字段)//设计时把联合建作为了排序字段  49             {  50                 return InitPageSql(new TopMutilpKeyPageSql());  51             }  52             else 53             {  54                 throw new ArgumentNullException("Page信息和Search信息不能为空!");  55             }  56   57         }  58   59         private PageSqlBase InitPageSql(PageSqlBase psb)  60         {  61             psb.SearchInfo = SearchInfo;  62             psb.PageInfo = PageInfo;  63             return psb;  64         }  65     }  66 }  67   68   69


4

我的测试配置Configu为:<?xml version="1.0" encoding="utf-8" ?><configuration> <appSettings> <add key="DataBaseType" value="SQLServerLowerLevel"/> <!--<add key="Assembly" value="ConsoleTest"/> <add key="NameSpace" value="ConsoleTest"/> <add key="Type" value="Program"/>--> </appSettings></configuration>测试结果性能比较高效,具体大家把代码下载看。 本版本只是一个初步的实践摸索版本,离使用还应该差一些,我会有时间在改进,主要应该还要加入:1:多表查询的分页方式。2:GroupBy分组统计方式的分页查询。3:添加是内存数据统计的类库。4:缓存机制的加入(初步打算用OS的页面置换算法LRU(最近最少使用),加入超时减少缓存带来的数据不一致性)。 分页控件的设计暂时没考虑太多,我认为Web控件应该可以支持URl、PoatBack、Ajax三种方式,具体实现可以用简单工厂。Winform的当然就一种方式了。数据库处理应该有程序员了事件代码中挂载。UI和BL层必须与数据层相隔离。 希望能先多开发些常用模块,减少以后的代码量,加快开发速度。我的目标是能开发一个小型管理系统的通用开发和配置平台。

: 工厂类的实现方式代码如下: