分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项

 

      上一次有点匆忙,如何使用介绍的不是太清楚,而且这两天有改掉了几个bug,所以这次呢详细说一下,然后更新一下代码和demo。

      源代码和demo的下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html

 

      

            JYK.Controls.Pager.QuickPagerSQL PagerSQL = new QuickPagerSQL();

            //设置保存属性的位置。可以不保存,也可以保存在隐藏域、Cookie、Session等地方。默认保存在隐藏域里面
            //这里设置为不保存
            PagerSQL.SaveLocation = JYK.Common.SaveViewStateLocation.NoSave;

            //设置密钥。不保存忽略该属性。八位的数字。空字符串表示不加密,null表示使用默认密钥
            //这里不需要设置,也就是不加密
            //PagerSQL.SaveKey = "12121212";
            
            //设置属性
            PagerSQL.TableName = "News_NewsInfo";          //表名或者视图名称
            PagerSQL.TableShowColumns = "*";               //需要显示的字段
            PagerSQL.TableIDColumn = "NewsID";             //主键名称,不支持复合主键
            PagerSQL.TableOrderByColumns = "NewsID";       //排序字段,根据分页算法而定,可以支持多个排序字段
            PagerSQL.TableQuery = "";                      //查询条件

            PagerSQL.PageSize = 4;                         //一页显示的记录数

           
            //选择分页算法
            PagerSQL.SetPagerSQLKind = PagerSQLKind.MaxMin;

            //拼接分页算法
            PagerSQL.CreateSQL();

            //获取统计记录数的SQL语句,比如 select count(1) from Table
            string sql = PagerSQL.GetRecordCountSQL;

            //设置总记录数,您可以使用PagerSQL.GetRecordCountSQL返回的SQL语句到数据库里面查询
            //这里就简化操作,直接设置一个数值了。
            PagerSQL.PageCount = 100;
            //计算总页数,防止传入的页号不在有效地范围内,而产生无效的SQL语句。
            PagerSQL.ComputePageCount();

            //获取SQL语句。如果想得到第三页的SQL,那么传递“3”就可以了。
            //如果传入的页号大于总页数,那么会返回最后一页的SQL语句。
            //如果页号小于1,会返回第一页的SQL语句。
            sql = PagerSQL.GetSQLByPageIndex(3) ; 

 

 

FAQ:

1、为什么要有一个保存位置的设置?
    由于Pager_SQL是从QuickPager分页控件里面分离出来的,所以他的目的要能够适应web控件的特点。如果您自己编写过自定义控件的话,那么您可能会遇到这样的问题:明明我在Page_Load里面给控件的属性赋值了,但是在回发(提交表单)的时候却提示我没有给属性赋值(属性值为空)。这是为什么呢?原因就在于在回发的时候Page_Load被延后执行了。

    那么要如何解决这个问题呢?一是在Oninit里面赋值,一是在控件内部把属性值保存在Viewstate里面。而我这采用了后者。Viewstate里面的东东谁然看起来乱七八糟的,但是很容易就可以把它变成能够看懂的信息,那么如果把表名、字段名这些敏感的信息放在Viewstate里面显然是不安全的,所以我就自己写了一个类库,可以把信息保存在隐藏域(当然也可以是Cookie、Session等)里面,然后还可以设置密钥,这样没有密钥的话是不能破解的,除非暴力破解或者瞎蒙。

    当然了现在Pager_SQL已经独立出来了,有的时候是不需要保存的,或者您觉得保存在客户端了即使加密也是不安全的,那么您可以选择不保存。

    为了能够满足不同的需要,所以设置了这两个属性,一个是选择保存信息的位置(当然可以不保存),另一个就是加密用的密钥。

 

2、保存了什么信息,又保存在了哪里?
    保存的信息就是各个属性的值,保存的位置您可以自由选择,可以选择不保存,可以选择保存在隐藏域(web控件的时候需要),也可以保存在Cookie、Session、Cache等地方。

 

3、排序字段(TableOrderByColumns)如何设置?

    Max分页算法只支持一个排序字段,例如: “ID”、“ID desc”
目前其他的分页算法支持多个排序字段,例如:“col1,col2 desc”、“col1,col2,col3” 、“col1 desc ,col2,col3 desc”等。

4、查询条件(TableQuery)如何设置?

    不需要查询条件的话可以设置为空字符串,或者不用赋值。
    查询条件就是where后面的SQL语句,例如“title like ‘%分页控件%’”、 “title like ‘%分页控件%’ and kind = 2”等。
    也可以是参数化的形式,比如:“kind = @kind”。注意,这里并不会处理储存过程的参数!
    也可以是混合形式,比如:“title like ‘%’ + @title + ‘%’ and kind = 3 ”

 

5、给属性赋值有没有先后顺序?

    要先设置排序字段,然后在选择分页算法。各个属性都设置完毕后才能调用CreateSQL(),最后才能调用GetSQLByPageIndex(3)获得SQL语句。

 

6、多表关联

    对于多表关联,我是习惯使用视图来解决的,就是数据库里面的视图。关系型数据库嘛,不可避免的就是多表关联,既然数据库已经为我们提供了视图,那么我们为什么不用呢?

    有人回帖说:三五个人一起写视图,很容易乱。这个是理由吗?三五个人一起写代码,不也是可能会乱吗?那我们就不写代码了吗?我们想出来了三层,用分层的方式来解决“乱”的问题。解决了不就可以了吗?为什么要否定呢?

    我好像说了一大堆的废话,那么怎么来管理视图呢?
    第一:一个视图只用在一个列表页面里,这样就避免了一个视图被多个页面调用,然后有的页面需求变化了就去改视图,然后导致了其他页面的错误。

    第二:规范命名。我个人的给视图命名的规则是这样的,

 

