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页。
数据库测试存储过程:

结果:

测试:存储过程没有错。

问题:

     该如何修改呢?

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

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

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/3297652.html
时间: 2024-10-07 11:49:37

SqlDataReader读取分页数据,pageCount你是肿么了?的相关文章

DataGrid和存储过程结合的分页,只读取当前页数据

datagrid|存储过程|分页|数据   <%@ Import Namespace="System.Data.SqlClient" %><%@ Import Namespace="System.Data" %> <Script Runat="Server"> Dim conNorthwind As SqlConnectionDim strSelect As StringDim intStartIndex As

jquert如何实现分页数据已经从数据库 读取出来绑定好了

问题描述 jquert如何实现分页数据已经从数据库 读取出来绑定好了 数据已经从数据库 读取出来绑定好了 如何用jquert实现分页呀 实现图片上的有上下翻页 显示多少也 例如每页显示十条数据 <%@ page language=""java"" import=""java.util.*"" pageEncoding=""UTF-8""%><%@taglib uri=&

简单的SQL Server数据库数据读取与数据操作

server|数据|数据库   简单实用的数据读取,数据操作方法,贴到程序里面直接调用 读取方法: public DataSet Query(string SQLText)  {   SqlConnection myConnection=new SqlConnection(ConfigurationSettings.AppSettings["conn"]);    DataSet ds = new DataSet();   SqlDataAdapter myCommand = new

sql-ASP读取SQL数据表 生成多记录JSON 具体代码如何写 求教大神

问题描述 ASP读取SQL数据表 生成多记录JSON 具体代码如何写 求教大神 数据表是user 主键是m_Name <%response.ContentType=""text/json"" response.write request(""jsoncallback"")%>([{""m_Name"":""*依旧""n_Name&quo

ASP读取XML数据文件的方法

xml|数据 分别保存下面两段代码,一个保存为readxml.asp另一个保存为test.xml,放在同一个目录下面,调试程序即可,在程序里面我已经做了解释,读取代码可以做成一个readxml的函数,通过使用输入的参数而读取xml不同数据记录的不同的值.这段程序的改编来自互联网,有什么出入请见谅. readxml.asp以下是引用片段:<% dim xml,objNode,objAtr,nCntChd,nCntAtr Set xml=Server.CreateObject("Microso

实现jsp页面二级下拉框联动,实时读取数据库数据

在一个jsp页面实现二级下拉框联动,实时读取数据库数据,这个方法非常有用,只需要修改很小的地方就可以使用.设计的文件,serch.jsp,main.js,bytetostr.js, 先讲一下main.js,这是javascript,其中注意修改jsp页面名称. 以下为引用的内容: function findObject(fName,initValue)...{   var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");   xmlht

用php读取xml数据

xml|数据 今天工作上碰到一个问题 由于我们的项目数据太少 所以需要从web search那边借调数据,他们只给我们提供了一个xml的接口.因此,我们需要把xml的数据转化成html呈现给大家.由于项目是基于php的,所以就摒弃了用js来读取xml选择了继续使用php.不过,我以前从来没有做过此类的尝试 所以找了很多网上资料同时参照了php的工作手册,发现在php4的环境下 用parser函数是一个比较好的选择(当然也可以用dom 但是需要对服务器重新进行配置 php5对dom支持得比较好).

代码详解:ASP读取XML数据文件的方法

xml|数据|详解 分别保存下面两段代码,一个保存为readxml.asp另一个保存为test.xml,放在同一个目录下面,调试程序即可,在程序里面我已经做了解释,读取代码可以做成一个readxml的函数,通过使用输入的参数而读取xml不同数据记录的不同的值.这段程序的改编来自互联网,有什么出入请见谅. readxml.asp<%dim xml,objNode,objAtr,nCntChd,nCntAtrSet xml=Server.CreateObject("Microsoft.XMLD

实例分析:ASP读取XML数据文件的方法

xml|数据 分别保存下面两段代码,一个保存为readxml.asp另一个保存为test.xml,放在同一个目录下面,调试程序即可,在程序里面我已经做了解释,读取代码可以做成一个readxml的函数,通过使用输入的参数而读取xml不同数据记录的不同的值.这段程序的改编来自互联网,有什么出入请见谅. readxml.asp <% dim xml,objNode,objAtr,nCntChd,nCntAtr Set xml=Server.CreateObject("Microsoft.XMLD