asp.net中用DataReader高效率分頁(yè)
更新時(shí)間:2011年09月09日 17:43:52 作者:
自從用Sql2005版本以后一直用ROW_NUMBER()分頁(yè),最近一個(gè)項(xiàng)目維護(hù)sqlserver是2000,沒(méi)辦法重寫(xiě)了分頁(yè)。寫(xiě)完測(cè)試分析比ROW_NUMBER()明顯快啊
分享一下兩種方式的分頁(yè)代碼
1.用DataReader分頁(yè)
/// <summary>
/// PageList for DataReader
/// </summary>
/// <param name="connectionString"></param>
/// <param name="sql"></param>
/// <param name="pageSize"></param>
/// <param name="curPage"></param>
/// <param name="pageCount"></param>
/// <param name="count"></param>
/// <param name="cmdParms"></param>
/// <returns></returns>
public DataTable PageListReader(string connectionString, string sql, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
{
int first = 0;
int last = 0;
int fieldCount = 0;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = conn.CreateCommand();
PrepareCommand(cmd, conn, null, CommandType.Text, sql, cmdParms);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
DataTable dt = new DataTable();
fieldCount = reader.FieldCount;
for (int i = 0; i < fieldCount; i++)
{
DataColumn col = new DataColumn();
col.ColumnName = reader.GetName(i);
col.DataType = reader.GetFieldType(i);
dt.Columns.Add(col);
}
count = 0;
first = (curPage - 1) * pageSize+1;
last = curPage * pageSize;
while (reader.Read())
{
count++;
if (count >= first && last >= count)
{
DataRow r = dt.NewRow();
for (int i = 0; i < fieldCount; i++)
{
r[i] = reader[i];
}
dt.Rows.Add(r);
}
}
reader.Close();
pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
return dt;
}
}
2.用ROW_NUMBER()分頁(yè)
/// <summary>
/// 分頁(yè)獲取數(shù)據(jù)(Sql Server 2005) for ROW_NUMBER()
/// </summary>
/// <param name="connectionString">數(shù)據(jù)庫(kù)鏈接</param>
/// <param name="sql">獲取數(shù)據(jù)集的Sql</param>
/// <param name="fldSort">排序字段,可以多個(gè)</param>
/// <param name="pageSize">每頁(yè)顯示多少條</param>
/// <param name="curPage">當(dāng)前頁(yè)碼</param>
/// <param name="pageCount">總頁(yè)數(shù)</param>
/// <param name="count">總記錄數(shù)</param>
///<param name="cmdParms">DbParameter</param>
/// <returns>DataTable</returns>
public DataTable PageList(string connectionString, string sql, string fldSort, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
{
StringBuilder strSql = new StringBuilder();
strSql.AppendFormat(@"SELECT count(0) from {0} as MyTableCount;
select * from (
SELECT ROW_NUMBER() OVER(order by {1}) RowNumber,*
from {0} mytable
) mytable2
where RowNumber between {2} and {3}"
, sql, fldSort, Convert.ToString((curPage - 1) * pageSize + 1), Convert.ToString((curPage * pageSize)));
DataSet ds = ExecuteQuery(connectionString, CommandType.Text, strSql.ToString(), cmdParms);
count = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
return ds.Tables[1];
}
1.用DataReader分頁(yè)
復(fù)制代碼 代碼如下:
/// <summary>
/// PageList for DataReader
/// </summary>
/// <param name="connectionString"></param>
/// <param name="sql"></param>
/// <param name="pageSize"></param>
/// <param name="curPage"></param>
/// <param name="pageCount"></param>
/// <param name="count"></param>
/// <param name="cmdParms"></param>
/// <returns></returns>
public DataTable PageListReader(string connectionString, string sql, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
{
int first = 0;
int last = 0;
int fieldCount = 0;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = conn.CreateCommand();
PrepareCommand(cmd, conn, null, CommandType.Text, sql, cmdParms);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
DataTable dt = new DataTable();
fieldCount = reader.FieldCount;
for (int i = 0; i < fieldCount; i++)
{
DataColumn col = new DataColumn();
col.ColumnName = reader.GetName(i);
col.DataType = reader.GetFieldType(i);
dt.Columns.Add(col);
}
count = 0;
first = (curPage - 1) * pageSize+1;
last = curPage * pageSize;
while (reader.Read())
{
count++;
if (count >= first && last >= count)
{
DataRow r = dt.NewRow();
for (int i = 0; i < fieldCount; i++)
{
r[i] = reader[i];
}
dt.Rows.Add(r);
}
}
reader.Close();
pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
return dt;
}
}
2.用ROW_NUMBER()分頁(yè)
復(fù)制代碼 代碼如下:
/// <summary>
/// 分頁(yè)獲取數(shù)據(jù)(Sql Server 2005) for ROW_NUMBER()
/// </summary>
/// <param name="connectionString">數(shù)據(jù)庫(kù)鏈接</param>
/// <param name="sql">獲取數(shù)據(jù)集的Sql</param>
/// <param name="fldSort">排序字段,可以多個(gè)</param>
/// <param name="pageSize">每頁(yè)顯示多少條</param>
/// <param name="curPage">當(dāng)前頁(yè)碼</param>
/// <param name="pageCount">總頁(yè)數(shù)</param>
/// <param name="count">總記錄數(shù)</param>
///<param name="cmdParms">DbParameter</param>
/// <returns>DataTable</returns>
public DataTable PageList(string connectionString, string sql, string fldSort, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms)
{
StringBuilder strSql = new StringBuilder();
strSql.AppendFormat(@"SELECT count(0) from {0} as MyTableCount;
select * from (
SELECT ROW_NUMBER() OVER(order by {1}) RowNumber,*
from {0} mytable
) mytable2
where RowNumber between {2} and {3}"
, sql, fldSort, Convert.ToString((curPage - 1) * pageSize + 1), Convert.ToString((curPage * pageSize)));
DataSet ds = ExecuteQuery(connectionString, CommandType.Text, strSql.ToString(), cmdParms);
count = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize));
return ds.Tables[1];
}
相關(guān)文章
.NET微信公眾號(hào)開(kāi)發(fā)之準(zhǔn)備工作
本文是.NET微信公眾號(hào)開(kāi)發(fā)系列文章的第一篇,主要給大家簡(jiǎn)單介紹下微信公眾號(hào)的一些操作,有需要的小伙伴可以參考下。2015-07-07
asp.net slickupload 使用方法(文件上傳)
asp.net下使用slickupload上傳文件的代碼2009-05-05
asp.net+ajaxfileupload.js 實(shí)現(xiàn)文件異步上傳代碼分享
本文給大家分享一段asp.net基于ajaxfileupload.js實(shí)現(xiàn)文件異步上傳的代碼,本人項(xiàng)目中已經(jīng)在使用的代碼,小伙伴們可以直接移植到自己的項(xiàng)目中去。2014-11-11
詳解.Net Core + Angular2 環(huán)境搭建
這篇文章主要介紹了詳解.Net Core + Angular2 環(huán)境搭建,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12
.NET 中Worker Service的使用入門(mén)
隨著 .NET Core 3.0 的發(fā)布,ASP.NET 團(tuán)隊(duì)引入了一個(gè)新的 Worker Service 項(xiàng)目模板,該模板作為 .NET SDK 的一部分發(fā)布。在本文中,我將向您介紹這個(gè)新模板,以及使用它開(kāi)發(fā)的一些實(shí)際的服務(wù)示例。2021-05-05
Asp.net Core 如何設(shè)置黑白名單(路由限制)
本文主要介紹了Asp.net Core 如何設(shè)置黑白名單(路由限制),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
asp.net 保存、修改沒(méi)有 runat=server控件的控件值的一個(gè)解決方案
asp.net 保存、修改沒(méi)有 runat=server控件的控件值的一個(gè)解決方案,需要的朋友可以參考下。2011-10-10
區(qū)分ASP.NET中g(shù)et方法和post方法
我們都知道,get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器上傳數(shù)據(jù)。本文主要介紹ASP.NET中g(shù)et方法和post方法的區(qū)別,需要的朋友可以參考下2015-10-10
ASP.NET Web API如何將注釋自動(dòng)生成幫助文檔
本篇文章主要介紹了ASP.NET Web API從注釋自動(dòng)生成幫助文檔的方法,功能很是強(qiáng)大,現(xiàn)與大家分享一下,需要的朋友可以參考下2015-07-07

