生成多字段排序分頁的SQL的通用類
這個(gè)單一字段必須是唯一的
這個(gè)字段必須是可以被排序的
不支持多字段排序
針對(duì)這一問題,我用C#做了一個(gè)類,解決以上的對(duì)多字段排序分頁和每次都取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 = "";//對(duì)用戶期望的排序的反排序
string orderList3 = "";//用戶期望的排序,去掉了前綴.復(fù)合查詢里的外層的排序不能是類似這樣的table1.id,要去掉table1.。
if (orders.Count > 0)
{
string[] str = orders.AllKeys;
foreach (string s in str)
{
string direction="asc";//默認(rèn)一個(gè)方向
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] + ",";
}
//去掉最后的,號(hào)
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; }
}
}
}
說一下原理先:其實(shí)很簡單,由于AC和MS SQL 2000 沒有象MS SQL 2005的row_number函數(shù),我們就不能從這里下手了,比如你取第二頁,那就是序號(hào)從10-20,我們先按照某一排序規(guī)則 把 前 20條的數(shù)據(jù)取出來,然后再按照先前的排序規(guī)則的反規(guī)則把這個(gè)數(shù)據(jù)反排序,再取前10條,那么這個(gè)時(shí)候就是要取的數(shù)據(jù)了,這個(gè)時(shí)候還沒有結(jié)束,再把結(jié)果按照先前的排序規(guī)則排序即可。我覺得效率瓶頸會(huì)出現(xiàn)在排序上。看看是怎么來使用的:
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)上測試通過。
暫時(shí)做出這樣一個(gè)類,沒有做成存儲(chǔ)過程,要做的話,還有一點(diǎn)難度呢 ,呵呵。
- mysql 按中文字段排序
- SQL 按特定字段值排序
- asp.net Repeater控件的說明及詳細(xì)介紹及使用方法
- JS實(shí)現(xiàn)在Repeater控件中創(chuàng)建可隱藏區(qū)域的代碼
- SQL order by ID desc/asc加一個(gè)排序的字段解決查詢慢問題
- sql多條件多字段排序(圖文教程)
- Repeater控件數(shù)據(jù)導(dǎo)出Excel(附演示動(dòng)畫)
- Repeater控件分別綁定數(shù)組和ArrayList實(shí)現(xiàn)思路
- 如何取得Repeater控件選擇的項(xiàng)目及注意事項(xiàng)
- Repeater控件動(dòng)態(tài)變更列(Header,Item和Foot)信息實(shí)現(xiàn)思路
- SQL字符型字段按數(shù)字型字段排序?qū)崿F(xiàn)方法
- Repeater控件綁定的三種方式
- json數(shù)據(jù)處理技巧(字段帶空格、增加字段、排序等等)
- asp.net中使用 Repeater控件拖拽實(shí)現(xiàn)排序并同步數(shù)據(jù)庫字段排序
相關(guān)文章
asp.net MVC 在Controller控制器中實(shí)現(xiàn)驗(yàn)證碼輸出功能
這篇文章主要介紹了asp.net MVC 在Controller控制器中實(shí)現(xiàn)驗(yàn)證碼輸出功能,本文給大家介紹非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12DataList中TextBox onfocus調(diào)用后臺(tái)void靜態(tài)方法及獲取相應(yīng)行數(shù)
DataList中我放了一個(gè)TextBox 現(xiàn)在的問題是當(dāng)我光標(biāo)放到TextBox上的時(shí)候。如果讓onfocus調(diào)用后臺(tái)某一個(gè)void靜態(tài)方法并且在靜態(tài)方法里邊獲取光標(biāo)相應(yīng)的DataList的相應(yīng)行數(shù),本文介紹如何實(shí)現(xiàn),感興趣的朋友可以了解下2013-01-01VB.NET生成隨機(jī)串或隨機(jī)數(shù)字的方法總結(jié)
本篇文章主要介紹了VB.NET生成隨機(jī)串或隨機(jī)數(shù)字的方法,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11淺談ASP.NET Core 2.0 帶初始參數(shù)的中間件(譯)
這篇文章主要介紹了淺談ASP.NET Core 2.0 帶初始參數(shù)的中間件(譯),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10asp.net實(shí)現(xiàn)取消頁面表單內(nèi)文本輸入框Enter響應(yīng)的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)取消頁面表單內(nèi)文本輸入框Enter響應(yīng)的方法,結(jié)合實(shí)例形式分析了asp.net文本框Enter響應(yīng)的原理與取消Enter響應(yīng)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11.net任務(wù)調(diào)度框架Hangfire簡介
這篇文章介紹了.net任務(wù)調(diào)度框架Hangfire的簡單使用方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07簡單使用BackgroundWorker創(chuàng)建多個(gè)線程的教程
簡單使用BackgroundWorker創(chuàng)建多個(gè)線程的教程,需要的朋友可以參考一下2013-03-03