分享一个专门生成分页用的SQL的类库——QuickPagerSQL

自然框架 2011-01-27 02:43:28

  一般一提到分页,大家就会想到存储过程,而大多数情况都是在存储过程里面拼接SQL,我觉得与其在存储过程里面拼接,还不如写个程序来拼接。这样更便于维护,而且效率也不差多少。

  所以我就写了这个类库—— QuickPagerSQL

  一开始这个功能是在QuickPager分页控件内部的,但是放在一起的话,违反了单一职责。所以把它独立了出来。现在QuickPagerSQL是一个独立的类库,可以单独调用。

  1、目的:根据已知条件,依据分页算法,拼接需要的SQL。

  2、属性:表名/视图名、要显示的字段名、排序字段及方式、主键字段名、查询条件、一页的记录数、总记录数、分页算法。

  3、分页算法:Max、颠倒Top、表变量、Row_Number等。而且还可以扩充。


  4、生成的SQL。

  依据选择的分页算法生成相应的SQL。而这个SQL有两类,一类是获取总记录数;一类是读取指定页号的SQL。

  为了提高效率,读取记录的SQL又分为了三个,读取首页的记录、读取最后一页的记录、读取指定页号的记录。

  其实只需要一个“读取指定页号的记录”的SQL就可以了,那么为什么还要一个读取首页的SQL呢?这个是为了提高效率。

  因为一些数情况下,读取第一页可以用 select top PageSize * 的方式来获取。这个既简单,效率也是很高的(相同条件下)。而首页还负责一个任务,那就是统计总记录数,而这个是比较占用时间的,那么在显示首页的时候,尽量优化一下是很必要的。所以就单独设置了一个读取首页记录的SQL。

  那么读取最后一页记录的SQL又是什么目的呢?这个主要是为了修改颠倒top的一个bug。用过颠倒top的都会发现有一个郁闷的地方,那就是在显示最后一页的时候,如果记录数不够pageSize的时候,也会显示pagesize条记录。这是在颠倒的时候出现的问题,本身没有什么解决的方法(目前我还没有找到,不知道哪位高人能够解决)。于是我就单独做了一个读取最后一页记录的SQL。用这个SQL来修正颠倒top的这个bug。

  这个并不是代码生成器,而是要在运行时动态生成SQL的。


  5、使用方法:这个就很简单了,设置属性,调用函数就可以了。

 
  /// <summary>
/// 生成分页用的SQL的演示
/// </summary>
public partial class PagerSQLPage : System.Web.UI.Page
{
protected void btn_Create_Click(object sender, EventArgs e)
{
//生成分页用SQL
string tableName = this.txt_TableName.TextTrimNone ;
string orderByColumns = this.txt_OrderByColumns.TextTrimNone ;
string PKColumn = this.txt_PKColumn.TextTrimNone ;
string tableQuery = this.txt_Query.TextTrimNone ;
string showColumns = this.txt_ShowColumns.TextTrimNone ;
string pageIndex = this.txt_Index.TextTrimNone;
string pageCount = this.txt_PageCount.TextTrimNone;

if (!Functions.IsInt(pageIndex))
{
Functions.PageRegisterAlert(Page, "页号必须是整数!");
return;
}

QuickPagerSQL sql = new QuickPagerSQL();
sql.TableName = tableName; //表名或者视图名
sql.TableShowColumns = showColumns; //要显示的字段
sql.TablePKColumn = PKColumn; //主键
sql.TableOrderByColumns = orderByColumns; //排序字段
sql.TableQuery = tableQuery; //查询条件

sql.PageCount = int.Parse(pageCount); //一页的记录数

//选择一种分页算法
sql.SetPagerSQLKind = (PagerSQLKind)Int32.Parse(this.lst_Kind.SelectedValue) ;

//拼接SQL;
sql.CreateSQL();

//统计总记录数的SQL
this.txt_SQL1.Text = sql.GetRecordCountSQL;

//实际中需要用上面的SQL到数据库里统计,这里“虚构”一个总记录数。
sql.RecordCount = 200;

//获取指定页数据的SQL
this.txt_SQL2.Text = sql.GetSQLByPageIndex(int.Parse(pageIndex));
}
}




  直通车:http://demo.naturefw.com/Nonline/QuickPager/PagerSQL/PagerSQLPage.aspx
  在线演示:http://demo.naturefw.com/Nonline/QuickPager/default.aspx
  下载:http://www.naturefw.com/down/List1.aspx




