mssql access top分頁方法
雙top法相比于not in和max法
但是有利也有弊
雖然sql
using system;
using systemcollections generic;
using systemtext; /// <summary>
/// 構造分頁后的sql語句
/// </summary>
public static class paginghelper
{
/// <summary>
/// 獲取分頁sql語句排序字段需要構成唯一記錄
/// </summary>
/// <param name="_recordcount">記錄總數</param>
/// <param name="_pagesize">每頁記錄數</param>
/// <param name="_pageindex">當前頁數</param>
/// <param name="_safesql">sql查詢語句</param>
/// <param name="_orderfield">排序字段多個則用“ ”隔開</param>
/// <returns>分頁sql語句</returns>
public static string createpagingsql(int _recordcountint _pagesize int _pageindex string _safesql string _orderfield)
{
//重新組合排序字段防止有錯誤
string[] arrstrorders = _orderfieldsplit(new char[] { } stringsplitoptions removeemptyentries);
stringbuilder sboriginalorder = new stringbuilder(); //原排序字段
stringbuilder sbreverseo教程rder = new stringbuilder(); //與原排序字段相反用于分頁
for (int i =; i < arrstrorders length; i++)
{
arrstrorders[i] = arrstrorders[i]trim(); //去除前后空格
if (i !=)
{
sboriginalorderappend(" ");
sbreverseorderappend(" ");
}
sboriginalorderappend(arrstrorders[i]); int index = arrstrorders[i]
indexof(" "); //判斷是否有升降標識
if (index >)
{
//替換升降標識分頁所需
bool flag = arrstrorders[i]indexof(" desc" stringcomparison ordinalignorecase) != ;
sbreverseorderappendformat("{ } { }" arrstrorders[i] remove(index) flag ? "asc" : "desc");
}
else
{
sbreverseorderappendformat("{ } desc" arrstrorders[i]);
}
}//計算總頁數
_pagesize = _pagesize ==? _recordcount : _pagesize;
int pagecount = (_recordcount + _pagesize) / _pagesize; //檢查當前頁數
if (_pageindex <)
{
_pageindex =;
}
else if (_pageindex > pagecount)
{
_pageindex = pagecount;
}stringbuilder sbsql = new stringbuilder();
//第一頁時直接使用top n 而不進行分頁查詢
if (_pageindex ==)
{
sbsqlappendformat(" select top { } * " _pagesize);
sbsqlappendformat(" from ({ }) as t " _safesql);
sbsqlappendformat(" order by { } " sboriginalorder tostring());
}
//最后一頁時減少一個top n
else if (_pageindex == pagecount)
{
sbsqlappend(" select * from ");
sbsqlappend(" ( ");
sbsqlappendformat(" select top { } * " _recordcount _pagesize * (_pageindex ));
sbsqlappendformat(" from ({ }) as t " _safesql);
sbsqlappendformat(" order by { } " sbreverseorder tostring());
sbsqlappend(" ) as t ");
sbsqlappendformat(" order by { } " sboriginalorder tostring());
}
//前半頁數時的分頁
else if (_pageindex < (pagecount /+ pagecount % ))
{
sbsqlappend(" select * from ");
sbsqlappend(" ( ");
sbsqlappendformat(" select top { } * from " _pagesize);
sbsqlappend(" ( ");
sbsqlappendformat(" select top { } * " _pagesize * _pageindex);
sbsqlappendformat(" from ({ }) as t " _safesql);
sbsqlappendformat(" order by { } " sboriginalorder tostring());
sbsqlappend(" ) as t ");
sbsqlappendformat(" order by { } " sbreverseorder tostring());
sbsqlappend(" ) as t ");
sbsqlappendformat(" order by { } " sboriginalorder tostring());
}
//后半頁數時的分頁
else
{
sbsqlappendformat(" select top { } * from " _pagesize);
sbsqlappend(" ( ");
sbsqlappendformat(" select top { } * " ((_recordcount % _pagesize) + _pagesize * (pagecount _pageindex)));
sbsqlappendformat(" from ({ }) as t " _safesql);
sbsqlappendformat(" order by { } " sbreverseorder tostring());
sbsqlappend(" ) as t ");
sbsqlappendformat(" order by { } " sboriginalorder tostring());
}return sbsql
tostring();
}/// <summary>
/// 獲取記錄總數sql語句
/// </summary>
/// <param name="_n">限定記錄數</param>
/// <param name="_safesql">sql查詢語句</param>
/// <returns>記錄總數sql語句</returns>
public static string createtopnsql(int _nstring _safesql)
{
return stringformat(" select top { } * from ({ }) as t " _n _safesql);
}/// <summary>
/// 獲取記錄總數sql語句
/// </summary>
/// <param name="_safesql">sql查詢語句</param>
/// <returns>記錄總數sql語句</returns>
public static string createcountingsql(string _safesql)
{
return stringformat(" select count( ) as recordcount from ({ }) as t " _safesql);
}
}
下一篇 Access保留字&變量名列表