程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> ADO.NET中的SqlCommand.ExecutePageReader 使用基礎教程

ADO.NET中的SqlCommand.ExecutePageReader 使用基礎教程

編輯:關於C#
 

在.NET 2.0 PDC或Beta1中,可以看到SqlCommand對象新增了個ExecutePageReader方法,該方法實現了分頁讀取數據的功能。對於分頁讀取數據,在ADO.NET1.1中(當然2.0也適合)一般常用動態構造SQL語句實現:


SqlDataReader GetPage(int pageNumber, int pageSize)
{
//pageNumber: 從 0 開始計數的頁碼
//pageSize: 每頁的記錄數
String command = String.Format("SELECT * FROM (SELECT TOP {0} * FROM " +
"Products ORDER BY ProductID) AS t1 WHERE ProductID NOT IN " +
"(SELECT TOP {1} ProductID FROM Products ORDER BY ProductID) ",
pageSize * (pageNumber + 1), pageSize * pageNumber);

SqlConnection conn = new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
SqlCommand cmd = new SqlCommand(command, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}

有時為更好實現分頁性能效果,也可以采用存儲過程建立臨時表的方式進行數據分頁,但原理基本都差不多。在ADO.NET 2.0 PDC/Beta1中,用SqlCommand.ExecutePageReader進行數據分頁:

SqlDataReader GetPageReader(int pageNumber, int pageSize)
{
int startIndex = (pageNumber - 1) * pageSize;
String command = "SELECT * FROM Products";
SqlConnection conn = new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
SqlCommand cmd = new SqlCommand(command, conn);
conn.Open();
SqlDataReader dr = cmd.ExecutePageReader(CommandBehavior.CloseConnection, startIndex, pageSize);

return dr;
}

最後綁定第2頁的5行數據(ProductID從6到10)到GridView1上:

GridView1.DataSource = GetPage(1, 5);
GridView1.DataBind();

從上可以看到,用了ExecutePageReader確實簡單了很多。但是,很“不幸”告訴大家,ExecutePageReader在未來版本中將不會出現,也就是說被cut掉了。至於cut的真正原因,還真不知道。不過,我試圖用Reflector去看其內部,發現這樣一個調用順序:ExecutePageReader()—》SqlResultSet.CompleteOpenForPageReader()—》SqlResultSet.FetchInternal()—》執行存儲過程sp_cursorfetch,也就是實際ExecutePageReader使用了SQLServer的服務器游標進行數據分頁讀取,但這跟它被cut是否有關?這麼好用的一個功能被cut是不是有其他考慮?或許ADO.NET開發小組在魚和熊掌取捨之間已經做了抉擇,只是我還是覺得ExecutePageReader(據說SqlResultSet也被cut,然後連同ExecutePageReader被cut)被cut很可惜。
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved