自己在折腾代码的时候发现,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页。
数据库测试存储过程:
结果:
测试:存储过程没有错。
问题:
该如何修改呢?
希望哪位大牛帮忙解决一些,不胜感激。
(标题也萌一把......)
博客地址: | http://www.cnblogs.com/wolf-sun/ |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/3297652.html |
时间: 2024-10-07 11:49:37