如果的单一字段排序分页,现在有很多的存储过程和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)上测试通过。
暂时做出这样一个类,没有做成存储过程,要做的话,还有一点难度呢 ,呵呵。
这个单一字段必须是唯一的
这个字段必须是可以被排序的
不支持多字段排序
针对这一问题,我用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)上测试通过。
暂时做出这样一个类,没有做成存储过程,要做的话,还有一点难度呢 ,呵呵。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
更新日志
2024年11月29日
2024年11月29日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]