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頁。
數據庫測試存儲過程:

結果:

測試:存儲過程沒有錯。

問題:

     該如何修改呢?

希望哪位大牛幫忙解決一些,不勝感激。

(標題也萌一把......)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM