SqlDataReader读取分页数据,pageCount你是肿么了?
自己在折腾代码的时候发现,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你是肿么了?的更多相关文章
- C#使用SqlDataReader读取数据库数据时CommandBehavior.CloseConnection参数的作用
主要用在ExecuteReader(c)中,如果想要返回对象前不关闭数据库连接,须要用CommandBehavior.CloseConnection: CloseConnection解决了流读取数据模 ...
- Javascript实例技巧精选(6)—滚动鼠标中键读取Json数据分页显示网页内容
>>点击这里下载完整html源码<< 截图如下: 滚动鼠标中键读取Json数据分页显示网页内容,关键的Javascript如下: <script type="t ...
- 运用EasyUI中datagrid读取数据库数据实现分页
1dao层 package com.hanqi.dao; import java.util.ArrayList; import java.util.List; import org.hibernate ...
- ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK
看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...
- ASP.NET MVC + EF 利用存储过程读取大数据
ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...
- 最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子
ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Has ...
- SpringMVC+Mybatis实现的Mysql分页数据查询
周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...
- Python 基于Python从mysql表读取千万数据实践
基于Python 从mysql表读取千万数据实践 by:授客 QQ:1033553122 场景: 有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...
- Android之ListView分页数据加载
1.效果如下: 实例如下: 上图的添加数据按钮可以换成一个进度条 因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: 点击加载按 ...
随机推荐
- 后盾网VIP美团网开发(基于HDPHP)(全套38课)
教程简介 本教程由后盾网讲解,共40节,主要介绍了美团网的开发,从需求分析出发,对商铺的建立.购物流程的构建及订单处理等都做了详细的介绍,非常适合做电子商务开发的朋友和同学参考学习使用,完整教程可以在 ...
- Linux第十一次学习笔记
异常控制流 异常控制流(ECF)发生在计算机系统的各个层次 在硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序. 在操作系统层,内核通过上下文转换将控制从一个用户进程转移到另一个用户进程. 在 ...
- 访问图片可以使用闭包map
1 imageView.animationImages = [ UIImage(named:"panda1"), UIImage(named:"panda2") ...
- 端口扫描之王——nmap入门精讲(二)
接着讲上节的内容,上节中提到了一个时间优化的问题是使用参数-n,通过不解析地址来进行优化时间的,但是优化时间的方法还有很多,比如说我们可以通过时间优化(0-5),指定单位时间内的探针数,设置组的大小 ...
- tsql的奇特语法
也许是离开t-sql太久了,突然发现很多t-sql的奇特语法 用一句sql解决多种排序: ; SELECT C1, C2 FROM T ORDER BY THEN C1 END ASC, THEN C ...
- jquery hasClass、removeClass、addClass方法
hasClass(class) 检查当前的元素是否含有某个特定的类,如果有,则返回true. 参数: class:用于匹配的类名. ---------------------------------- ...
- [USACO2002][poj1944]Fiber Communications(枚举)
Fiber Communications Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3804 Accepted: 1 ...
- JAVA 注解的几大作用及使用方法详解【转】
java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...
- 解决系统打开CHM文件无法正常显示
最近学习servlet下载了一个CHM的帮助手册但是打开后右侧却时空白.试了各种方法都没有成功最后终于找到原因所在. 一般情况下无法显示网页:右键 chm文件属性里最下面有个“解除锁定”,点击“解除锁 ...
- Linux大文件已删除,但df查看已使用的空间并未减少解决
在我的生活当中遇到磁盘快满了,这时候准备去删除一些大文件 于是我使用ncdu 查看了一下当前系统占用资源比较多的是那些文件,结果一看是elasticsearch的日志文件,好吧,竟然找到源头了,那就把 ...