作业帮 > ASP.NET > 教育资讯

asp.net技巧:用DataReader高效率分页

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 03:02:56 ASP.NET
asp.net技巧:用DataReader高效率分页
asp.net技巧:用DataReader高效率分页ASP.NET
【51Test.NET-asp技巧:用DataReader高效率分页】:

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

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

1.用DataReader分页

    ///

        /// PageList for DataReader
        ///


        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        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()分页

    ///

        /// 分页获取数据(Sql Server 2005) for ROW_NUMBER()
        ///


        /// 数据库链接
        /// 获取数据集的Sql
        /// 排序字段,可以多个
        /// 每页显示多少条
        /// 当前页码
        /// 总页数
        /// 总记录数
        ///DbParameter
        /// DataTable
        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];
        }

ASP.NET