生成多字段排序分页的SQL的通用类

如果的单一字段排序分页,现在有很多的存储过程和SQL语句,分页的时候,只取pageSize的记录,可遇见的问题是:
这个单一字段必须是唯一的
这个字段必须是可以被排序的
不支持多字段排序
针对这一问题,我用C#做了一个类,解决以上的对多字段排序分页和每次都取pageSize条记录的问题 先看看代码: 


代码如下:

using System; 
using System.Collections.Specialized; 
namespace web 

    /// <summary> 
    /// MultiOrderPagerSQL 的摘要说明 
    /// </summary> 
    public class MultiOrderPagerSQL 
    { 
        private NameValueCollection orders = new NameValueCollection(); 
        private string table_; 
        private string where_="";//1=1 and 2=2 的格式 
        private string outfields_; 
        private int nowPageIndex_=0; 
        private int pagesize_=0; 
        private string sql_;//要返回的SQL 
        public MultiOrderPagerSQL() 
        { 
        } 
        /****************方法*******************/ 
        public void addOrderField(string field, string direction) 
        { 
            orders.Add(field, direction); 
        } 
        public string getSQL() 
        { 
            //排序字段 
            string orderList="";//用户期望的排序 
            string orderList2 = "";//对用户期望的排序的反排序 
            string orderList3 = "";//用户期望的排序,去掉了前缀.复合查询里的外层的排序不能是类似这样的table1.id,要去掉table1.。 
            if (orders.Count > 0) 
            { 
                string[] str = orders.AllKeys; 
                foreach (string s in str) 
                { 
                    string direction="asc";//默认一个方向 
                    if (orders[s].ToString() == "asc") 
                        direction = "desc"; 
                    //去掉前缀的字段名称 
                    string s2 = ""; 
                    int index = s.IndexOf(".") + 1; 
                    s2 = s.Substring(index); 
                    orderList =orderList + s +" "+ orders[s] +","; 
                    orderList2 = orderList2 + s2 + " " + direction + ","; 
                    orderList3 = orderList3 + s2 + " " + orders[s] + ","; 
                } 
                //去掉最后的,号 
                orderList = orderList.Substring(0,orderList.Length-1); 
                orderList2 = orderList2.Substring(0, orderList2.Length - 1); 
                orderList3 = orderList3.Substring(0, orderList3.Length - 1); 
            } 
            //return orderList2; 
            //形成SQL  
            string strTemp; 
            strTemp = "select * from \n ( select top {7} * from ( select top {6} {0} from {1} \n"; 
            if (where_ != "") 
                strTemp = strTemp + " where {2} \n"; 
            if(orderList!="") 
                strTemp = strTemp + " order by {3} ) as tmp order by {4} \n ) \n as tmp2 \n order by {5} \n"; 
            strTemp = string.Format(strTemp, outfields_, table_, where_, orderList, orderList2, orderList3, nowPageIndex_ * pagesize_, pagesize_); 
            return strTemp; 
        } 
        /****************属性*******************/ 
        public string table 
        { 
            set { table_ = value; } 
        } 
        public string where 
        { 
            set { where_ = value; } 
        } 
        public string outfields 
        { 
            set { outfields_ = value; } 
        } 
        public int nowPageIndex 
        { 
            set { nowPageIndex_ = value; } 
        } 
        public int pagesize 
        { 
            set { pagesize_ = value; } 
        } 
    } 
}

说一下原理先:其实很简单,由于AC和MS SQL 2000 没有象MS SQL 2005的row_number函数,我们就不能从这里下手了,比如你取第二页,那就是序号从10-20,我们先按照某一排序规则 把 前 20条的数据取出来,然后再按照先前的排序规则的反规则把这个数据反排序,再取前10条,那么这个时候就是要取的数据了,这个时候还没有结束,再把结果按照先前的排序规则排序即可。我觉得效率瓶颈会出现在排序上。看看是怎么来使用的:

代码如下:

using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
public partial class MultiOrderPagerSQLTest : System.Web.UI.Page 

    protected void Page_Load(object sender, EventArgs e) 
    { 
        web.MultiOrderPagerSQL sql = new web.MultiOrderPagerSQL(); 
        //sql.addOrderField("t1.id", "desc");//第一排序字段 
        sql.addOrderField("t1.hits", "desc");//第二排序字段 
        sql.table = "joke t1,type t2"; 
        sql.outfields = "t1.*,t2.type"; 
        sql.nowPageIndex = 5; 
        sql.pagesize = 10; 
        sql.where = "t1.typeid=t2.typeid"; 
        Response.Write(sql.getSQL()); 
    } 
}

以上在AC和MS SQL 2000(5)上测试通过。

暂时做出这样一个类,没有做成存储过程,要做的话,还有一点难度呢 ,呵呵。

(0)

