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

时间:2021-05-18

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

usingSystem;
usingSystem.Collections.Specialized;
namespaceweb
{
///<summary>
///MultiOrderPagerSQL的摘要说明
///</summary>
publicclassMultiOrderPagerSQL
{
privateNameValueCollectionorders=newNameValueCollection();
privatestringtable_;
privatestringwhere_="";//1=1and2=2的格式
privatestringoutfields_;
privateintnowPageIndex_=0;
privateintpagesize_=0;
privatestringsql_;//要返回的SQL
publicMultiOrderPagerSQL()
{
}
/****************方法*******************/
publicvoidaddOrderField(stringfield,stringdirection)
{
orders.Add(field,direction);
}
publicstringgetSQL()
{
//排序字段
stringorderList="";//用户期望的排序
stringorderList2="";//对用户期望的排序的反排序
stringorderList3="";//用户期望的排序,去掉了前缀.复合查询里的外层的排序不能是类似这样的table1.id,要去掉table1.。
if(orders.Count>0)
{
string[]str=orders.AllKeys;
foreach(stringsinstr)
{
stringdirection="asc";//默认一个方向
if(orders[s].ToString()=="asc")
direction="desc";
//去掉前缀的字段名称
strings2="";
intindex=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);
}
//returnorderList2;
//形成SQL
stringstrTemp;
strTemp="select*from\n(selecttop{7}*from(selecttop{6}{0}from{1}\n";
if(where_!="")
strTemp=strTemp+"where{2}\n";
if(orderList!="")
strTemp=strTemp+"orderby{3})astmporderby{4}\n)\nastmp2\norderby{5}\n";
strTemp=string.Format(strTemp,outfields_,table_,where_,orderList,orderList2,orderList3,nowPageIndex_*pagesize_,pagesize_);
returnstrTemp;
}
/****************属性*******************/
publicstringtable
{
set{table_=value;}
}
publicstringwhere
{
set{where_=value;}
}
publicstringoutfields
{
set{outfields_=value;}
}
publicintnowPageIndex
{
set{nowPageIndex_=value;}
}
publicintpagesize
{
set{pagesize_=value;}
}
}
}

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

复制代码 代码如下:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
publicpartialclassMultiOrderPagerSQLTest:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
web.MultiOrderPagerSQLsql=newweb.MultiOrderPagerSQL();
//sql.addOrderField("t1.id","desc");//第一排序字段
sql.addOrderField("t1.hits","desc");//第二排序字段
sql.table="joket1,typet2";
sql.outfields="t1.*,t2.type";
sql.nowPageIndex=5;
sql.pagesize=10;
sql.where="t1.typeid=t2.typeid";
Response.Write(sql.getSQL());
}
}

以上在AC和MSSQL2000(5)上测试通过。

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章