用DataReader高效率分页

自从用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];
        }

posted @ 2011-09-08 09:28  jyshi  阅读(3389)  评论(7编辑  收藏  举报
无觅相关文章插件,快速提升流量