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

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

都说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[].Value = pageIndex;
param[].Value = pageSize;
using (SqlDataReader reader = SQLHelper.ExecuteReader(sql, CommandType.StoredProcedure, param))
{ while (reader.Read())
{
list.Add(ConvertReaderToStudentModel(reader));
}
}
//为输出参数赋值
param[].Direction = ParameterDirection.Output;
pageCount = (int)param[].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读取分页数据,pageCount你是肿么了?的更多相关文章

  1. C#使用SqlDataReader读取数据库数据时CommandBehavior.CloseConnection参数的作用

    主要用在ExecuteReader(c)中,如果想要返回对象前不关闭数据库连接,须要用CommandBehavior.CloseConnection: CloseConnection解决了流读取数据模 ...

  2. Javascript实例技巧精选(6)—滚动鼠标中键读取Json数据分页显示网页内容

    >>点击这里下载完整html源码<< 截图如下: 滚动鼠标中键读取Json数据分页显示网页内容,关键的Javascript如下: <script type="t ...

  3. 运用EasyUI中datagrid读取数据库数据实现分页

    1dao层 package com.hanqi.dao; import java.util.ArrayList; import java.util.List; import org.hibernate ...

  4. ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK

    看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...

  5. ASP.NET MVC + EF 利用存储过程读取大数据

    ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...

  6. 最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子

    ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Has ...

  7. SpringMVC+Mybatis实现的Mysql分页数据查询

    周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...

  8. Python 基于Python从mysql表读取千万数据实践

    基于Python 从mysql表读取千万数据实践   by:授客 QQ:1033553122 场景:   有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...

  9. Android之ListView分页数据加载

    1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: 点击加载按 ...

随机推荐

  1. Caffe学习系列(15):计算图片数据的均值

    图片减去均值后,再进行训练和测试,会提高速度和精度.因此,一般在各种模型中都会有这个操作. 那么这个均值怎么来的呢,实际上就是计算所有训练样本的平均值,计算出来后,保存为一个均值文件,在以后的测试中, ...

  2. 学习Shell脚本编程(第2期)_编写修改权限及执行Shell程序的步骤

    编写Shell程序 执行Shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂.Shell程序是指放在一个文件中的一系列Linux命令和实用程序.在执行的时 ...

  3. Java中sleep()和wait()的区别

    1. 这两个方法来自不同的类,sleep方法属于Thread,wait方法属于Object. 2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法. ...

  4. 信息安全系统设计基础第一次实验报告 20135201&&20135306&&20135307

    信息安全系统设计基础实验 班级: 201353 姓名:张忻 张嘉琪 黄韧 学号:20135301 20135307 20135306 实验日期:2015.11.10 实验名称: S3C2410的lin ...

  5. IOS开发之—— Core Foundation对象与OC对象相对转换的问题

    对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...

  6. 轻松理解JS基本包装对象

    今天来讨论一下JS中的基本包装对象(也叫基本包装类型),之前刚学到这里的时候,自己也是一头雾水,不明白这个基本包装对象到底是个什么鬼,后来找了很多资料,终于看清了它的真面目.首先呢,我们现在复习一下J ...

  7. 如何自定义FloatingActionButton的大小

    Google最近为了让开发者更好的更规范的应用Material Design设计思想,特意放出了android support design library,里面含有更多Material Design ...

  8. php mysqli扩展之预处理

    在前一篇 mysqli基础知识中谈到mysqli的安装及基础操作(主要是单条sql语句的查询操作),今天介绍的是mysqli中很重要的一个部分:预处理. 在mysqli操作中常常涉及到它的三个主要类: ...

  9. [C/C++基础] C语言常用函数strlen的使用方法

    函数声明:extern unsigned int strlen(char *s); 所属函数库:<string.h> 功能:返回s所指的字符串的长度,其中字符串必须以’\0’结尾 参数:s ...

  10. SQL Server2008 列名显示无效

    在SQLServer2008中,当设计(修改)表结构之后,再用SQL语句时,列名会显示无效,但执行可以通过 如下图: 原因是SQL Server的intellisense(智能感知功能)需要重新整理一 ...