===============================================================================


  目前分页控件还没有分离出来,还都在自然框架源码的大解决方案里。

  目前正在考虑如何拆分这个大的解决方案。估计明天就差不多了。拆分之后会有两个项目,一个是QuickPager分页控件,另一个就是QuickPagerSQL。还会有两个DLL。这样如果你只对分页控件感兴趣的话,那就比较清晰了。



...全文
486 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
自然框架 2011-02-09
  • 打赏
  • 举报
回复
谢谢大家,春节快乐!
子夜__ 2011-02-07
  • 打赏
  • 举报
回复
呵呵  大过年的 吃饺子了。
等等 2011-02-07
  • 打赏
  • 举报
回复
先分享之。。。分页暂时搞定,但是估计效率不高。。以后再看
自然框架 2011-02-02
  • 打赏
  • 举报
回复
那么请问,如果变化了,要修改代码怎么办?用代码生成器重新生成一遍代码吗?
如果在上线运行后,发现现在用的分页算法有问题,换成另一种算法可以提高效率,那么怎么办呢?
重新生成一遍代码,重新编译吗?
这个时候就存在风险了。



这个就是代码生成器最大的弱点。

无法限制对生成的代码不进行修改。

如果用这个类库的话,那么只需要修改一个属性就可以了,这个属性可以放在web.config里面,也可以放在基类里面。这样就可以不改代码,或者只修改一个地方的属性就可以实现了,风险基本为0 。
qjy5277 2011-02-02
  • 打赏
  • 举报
回复
= =用codesmith 写个模版生成多表分页非常简单
自然框架 2011-01-30
  • 打赏
  • 举报
回复
拆分源码,弄了两三天,然后又拆分demo,在做测试,又弄了一天。

看来以前的代码还是比较混乱的。
  • 打赏
  • 举报
回复
楼主,我也来支持一下啦!
自然框架 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 imfor 的回复:]
没看到主要代码在哪。。。

再也不在csdn发源码了,浪费感情。。
[/Quote]
发了个类图先,代码还在整理。
代码比较多,不好都发出来。

不过是提供下载的。

imfor 2011-01-28
  • 打赏
  • 举报
回复
没看到主要代码在哪。。。

再也不在csdn发源码了,浪费感情。。
bluedoctor 2011-01-28
  • 打赏
  • 举报
回复
楼主的这个分页类不错,我的“PDF.NET数据开发框架”(百度一下)中的SQLPage类也提供了类似的功能,根据输入的原始SQL语句自动生成当前页的SQL语句。
majic2008 2011-01-28
  • 打赏
  • 举报
回复
sdcpzzg 2011-01-28
  • 打赏
  • 举报
回复
楼主 加把劲,让大家享享福。。。
ycagri 2011-01-28
  • 打赏
  • 举报
回复
博客园见了,这又见了
liyf_liyunfeng 2011-01-28
  • 打赏
  • 举报
回复
挺好,学习一下。
q107770540 2011-01-28
  • 打赏
  • 举报
回复
感谢lz分享。

一楼我的沙发啊。。又被和谐了
自然框架 2011-01-28
  • 打赏
  • 举报
回复
感谢大家的支持!
自然框架 2011-01-28
  • 打赏
  • 举报
回复
终于把分页控件给分离出来了。准备一下,过一会就可以发出来了。
自然框架 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chinaxthulang 的回复:]
引用 14 楼 jyk 的回复:

引用 12 楼 chinaxthulang 的回复:
引用 10 楼 jyk 的回复:
被你发现了。

真的吗???
嘿嘿。。
我前年(2009年)那次。博客园在北京微软聚会。我也去拉。哈哈。嘻嘻。
我那个时候是想学.NET的,后来一直没有时间。现在才学啊。。。哎。。
那次聚会最后那个时间不足嘛。所以我没有听那个什么兼职。就听你的那个自然框架……
[/Quote]

客气。大家共同提高,这才是王道!

自然框架 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jianshao810 的回复:]
楼主 加把劲,让大家享享福。。。
最好弄好之后 下载 地址也发一个贴
[/Quote]

基本拆分好了,明天测试一下,然后就可以发布了。

ChinaXtHuLang 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jyk 的回复:]

引用 12 楼 chinaxthulang 的回复:
引用 10 楼 jyk 的回复:
被你发现了。

真的吗???
嘿嘿。。
我前年(2009年)那次。博客园在北京微软聚会。我也去拉。哈哈。嘻嘻。
我那个时候是想学.NET的,后来一直没有时间。现在才学啊。。。哎。。
那次聚会最后那个时间不足嘛。所以我没有听那个什么兼职。就听你的那个自然框架了。


遇到熟人了,哈。

……
[/Quote]
嘻嘻。您是高手了。我还是菜鸟啊。
加载更多回复(13)

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