V_项目标志_功能标志_大模块、小模块的标志_表名、功能_[写视图的人的简称]

 

V :表示这是一个视图,和表名、储存过程的名称相区别。
项目标志:区分不同的项目的。
功能标志:List——列表用、Detail——详细页面、Search——综合查询等。
大模块、小模块的标志:比如人员管理等。
表名、功能:比如显示某些表的数据,查询某些表的数据等。

 

比如:V_ICBC_List_Emp_EmployeeShowData_jyk

看起来有点长,似乎不好记忆。写这么长的视图名当然不是给人记忆的,而是要便于管理的。使用的时候可以复制粘贴呀,也不用一个字母一个字母的敲上去。

当然这是我的做法,仅供参考。

 

 

时间: 2024-10-26 05:07:02

分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项的相关文章

分页解决方案之分页算法——Pager_SQL的详细使用方法和注意事项

上一次有点匆忙,如何使用介绍的不是太清楚,而且这两天有改掉了几个bug,所以这次呢详细说一下,然后更新一下代码和demo. 源代码和demo的下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html JYK.Controls.Pager.QuickPagerSQL PagerSQL = new QuickPagerSQL(); //设置保存属性的位置.可以不保存,也可以保存在隐藏域.Cookie.Session等地方.默认保存在隐

分页解决方案 之 分页算法——Pager_SQL的思路和使用方法

      分页算法(也就是分页读取数据的时候使用的select 语句)面临两大难题:一个是不同的数据库使用的分页算法是不一样的(比如SQL Server 2000可以使用Max.表变量.颠倒Top,SQL Server 2005可以使用Row_Number,MySql可以使用limit ,Orcale可以使用ROWNUM等):另一个是,不同的分页需求,可以采用的分页算法也是不一样的(比如单字段排序和多字段排序).那么我们应该如何来选择呢?       好多人都想找到一种即通用,效率又高的分页算

分页解决方案之分页算法——Pager_SQL的思路和使用方法

分页算法(也就是分页读取数据的时候使用的select 语句)面临两大难题:一个是不同的数据库使用的分页算法是不一样的(比如SQL Server 2000可以使用Max.表变量.颠倒Top,SQL Server 2005可以使用Row_Number,MySql可以使用limit ,Orcale可以使用ROWNUM等):另一个是,不同的分页需求,可以采用的分页算法也是不一样的(比如单字段排序和多字段排序).那么我们应该如何来选择呢? 好多人都想找到一种即通用,效率又高的分页算法,那么能不能找到呢?我

分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库

      这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据.显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加.修改.删除数据后如何更新,如何查询数据等等.一整套完整的解决方案.       这个方案要有几个特点:       1.支持多种数据库,可以提供多个分页算法以便于支持多种数据库.       2.可以在不同的要求下选用最优的分页算法.比如如果只需要按照主键排序,那么选择Max分页算法无疑是最快的一种分页算法.

分页解决方案之GridView+QuickPager+QuickPager_SQL+DataAccessLibrary+数据

分页解决方案之GridView+QuickPager+QuickPager_SQL+DataAccessLibrary+数据库 这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据.显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加.修改.删除数据后如何更新,如何查询数据等等.一整套完整的解决方案. 这个方案要有几个特点: 1.支持多种数据库,可以提供多个分页算法以便于支持多种数据库. 2.可以在不同的要求下选用最优的分页算法

miniui datagrid的客户端分页解决方案

官方的解决方案 官方在"在线示例"中给了一个简单的 client pagination 解决方案,代码就不贴了,这里说说它的基本思想和处理过程. 首先,是绑定一个 preload 事件,在这个事情中设置 event.cancel = true,阻止 datagrid 在翻页的时候向服务器请求加载数据. 那么数据从哪来呢?当然只有在外部写一个 ajax 过程获取了.不过取得的数据并不直接交给 datagrid,而是缓存起来,放在dataResult 中. 现在继续说 preload,除了

GridView分页与详细使用方法

gridview分页与详细使用方法 1.       把gridview控件拖放到界面上 2.       用代码设置数据源绑定gridview控件 oledbcommand command = new oledbcommand();          string sql = "select * from admin";    //绑定到数据表admin         command.commandtext = sql;         command.connection = s

分页解决方案 之 数据访问函数库——另类的思路、另类的写法,造就了不一样的发展道路。

      上一篇:分页解决方案 -- GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库         如何访问数据库?一个老掉牙的问题,方法多了去了,什么直接使用ado.net.使用SQLHelp.使用微软的企业库.使用ORM.使用LinQ to SQL等等,还可以使用自己封装的函数库,这里我就想说一下我的数据访问函数库的使用方法.       您可能会说了,这么简单的东东还用说吗,重复制作轮子有意义吗?这个嘛,

分页解决方案 之 QuickPager的使用方法(目录)

        QuickPager asp.net 2.0 分页控件,基本告一段落.现在把使用方法.源码.Demo公布一下,感兴趣的可以下载看看.       一.从提取数据的角度开看,可以分为"自动"和"自定义"两种.       "自动"就是分页控件内部利用Pager_SQL和DataAccessLibrary,"自动"获取数据,然后绑定到显示数据的控件.而且可以自动处理分页产生的事件.就是说用了"自动&quo