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

简介: 分享一个生成分页用SQL的函数库     一般一提到分页,大家就会想到存储过程,而大多数情况都是在存储过程里面拼接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等。而且还可以扩充。见下面的类图:

 

 

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

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
///   <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两个文件夹。

 

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

 

 


 

相关文章
|
1月前
|
SQL 数据采集 自然语言处理
NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比
NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比
|
3月前
|
SQL Java 数据库
建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
|
5天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
3月前
|
SQL 关系型数据库 MySQL
SQL中如何实现分页?
【8月更文挑战第3天】SQL中如何实现分页?
104 36
|
5月前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
67 2
|
5月前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之odps sql 底层计算框架是MR吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
SQL 缓存 Java
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
|
6月前
|
SQL 自然语言处理 关系型数据库
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]
|
6月前
|
SQL 安全 前端开发
Go语言Gin框架安全加固:全面解析SQL注入、XSS与CSRF的解决方案
Go语言Gin框架安全加固:全面解析SQL注入、XSS与CSRF的解决方案
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
下一篇
无影云桌面