手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >生成多字段排序分页的SQL的通用类
生成多字段排序分页的SQL的通用类
摘要:如果的单一字段排序分页,现在有很多的存储过程和SQL语句,分页的时候,只取pageSize的记录,可遇见的问题是:这个单一字段必须是唯一的这...

如果的单一字段排序分页,现在有很多的存储过程和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*fromn(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)nastmp2norderby{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)上测试通过。

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

【生成多字段排序分页的SQL的通用类】相关文章:

ASP.NET 2.0 中收集的小功能点(转)

Microsoft SQL Server 2005 Express 远程访问设置详述,100%成功篇

用ASP.NET做的个性化的邮件发送系统

asp.net(C#) 生成随机验证码的代码

asp.net转出json格式客户端显示时间

asp.net页面与页面之间传参数值方法

ASP.NET技巧:做个DataList可分页的数据源

asp.net Hashtable 遍历写法

asp.net 文章内容分页显示的代码

asp.net实例代码protected override void Render(HtmlTextWriter writer)

精品推荐
分类导航