热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> .Net编程>>正文内容

用DataReader高效率分页

发布时间:2011年04月27日点击数: 佚名

 自从用Sql2005版本以后一直用ROW_NUMBER()分页,最近一个项目维护sqlserver是2000,没办法重写了分页。写完测试分析比ROW_NUMBER()明显快啊

分享一下两种方式的分页代码 

1.用DataReader分页

  1. /// <summary> 
  2.       /// PageList for DataReader 
  3.       /// </summary> 
  4.       /// <param name="connectionString"></param> 
  5.       /// <param name="sql"></param> 
  6.       /// <param name="pageSize"></param> 
  7.       /// <param name="curPage"></param> 
  8.       /// <param name="pageCount"></param> 
  9.       /// <param name="count"></param> 
  10.       /// <param name="cmdParms"></param> 
  11.       /// <returns></returns> 
  12.       public DataTable PageListReader(string connectionString, string sql, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms) 
  13.       { 
  14.           int first = 0; 
  15.           int last = 0; 
  16.           int fieldCount = 0; 
  17.           using (SqlConnection conn = new SqlConnection(connectionString)) 
  18.           { 
  19.               SqlCommand cmd = conn.CreateCommand(); 
  20.               PrepareCommand(cmd, conn, null, CommandType.Text, sql, cmdParms); 
  21.               SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
  22.               DataTable dt = new DataTable(); 
  23.               fieldCount = reader.FieldCount; 
  24.               for (int i = 0; i < fieldCount; i++) 
  25.               { 
  26.                   DataColumn col = new DataColumn(); 
  27.                   col.ColumnName = reader.GetName(i); 
  28.                   col.DataType = reader.GetFieldType(i); 
  29.                   dt.Columns.Add(col); 
  30.               } 
  31.               count = 0; 
  32.               first = (curPage - 1) * pageSize+1; 
  33.               last = curPage * pageSize; 
  34.               while (reader.Read()) 
  35.               { 
  36.                   count++; 
  37.                   if (count >= first && last >= count) 
  38.                   { 
  39.                       DataRow r = dt.NewRow(); 
  40.                       for (int i = 0; i < fieldCount; i++) 
  41.                       { 
  42.                           r[i] = reader[i]; 
  43.                       } 
  44.                       dt.Rows.Add(r); 
  45.                   } 
  46.               } 
  47.               reader.Close(); 
  48.               pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize)); 
  49.               return dt; 
  50.           } 
  51.       } 

2.用ROW_NUMBER()分页

  1. /// <summary> 
  2.       /// 分页获取数据(Sql Server 2005) for ROW_NUMBER() 
  3.       /// </summary> 
  4.       /// <param name="connectionString">数据库链接</param> 
  5.       /// <param name="sql">获取数据集的Sql</param> 
  6.       /// <param name="fldSort">排序字段,可以多个</param> 
  7.       /// <param name="pageSize">每页显示多少条</param> 
  8.       /// <param name="curPage">当前页码</param> 
  9.       /// <param name="pageCount">总页数</param> 
  10.       /// <param name="count">总记录数</param> 
  11.       ///<param name="cmdParms">DbParameter</param> 
  12.       /// <returns>DataTable</returns> 
  13.       public DataTable PageList(string connectionString, string sql, string fldSort, int pageSize, int curPage, out int pageCount, out int count, params DbParameter[] cmdParms) 
  14.       { 
  15.           StringBuilder strSql = new StringBuilder(); 
  16.           strSql.AppendFormat(@"SELECT count(0) from {0} as MyTableCount; 
  17.                                   select * from ( 
  18.                                   SELECT ROW_NUMBER() OVER(order by {1}) RowNumber,*  
  19.                                   from {0} mytable 
  20.                                   ) mytable2 
  21.                                   where RowNumber between {2} and {3}" 
  22.                              , sql, fldSort, Convert.ToString((curPage - 1) * pageSize + 1), Convert.ToString((curPage * pageSize))); 
  23.  
  24.           DataSet ds = ExecuteQuery(connectionString, CommandType.Text, strSql.ToString(), cmdParms); 
  25.           count = Convert.ToInt32(ds.Tables[0].Rows[0][0]); 
  26.           pageCount = Convert.ToInt32(Math.Ceiling((double)count / (double)pageSize)); 
  27.           return ds.Tables[1]; 
  28.       } 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作