• SqlDataReader读取分页数据,pageCount你是肿么了?


    自己在折腾代码的时候发现,SqlDataReader读取分页数据,存储过程中的输出参数总页数pageCount获取不准确。

    我已经问过百度,技术群等.....

    都说SqlDataReader用过后关闭,但是每次读取一定条数的数据,总数据并没有读完,总页数就不能获取到么?

    下面把关键的代码贴出来,我相信很多小伙伴跟我遇到相同的问题,希望大牛帮忙看一下,最好能深入的讲一下,万分感谢......

    存储过程:

     1 CREATE PROC Paged
     2 @pageIndex INT,
     3 @pageCount INT OUTPUT,
     4 @pageSize INT 
     5 AS
     6 DECLARE @count INT
     7 SELECT @count= COUNT(*) FROM dbo.Student
     8 SET @pageCount=CEILING(@count*1.0/@pageSize)
     9 SELECT 
    10 * 
    11 FROM 
    12 (SELECT ROW_NUMBER() OVER(ORDER BY dbo.Student.stuId) AS tempId,* FROM dbo.Student) AS stu
    13 WHERE tempId >=@pageSize*(@pageIndex-1)+1 AND tempId <=@pageIndex*@pageSize

    SqlHelper中的ExecuteReader方法:

     1   /// <summary>
     2         /// 执行查询 返回SqlDataReader对象
     3         /// </summary>
     4         /// <param name="sql">sql语句</param>
     5         /// <param name="param">参数</param>
     6         /// <returns></returns>
     7         public static SqlDataReader ExecuteReader(string sql, CommandType type, params SqlParameter[] param)
     8         {
     9             SqlConnection conn = new SqlConnection(connStr);
    10             using (SqlCommand cmd = new SqlCommand(sql, conn))
    11             {
    12                 cmd.CommandType = type;
    13                 if (param != null)
    14                 {
    15                     cmd.Parameters.AddRange(param);
    16                 }
    17                 conn.Open();
    18                 SqlDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    19                 cmd.Parameters.Clear();
    20                 return reader;
    21             }
    22         }

    数据层DAL代码:
    我猜:是因为SqlDataReader在读取数据的时候是在线读取,肯定是在Close的时候,没有获取所有的数据,导致输出的总页数不正确。

    也就是关闭的时机不对。

     1 /// <summary>
     2         /// 返回学生信息集合
     3         /// </summary>
     4         /// <param name="pageIndex">当前页</param>
     5         /// <param name="pageSize">每页多少条数据</param>
     6         /// <param name="pageCount">总页数</param>
     7         /// <returns>学生信息集合</returns>
     8         public List<Student> GetPagedStudentInfo(int pageIndex, int pageSize, out int pageCount)
     9         {
    10             List<Student> list = new List<Student>();
    11             string sql = "Paged";
    12             SqlParameter[] param = {
    13                                         new SqlParameter("@pageIndex",DbType.Int32),
    14                                         new SqlParameter("@pageSize",DbType.Int32),
    15                                         new SqlParameter("@pageCount",DbType.Int32)
    16                                    };
    17             //为输入参数赋值
    18             param[0].Value = pageIndex;
    19             param[1].Value = pageSize;
    20             using (SqlDataReader reader = SQLHelper.ExecuteReader(sql, CommandType.StoredProcedure, param))
    21             {
    22 
    23                 while (reader.Read())
    24                 {
    25                     list.Add(ConvertReaderToStudentModel(reader));
    26                 }
    27             }
    28             //为输出参数赋值
    29             param[2].Direction = ParameterDirection.Output;
    30             pageCount = (int)param[2].Value;
    31             return list;
    32         }
    33         /// <summary>
    34         /// 将Reader转化为集合
    35         /// </summary>
    36         /// <param name="reader"></param>
    37         /// <returns></returns>
    38         private Student ConvertReaderToStudentModel(SqlDataReader reader)
    39         {
    40             Student stu = new Student();
    41             stu.TempId = Convert.ToInt32(reader["tempId"]);
    42             stu.StuId = Convert.ToInt32(reader["stuId"]);
    43             stu.StuName = reader["stuName"].ToString();
    44             stu.StuSex = Convert.ToChar(reader["stuSex"]);
    45             stu.StuBirthdate = Convert.ToDateTime(reader["stuBirthdate"]);
    46             stu.StuStudydate = Convert.ToDateTime(reader["stuStudydate"]);
    47             stu.StuAddress = reader["stuAddress"].ToString();
    48             stu.StuEmail = reader["stuEmail"].ToString();
    49             stu.StuPhone = reader["stuPhone"].ToString();
    50             stu.StuIsDel = (bool)reader["stuIsDel"];
    51             stu.StuInputtime = Convert.ToDateTime(reader["stuInputtime"]);
    52             stu.ClassId = Convert.ToInt32(reader["ClassId"]);
    53             return stu;
    54         }

    这里pageCount输出11条,在数据库中有6w条数据,每页显示10条应该有6000页。
    数据库测试存储过程:

    结果:

    测试:存储过程没有错。

    问题:

         该如何修改呢?

    希望哪位大牛帮忙解决一些,不胜感激。

    (标题也萌一把......)

  • 相关阅读:
    EF6学习笔记二十五:分布式事务
    EF6学习笔记二十四:事务
    EF6学习笔记二十三:拦截器异常、耗时监控
    EF6学习笔记二十二:初识NLog日志框架
    EF6学习笔记二十一:格式化日志输出
    EF6学习笔记二十:简单日志记录
    EF6学习笔记十九:不一样的复杂类型
    EF6学习笔记十八:DetectChanges
    EF6学习笔记十七:快照追踪与代理追踪性能测试
    EF6学习笔记十六:变更追踪
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/3297652.html
走看看 - 开发者的网上家园