当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 生成多字段排序分页的SQL的通用类

ASP.NET
Asp.net利用JQuery弹出层加载数据代码
asp.net dataview做无限极分类的又一用法
asp.net ckeditor编辑器的使用方法
告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
asp.net 实现动态显示当前时间(不用javascript不考虑开销)
.net动态显示当前时间(客户端javascript)
asp.net 结合YUI 3.0小示例
asp.net 取消缓存相关问题说明
asp.net 计划任务管理程序实现,多线程任务加载
ASP.NET 跨页面传值方法
asp.net中url地址传送中文参数时的两种解决方案
Asp.net 菜单控件简洁版
asp.net jQuery Ajax用户登录功能的实现
asp.net SharpZipLib的压缩与解压问题
asp.net url重写后页面回传问题
asp.net与Discuz!NT整合集成实例教程
Discuz!NT 3与asp.net 整合的实例教程
测试控制台使用方法
.net 动态标题实现方法
asp.net *.ashx类型的文件使用说明

ASP.NET 中的 生成多字段排序分页的SQL的通用类


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 101 ::
收藏到网摘: n/a

如果的单一字段排序分页,现在有很多的存储过程和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)上测试通过。
暂时做出这样一个类,没有做成存储过程,要做的话,还有一点难度呢 ,呵呵。