相关推荐

  • Repeater控件分别绑定数组和ArrayList实现思路

    前台代码: 复制代码 代码如下: <asp:Repeater ID="rptarry" runat="server" > <HeaderTemplate><table></HeaderTemplate> <ItemTemplate> <tr><td> <%# GetDataItem()%> </td></tr> </ItemTemplate&

  • 如何取得Repeater控件选择的项目及注意事项

    Repeater控件,每个item前有一个CheckBox,把选择的item列显出来. 这个演法中,可以看到选择之后,该行highlight,此功能可以参考这个链接:http://www.jb51.net/article/33455.htm 下面是Repeater控件Html,有两个地方需要注意的,就是CheckBox与Label,这个Label是随你需要获取的内容而变化喔.如你想获取Nickname,那你需要把绑定的的内容放在Label上. Repeater & CheckBox 复制代码 代

  • mysql 按中文字段排序

    如果这个问题不解决,那么MySQL将无法实际处理中文. 出现这个问题的原因是因为MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象. 解决方法: 对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary". 如果你使用源码编译MySQL,可以编译MySQ

  • JS实现在Repeater控件中创建可隐藏区域的代码

    由于web应用的规模不断增大,数据也越来越多了,有时候,由于在一个页面同时显示的数据太多,从而造成页面的不美观,用户因此也会感到厌倦和操作困难.因此,本文将介绍利用repeater控件的隐藏区域,以达到较好的数据显示效果. 防止数据过多加载有很多方法,比如采用数据分页的方法,又或者采用master/detail的方式,就是先显示每条数据的主要内容,而对于详细数据,用户只需要点detail的链接就可以了.本文将介绍另外一种方式来显示数据,它采用折叠的隐藏方式,当用户需要看每条记录的详细描述时,不需

  • asp.net Repeater控件的说明及详细介绍及使用方法

    Repeater 控件不具备内置的呈现功能,这表示用户必须通过创建模板为 Repeater 控件提供布局.当该页运行时,Repeater 控件依次通过数据源中的记录为每个记录呈现一个项. 他很简单,用起来也不够强大,但是应了那句老话,杀鸡焉用牛刀,不用牛刀那用什么呢?难道我们去把鸡咬死不成?而我们在日常应用中也常常面临这样的选择,假设我们显示教复杂的数据,可以用gridview,一般复杂的用DataList,那么简单的数据呈现呢?我们就用Repeater了,因为他简单,小巧,最主要是灵活. 我们

  • sql多条件多字段排序(图文教程)

    语句: 复制代码 代码如下: select * from [User] order by [Password] desc,Id asc 在一个条件重复的情况下,使用第二个条件排序如下: 注意这里的第  14,15条记录(在Password相同的情况下,根据Id排序) 语句: 复制代码 代码如下: select top(5) * from (select top(5)* from [User] order by Id desc ) x order by [Password] asc 在已经查询出来

  • Repeater控件数据导出Excel(附演示动画)

    本演示中,我们实现这个Repeater控件数据导出Excel的功能. 我们准备一个对象: 复制代码 代码如下: Imports Microsoft.VisualBasic Namespace Insus.NET Public Class Catalog Private _ID As Integer Private _Name As String Public Property ID As Integer Get Return _ID End Get Set(value As Integer) _

  • Repeater控件绑定的三种方式

    方式一 在aspx页面,写好需要循环输出的内容,一般包含用户自定义控件.服务器控件.Html格式的片段.和<%# Eval("Name")%>这种方式来动态显示获取到得数据列表: 复制代码 代码如下: <asp:Repeater ID="rpImage" runat="server">    <ItemTemplate>            <li>            <a href=&

  • SQL 按特定字段值排序

    id, name shandong01 name1 shandong02 name2 shandong03 name3 beijing01 name4 beijing02 name5 beijing03 name6 shanghai01 name7 复制代码 代码如下: select id,name from table order by case when id like 'shanghai%' then 0 when id like 'beijing%' then 1 else 2 end

  • Repeater控件动态变更列(Header,Item和Foot)信息实现思路

    需求开发一个小报表,显示最近五个月的summary的数量统计,报表会随月份的变化而变化,如下图.第一列[Department]固定,第二至第六列,也就是说Nov 2012 这列会在下月的时候消失,其后的列会向前移,最后一列Mar 2013 会变为Apr 2013. 下图中,最底一行是显示每一列的总数(除第一列外). 为了这个报表,Insus.NET决定使用Repeater控件来实现.难度在于动态显法第二列至第六列的列名,以及绑定数据.最后一行计算总计的,只要完成上面的动态绑定之后,也算不上问题,

  • SQL order by ID desc/asc加一个排序的字段解决查询慢问题

    解决方法就是在order by ID desc再加一个排序的字段,这样子可能会把速度提高很多.再加止排序的字段因查询而异了 如表 复制代码 代码如下: CREATE TABLE [dbo].[CMPP_SendCentre] ( [id] [int] IDENTITY (1, 1) NOT NULL , [SendType] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL , [SendDate] [datetime] NOT NULL , [

  • SQL字符型字段按数字型字段排序实现方法

    这是很久之前的就遇到的问题了,去年写了个WP插件:WordPress投票插件Ludou Simple Vote,由于有些使用者需要一个投票排行榜,所以需要用一条SQL来读取按得分排序的文章列表. Ludou Simple Vote的投票得分结果是以自定义栏目的方式存储在WordPress的postmeta中,分值存放在meta_value字段,而meta_value字段类型是longtext,如果直接使用下面的SQL查询语句来排序: 复制代码 代码如下: ORDER BY `meta_value

  • asp.net中使用 Repeater控件拖拽实现排序并同步数据库字段排序

    数据库表中有一个单位表,里面包括ID.Name.Order等字段,现在有个后台管理功能,可以设置这些单位在某些统计表格中的先后显示顺序,于是想到用拖拽方式实现,这样操作起来更简便. 使用了GifCam软件做了一个示例动画,效果如下图所示: 于是就动手起来,发现jquery.ui中提供sortable函数,可用于排序,界面中从数据库绑定的单位使用Repeater控件,下面简单介绍下主要步骤: 1.项目中使用到的jquery-1.7.2.min.js和jquery-ui.min.js请点击进行下载,

  • json数据处理技巧(字段带空格、增加字段、排序等等)

    1.json数据的正常取值:json[i].fieldName 2.json数据的字段带空格:eval('json[' + i + ']["' + field + '"]') 3.json数据的赋值:eval('json[' + i + ']["' + field + '"]=' + jsonFilter.length); 4.json数据增加字段:循环所有数据,直接json[i].newField=defaultValue就可以了 5.json数据的排序:相当于数

随机推荐