自己在折腾代码的时候发现,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页。
数据库测试存储过程:
结果:
测试:存储过程没有错。
问题:
该如何修改呢?
希望哪位大牛帮忙解决一些,不胜感激。
(标题也萌一把......)