摘要:數據分頁是Web應用程序開發中經常使用的一種技術,也是提高Web數據訪問性能的主要手段。結合ASP.NET的優點,詳細分析了ASP.NET中各種數據分頁技術,并通過分析試驗結果比較了各種數據分頁技術的優缺點。
關鍵詞:ASP.NET;Web應用;數據分頁
中圖分類號:TP311.11文獻標志碼:A
文章編號:1001-3695(2007)09-0159-03
ASP.NET是微軟.NET開發平臺的核心元素,程序開發人員可以使用它構建動態Web站點、開發Web應用程序、提供基于XML的Web服務。ASP.NET 完全基于模塊和組件,具有很好的可擴展性和可定制性,可為用戶提供功能強大、外觀豐富的可編程Web頁面。
在Web開發過程中,進行數據查詢時經常會遇到這樣的情況,即一個數據庫查詢會返回太多的結果行。如果把這些數據都在一個頁面中發送給客戶端會產生下面幾個問題:
a)數據在頁面中顯示過程非常漫長,有時會造成數據的缺損、遺漏或丟失;
b)造成網絡資源的嚴重浪費,甚至會產生嚴重的網絡堵塞現象;
c)對用戶來說,等待一個漫長時間的鏈接是一種很糟糕的體驗。
針對上述問題,分頁顯示技術應運而生。數據分頁顯示技術是Web開發過程中經常使用的海量數據顯示方法,為用戶可管理的數據查詢提供了極大的方便。本文針對微軟的ASP.NET詳細介紹了Web開發中用到的各種分頁顯示方法和技巧,并給出了核心的程序代碼。
1各種技術的詳細分析與研究
本文使用ASP.NET、C #[1]、SQL Server 2000實現各種分頁過程。
1.1使用DataGrid控件分頁顯示數據
DataGrid控件是ASP.NET中功能最強大的數據控件之一,它以表格式布局顯示數據庫中的數據。DataGrid除了內建的數據表現和方法之外,還允許用戶自己定義表現形式,允許用戶分頁顯示數據。DataGrid的內建分頁方法每次請求時需要把查詢結果發送給Web服務器,Web服務器再將查詢結果發送到客戶端瀏覽器的Web頁面上。下面的代碼給出了DataGrid顯示數據的后臺代碼:
//分頁函數
private void datagrid1_Page(object sender,DataGridPageChangedEventArgs e){
DataGrid1.CurrentPageIndex=e.NewPageIndex;
DataGrid1.DataSource=GetDataview();
DataGrid1.DataBind();}
//綁定數據
private DataView GetDataview(){
string strConn=\"數據庫連接字符串...\";
string strComm=\"select * from pagerepository\";
DataView dv;
SqlConnection dbConn=newSqlConnection(strConn);
dbConn.Open();
SqlDataAdapter da=newSqlDataAdapter(strComm,dbConn);
DataSet ds=new DataSet();
da.Fill(ds);
dv=ds.Tables[0].DefaultView;
dbConn.close();
return dv;}
1.2基于ADO.NET的存儲過程分頁
ADO.NET 是專為.NET環境下的 Web應用程序而設計的關系數據存取模型,同時還能為其他應用程序結構提供較好的功能。通過支持對數據的松耦合訪問,ADO.NET 減少了與數據庫的活動連接數目(即減少了多個用戶爭用數據庫服務器上的有限資源的可能性),從而實現了最大程度的數據共享。這里也要用到DataGrid。在1.1節每次請求時都要將數據庫中的數據讀到內存中,于是,當數據量很大時,1.1節的方便性是以犧牲性能為代價的。區別于1.1節中采用普通的SQL查詢語句進行操作,這次不再將所有的結果數據讀入內存,而是借助SQL Server 2000[2,3]提供的存儲過程[4]來進行優化,每次請求只是從數據庫中取出一個頁面的數據量。通過使用存儲過程,大大提高了數據的存取速度,有效地減少了對無效數據的操作,改善了系統性能。該方法首先建立一個存儲過程,然后使用存儲過程從數據表格中查詢數據。下面的代碼給出了該方法顯示數據的過程:
//存儲過程——每次查詢一個頁面的數據
create procedure paging(@pageSize int, @CurPage int, @count int output)as
select identity(int,1,1) as ′id′,* into #temp from ageRepository
--從臨時表中檢索數據
select * from #temp
where ID>@pageSize*@CurPage and id<=@pageSize*(@CurPage+1)
drop table #temp
//綁定數據
private DataSet GetDataview(){
string strConn=\"數據庫連接字符串\";
string strComm=\"paging\";
SqlConnection dbConn=new SqlConnection(strConn);
SqlCommand dbComm=new SqlCommand(strComm, dbConn);
dbComm.CommandType =CommandType.StoredProcedure;
dbComm.Parameters.Add(\"@pageSize\",SqlDbType.Int);
dbComm.Parameters[\"@pageSize\"].Direction=ParameterDirection.Input;
dbComm.Parameters[\"@pageSize\"].Value=pageSize;
dbComm.Parameters.Add(\"@CurPage\", SqlDbType.Int);
dbComm.Parameters[\"@CurPage\"].Direction=ParameterDirection.Input;
dbComm.Parameters[\"@CurPage\"].Value=curPage;
dbComm.Parameters.Add(\"@count\", SqlDbType.Int);
dbComm.Parameters[\"@count\"].Direction=ParameterDirection.Output;
dbConn.Open();
SqlDataAdapter da=new SqlDataAdapter();
DataSet ds=new DataSet();
da.SelectCommand = dbComm;
da.Fill(ds);
dbComm.ExecuteNonQuery();
totalPages=dbComm.Parameters(\"@count\").Value/pageSize;
dbConn.Close();
return ds;
}
//DataGrid綁定數據
Private void bindingGrid(){
DataGrid1.DataSource=GetDataview();
DataGrid1.DataBind();
}
1.3使用table(表格)控件靈活分頁
有時數據庫中存放的數據類型比較復雜,如某些數據表格的字段既有文本格式又有多媒體圖片信息等。這時在頁面上顯示數據時就要考慮頁面的整體布局、圖片位置和文本內容要協調一致,達到一種好的視覺效果(圖1)。DataGrid通常只能按照一定模式進行數據顯示,對于這種頁面顯示需要靈活布局的情況顯得有些力不從心,而ASP.NET提供的表格控件正好滿足了類似的要求,能夠方便靈活地顯示數據。但是,使用表格控件時,數據翻頁需要重新設計,如可以在頁面底部綁定另一表格專門用于頁碼顯示(圖1)。頁面翻頁向服務器提交頁碼時,頁碼的傳遞方式既可以通過get方式(或稱querystring傳值)傳遞,也可以通過post方式(或稱forms傳值)傳遞[5]。
下面給出了具體的分頁顯示函數和頁碼綁定函數:
//按照頁面指定的布局顯示數據
private void DisplayResults(Table tblResult,int intPageNo,int pageSize,int totalCounts){
string strConn=\"數據庫連接字符串\";
string strComm=\"paging\";
int i=0;
TableCell cellResult;
TableRow rowResult;
SqlConnection dbConn=newSqlConnection(strConn);
SqlCommand dbComm=newSqlCommand(strComm, dbConn);
SqlDataReader dr;
dbConn.Open();
dr=dbComm.ExecuteReader();
while (dr.Read() i if (i >= pageSize * (intPageNo-1)){ rowResult=new TableRow(); cellResult=new TableCell(); //圖片信息 TableCell cellPic; cellPic=new TableCell(); cellPic.Text=\"圖片地址\"; //標題信息(代碼與圖片類似) //摘要信息(代碼與圖片類似) //附加信息(代碼與圖片類似) rowResult.Cells.Add(cellResult); tblResult.Rows.Add(rowResult); } i++; dbConn.Close();} //分頁綁定函數 private void BuildPageRow(Table tb,int PageNo,int pageSize,int Docs){ TableRow rowPageRow=new TableRow(); TableCell cellPageNo; int intPageCount; intPageCount=intDocsSet/PageSize; if (intPageNo > 1){ cellPageNo=new TableCell(); cellPageNo.Text=\"上一頁\"; rowPageRow.Cells.Add(cellPageNo); } cellPageNo=new TableCell(); cellPageNo.Text=i.ToString(); rowPageRow.Cells.Add(cellPageNo); if (intPageNo < intPageCount){ cellPageNo=new TableCell(); cellPageNo.Text = \"下一頁\"; rowPageRow.Cells.Add(cellPageNo); } tblPageRow.Rows.Add(rowPageRow); } 1.4自定義分頁控件 在既要考慮分頁的靈活性,又要考慮代碼復用的情況下,自定義分頁控件不失為一種好的技術。在 ASP.NET 中,只有 DataGrid 控件具有內置的分頁功能。但是,數據分頁是由模板化的代碼實現的,只要對其他數據控件進行適當的處理,就可實現分頁顯示的功能。例如,自定義控件可以使用ASP.NET中提供的DataList、ListBox等控件分頁顯示數據。 本文定義了一個DataPager的自定義控件。由于自定義控件的實現代碼比較多,這里不再提供,只是給出了它的使用方法,有興趣的讀者可以參考文獻[6]。該方法在查詢數據時,既可以使用普通的SQL查詢語句,也可以使用存儲過程進行。下面給出具體的實現代碼: 前臺代碼 〈%@ Register TagPrefix=\"SqlPagerForTest\" Namespace=\"SqlPagerForTest\" Assembly=\"SqlPagerForTest\" %〉 〈DevCenter:SqlPager id=\"sp2\" runat=\"server\" /〉 后臺代碼 普通SQL查詢 sp.ControlToPaginate=\"dgResults\" sp.ConnectionString=strConn strComm=\"Select * from pagerepository\" sp.SelectCommand=strComm sp.CurrentPageIndex=0 sp.DataBind() 使用存儲過程時的代碼與1.2節類似,限于文章篇幅這里不再贅述。 2試驗結果比較 (1)程序運行時間 3結束語 通過上面的分析可以看出,以上各種技術各有優缺點,使用DataGrid分頁技術適合于數據庫比較小的數據分頁,但數據庫比較大時將會降低程序的執行效率。存儲過程分頁方法適合數據庫比較大時的數據分頁,但每次翻頁更新頁面內容時都要訪問數據庫。表格分頁方法適合于頁面布局需要靈活多變時的情況,但其缺點是每次翻頁時table控件都要創建服務端控件,在數據量相當時執行效率不及存儲過程分頁方法。自定義分頁方法適合于大量代碼復用時的情況。在這種情況下,自定義一個控件以后,可以隨時引用。正確選擇一種分頁方式能夠提高Web開發的效率。上述各種分頁技術是在開發國家基金項目中總結出來的開發經驗。 參考文獻: [1]FERRACCHIATI F C,GLYNN J..NET數據服務C#高級編程[M]. 毛堯飛,譯. 北京:清華大學出版社,2002:97-163. [2]袁鵬飛,孫軍安.SQL Server 2000數據庫系統管理[M].北京:人民郵電出版社,2001:89-137. [3]劉瑜,陳鐵英.Microsoft SQL Server 數據庫的安全策略及實現方法[J].計算機工程與設計,2003,24(1):68-71. [4]光耀,易虎,李波.基于存儲過程分頁優化Web數據查詢性能[J].微計算機應用, 2004,25(4):475-479. [5]鐘世芬,柳榮其,孫彪,等.ASP.NET中參數傳值的綜合使用[J].計算機應用研究,2004,21(11):212-214. [6]WINTELLECT D E. Creating a pager control for ASP.NET[EB/OL]. http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnaspp/html/pagercontrols.asp. 注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”