• 【自然框架】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两个文件夹。

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


     

  • 相关阅读:
    [JZOJ4648] 【NOIP2016提高A组模拟7.17】锦标赛
    [JZOJ4684] 【GDOI2017模拟8.11】卡牌游戏
    [JZOJ4649] 【NOIP2016提高A组模拟7.17】项链
    [JZOJ4682] 【GDOI2017模拟8.11】生物学家
    [JZOJ4639] 【NOIP2016提高组A组7.16】Angel Beats!
    收藏一个bit模板使用实例
    51 Nod 1627瞬间移动(插板法!)
    收藏一个有效的求组合数的模板
    51 Nod 1486 大大走格子
    51nod 1120 机器人走方格V3
  • 原文地址:https://www.cnblogs.com/jyk/p/1944627.html
Copyright © 2020-2023  润新知