【自然框架】QuickPagerSQL——专门生成分页用的SQL的类库

   分享一个生成分页用SQL的函数库

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

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

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

  他的目的很明确,就是根据已知条件,依据分页算法,来拼接需要的SQL。

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

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

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

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

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

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

  主要就是这样了。

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

  目前提供了多种分页算法,Max、颠倒Top、表变量、Row_Number等。而且还可以扩充。见下面的类图:

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

代码 
/// <summary>
    /// 生成分页用的SQL的演示
    /// </summary>
    public partial class PagerSQLPage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        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

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

  QuickPagerSQL的位置:

  _UDRM 项目里的 SQL_Pager 文件夹,这里的代码都是。

  QuickPager分页控件的位置:

  _WebControls项目里的 Pager、Pager_UI两个文件夹。

  目前正在考虑如何拆分这个大的解决方案。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

JDBC【事务、元数据、改造JDBC工具类】

1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账...

36480
来自专栏数据和云

【千里之行始于足下】谈Oracle的system表空间

编辑手记:SYSTEM表空间是Oracle数据库最重要的表空间,在创建数据库时被最先创建,其中包含了数据库的元数据,对于数据库来说生死攸关。对于很多初学者,全面...

36550
来自专栏hh

mysql-innodb关键特性

1.插入缓冲(insert buffer):数据页一样,是物理页的一个组成部分,其数据结构是一棵B+树,存放在ibdata1(共享表空间)中。

43560
来自专栏Java帮帮-微信公众号-技术文章全总结

第三十天-加强2-多表查询&JDBC&连接池&DBUtils&综合案例【悟空教程】

第三十天-加强2-多表查询&JDBC&连接池&DBUtils&综合案例【悟空教程】

18340
来自专栏Python小屋

Python把docx文档中的题库导入SQLite数据库

#本文所用的docx文档题库包含很多段,每段一个题目,格式为: 问题。(答案) #与之对应的数据库datase.db中tiku表包含kechengming...

31770
来自专栏Web 开发

在SAE上开发遇到的问题~

添加一个escape_data()的函数,该函数已经会自动识别各种PHP配置环境~

12800
来自专栏数据库

使用VBA创建Access数据表

导读: 本期介绍如何在Access数据库中创建一张空数据表。下期将介绍如何将工作表中的数据存入数据库对应的表中,随后还将介绍如何从数据库的表中取出数据输出到Ex...

31170
来自专栏chenssy

【死磕Sharding-jdbc】---路由&执行

继续以 sharding-jdbc-example-jdbc模块中的 com.dangdang.ddframe.rdb.sharding.example.jdb...

12030
来自专栏hotqin888的专栏

golang beego orm无限条件查询,多条件查询,不定条件查询,动态多条件查询sql语句,一个字段匹配多值

其实我的需求就是:一个树状目录,每个目录下都存有成果,给定某一个上级目录id,分页查询出这个目录下以及子孙目录下的所有成果,要求分页。

1.2K20
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十七天 数据库基础&JDBC使用&工具类Properties&连接池&DBUtils【悟空教程】

第二十七天 数据库基础&JDBC使用&工具类Properties&连接池&DBUtils【悟空教程】

16320

扫码关注云+社区

领取腾讯云代金券