asp.net efficient paging with DataReader

  • 2020-05-12 02:30:10
  • OfStack

Share 1 the following two ways of paging code
Page with DataReader
 
/// <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. Page with ROW_NUMBER()
 
/// <summary> 
///  Paging for data (Sql Server 2005) for ROW_NUMBER() 
/// </summary> 
/// <param name="connectionString"> Database link </param> 
/// <param name="sql"> Get the data set Sql</param> 
/// <param name="fldSort"> Sort field , Can be more </param> 
/// <param name="pageSize"> How many items are displayed per page </param> 
/// <param name="curPage"> The current page number </param> 
/// <param name="pageCount"> Total number of pages </param> 
/// <param name="count"> The total number of records </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]; 
} 

Related articles: