SqlDataReader读取分页数据,pageCount你是肿么了?
2013-09-02 21:27
459 查看
自己在折腾代码的时候发现,SqlDataReader读取分页数据,存储过程中的输出参数总页数pageCount获取不准确。
我已经问过百度,技术群等.....
都说SqlDataReader用过后关闭,但是每次读取一定条数的数据,总数据并没有读完,总页数就不能获取到么?
下面把关键的代码贴出来,我相信很多小伙伴跟我遇到相同的问题,希望大牛帮忙看一下,最好能深入的讲一下,万分感谢......
存储过程:
SqlHelper中的ExecuteReader方法:
数据层DAL代码:
我猜:是因为SqlDataReader在读取数据的时候是在线读取,肯定是在Close的时候,没有获取所有的数据,导致输出的总页数不正确。
也就是关闭的时机不对。
这里pageCount输出11条,在数据库中有6w条数据,每页显示10条应该有6000页。
数据库测试存储过程:
结果:
测试:存储过程没有错。
问题:
该如何修改呢?
希望哪位大牛帮忙解决一些,不胜感激。
(标题也萌一把......)
我已经问过百度,技术群等.....
都说SqlDataReader用过后关闭,但是每次读取一定条数的数据,总数据并没有读完,总页数就不能获取到么?
下面把关键的代码贴出来,我相信很多小伙伴跟我遇到相同的问题,希望大牛帮忙看一下,最好能深入的讲一下,万分感谢......
存储过程:
CREATE PROC Paged @pageIndex INT, @pageCount INT OUTPUT, @pageSize INT AS DECLARE @count INT SELECT @count= COUNT(*) FROM dbo.Student SET @pageCount=CEILING(@count*1.0/@pageSize) SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY dbo.Student.stuId) AS tempId,* FROM dbo.Student) AS stu WHERE tempId >=@pageSize*(@pageIndex-1)+1 AND tempId <=@pageIndex*@pageSize
SqlHelper中的ExecuteReader方法:
/// <summary> /// 执行查询 返回SqlDataReader对象 /// </summary> /// <param name="sql">sql语句</param> /// <param name="param">参数</param> /// <returns></returns> public static SqlDataReader ExecuteReader(string sql, CommandType type, params SqlParameter[] param) { SqlConnection conn = new SqlConnection(connStr); using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.CommandType = type; if (param != null) { cmd.Parameters.AddRange(param); } conn.Open(); SqlDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return reader; } }
数据层DAL代码:
我猜:是因为SqlDataReader在读取数据的时候是在线读取,肯定是在Close的时候,没有获取所有的数据,导致输出的总页数不正确。
也就是关闭的时机不对。
/// <summary> /// 返回学生信息集合 /// </summary> /// <param name="pageIndex">当前页</param> /// <param name="pageSize">每页多少条数据</param> /// <param name="pageCount">总页数</param> /// <returns>学生信息集合</returns> public List<Student> GetPagedStudentInfo(int pageIndex, int pageSize, out int pageCount) { List<Student> list = new List<Student>(); string sql = "Paged"; SqlParameter[] param = { new SqlParameter("@pageIndex",DbType.Int32), new SqlParameter("@pageSize",DbType.Int32), new SqlParameter("@pageCount",DbType.Int32) }; //为输入参数赋值 param[0].Value = pageIndex; param[1].Value = pageSize; using (SqlDataReader reader = SQLHelper.ExecuteReader(sql, CommandType.StoredProcedure, param)) { while (reader.Read()) { list.Add(ConvertReaderToStudentModel(reader)); } } //为输出参数赋值 param[2].Direction = ParameterDirection.Output; pageCount = (int)param[2].Value; return list; } /// <summary> /// 将Reader转化为集合 /// </summary> /// <param name="reader"></param> /// <returns></returns> private Student ConvertReaderToStudentModel(SqlDataReader reader) { Student stu = new Student(); stu.TempId = Convert.ToInt32(reader["tempId"]); stu.StuId = Convert.ToInt32(reader["stuId"]); stu.StuName = reader["stuName"].ToString(); stu.StuSex = Convert.ToChar(reader["stuSex"]); stu.StuBirthdate = Convert.ToDateTime(reader["stuBirthdate"]); stu.StuStudydate = Convert.ToDateTime(reader["stuStudydate"]); stu.StuAddress = reader["stuAddress"].ToString(); stu.StuEmail = reader["stuEmail"].ToString(); stu.StuPhone = reader["stuPhone"].ToString(); stu.StuIsDel = (bool)reader["stuIsDel"]; stu.StuInputtime = Convert.ToDateTime(reader["stuInputtime"]); stu.ClassId = Convert.ToInt32(reader["ClassId"]); return stu; }
这里pageCount输出11条,在数据库中有6w条数据,每页显示10条应该有6000页。
数据库测试存储过程:
结果:
测试:存储过程没有错。
问题:
该如何修改呢?
希望哪位大牛帮忙解决一些,不胜感激。
(标题也萌一把......)
相关文章推荐
- 以SqlDataReader读取数据
- SqlDataReader读取数据的代码
- 使用SqlDataReader读取数据示例
- 使用SqlDataReader读取数据示例
- Lesson 04: Reading Data with the SqlDataReader(使用SqlDataReader读取数据)
- 当获取相似数据时,使用不同方法调用不同sp,但是使用同一个方法去用IIDataReader或者SqlDataReader读取数据时需要判断column name是否存在。
- JScript.Net之SqlDataReader读取数据
- JScript.Net 之 SqlDataReader读取数据
- SqlDataReader读取数据
- SqlDataReader And SqlCommand读取数据
- 读取SqlDataReader数据动态创建DataTable
- SqlDataReader读取数据
- 处理分页的数据函数GetlistByPage(strSQL, PageSize, PageNo, PageCount, arrList)
- SqlDataReader数据读取时的一些小节
- 在循环中读取sqlDataReader.Read()中的所有列,数据类型如何转换?
- SqlDataReader 与 DataSet读取sql中的数据
- asp.net 用sqldatareader读取数据
- SqlCommand 类读取SqlDataReader数据动态创建DataTable
- 使用SqlDataReader读取数据示例
- 使用 SqlDataReader 读取数据示例