自从用Sql2005版本以后一直用ROW_NUMBER()分页,最近一个项目维护sqlserver是2000,没办法重写了分页。写完测试分析比ROW_NUMBER()明显快啊
分享一下两种方式的分页代码
1.用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.用ROW_NUMBER()分页
- /// <summary>
- /// 分页获取数据(Sql Server 2005) for ROW_NUMBER()
- /// </summary>
- /// <param name="connectionString">数据库链接</param>
- /// <param name="sql">获取数据集的Sql</param>
- /// <param name="fldSort">排序字段,可以多个</param>
- /// <param name="pageSize">每页显示多少条</param>
- /// <param name="curPage">当前页码</param>
- /// <param name="pageCount">总页数</param>
- /// <param name="count">总记录数</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];
- }