ASP.NET查詢分頁技術(shù):實(shí)現(xiàn)Web數(shù)據(jù)分頁瀏覽
利用ASP.NET開發(fā)Web數(shù)據(jù)庫的查詢功能模塊時(shí),為了減少網(wǎng)絡(luò)流量,提高頁面的訪問速度,一般不會(huì)將所有的查詢結(jié)果完全在一頁中顯示出來,而是將其按照一定規(guī)則分成多頁進(jìn)行顯示,每頁顯示一定數(shù)目記錄。應(yīng)用數(shù)據(jù)記錄分頁技術(shù),可以提高數(shù)據(jù)的查詢性能及頁面的顯示速度,減輕數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān)。
1 ASP.NET查詢分頁技術(shù)概述
對(duì)Web數(shù)據(jù)庫查詢結(jié)果進(jìn)行分頁顯示主要有兩種實(shí)現(xiàn)方式,分別是瀏覽器端分頁和服務(wù)器端分頁。瀏覽器端分頁是先將數(shù)據(jù)庫中所有滿足查詢條件的記錄一次性保存下來,然后通過設(shè)置每頁要顯示的記錄數(shù),再確定要顯示記錄的起點(diǎn)和終點(diǎn)來實(shí)現(xiàn)分頁顯示。服務(wù)器端分頁是根據(jù)用戶的請(qǐng)求,每次分別從滿足查詢條件的記錄中將規(guī)定數(shù)目的記錄數(shù)作讀取并顯示出來。
為此,我們采用服務(wù)器端分頁的方式。在瀏覽器端進(jìn)行分頁時(shí),為了減少網(wǎng)絡(luò)的流量,我們采用SQL Server的存儲(chǔ)過程進(jìn)行分頁。
2 主要技術(shù)
ADO.NET類
在Web應(yīng)用系統(tǒng)中,ASP.NET使用ADO.NET將系統(tǒng)前端的Web瀏覽器和后臺(tái)的數(shù)據(jù)庫之間聯(lián)系起來。ADO.NET是.NET Framework提供的一系列類,提供了對(duì)關(guān)系數(shù)據(jù)、XML和應(yīng)用程序數(shù)據(jù)的訪問。
3 ASP.NET查詢分頁技術(shù)的實(shí)現(xiàn)
在此,我們使用System.data.SqlClient(包含訪問SQL Server數(shù)據(jù)庫的類)對(duì)MS SQL Server2000進(jìn)行操作,使用ASP.NET中的C#語言進(jìn)行描述。以筆者開發(fā)的“在線考試系統(tǒng)”中的“查看學(xué)生留言信息模塊”為例來說明該項(xiàng)技術(shù)的開發(fā)過程。
3.1連接數(shù)據(jù)庫
要訪問數(shù)據(jù),必須首先連接數(shù)據(jù)庫,在此我們利用System.data.SqlClient.SqlConnection類來連接SQL Server中Student的數(shù)據(jù)庫。用到主要屬性和方法如下:
ConnectionString
獲取或設(shè)置用于打開SQL Server數(shù)據(jù)庫的字符串
Open
使用ConnectionString所指定的屬性設(shè)置打開數(shù)據(jù)庫連接
Close
關(guān)閉與數(shù)據(jù)庫的連接
連接字符串如下:
- SqlConnection SCN = new SqlConnection("server=;database=BSNetExam;uid=sa;pwd=");
3.2 存儲(chǔ)過程的建立
- CREATE PROCEDURE PageCut
- @PageSize int=10 , -- 頁面大小
- @PageIndex int=1 --當(dāng)前頁數(shù)
- AS
- declare @strSQL varchar(500)
- if @PageIndex=1
- set @strSQL='select top'+str(@PageSize)+'* from tdbLevMess order by rqsj'
- else
- set @strSQL='select top'+str(@PageSize)+' * from tdbLevMess where rqsj not in
- (select top '+str((@PageIndex-1)*@PageSize)+' rqsj from tdbpres) order by rqsj'
- exec(@strSQL)
- GO
3.3操作數(shù)據(jù)庫
查詢數(shù)據(jù)操作可以通過多種方式來實(shí)現(xiàn),常用的對(duì)象包括SqlCommand對(duì)象(表示一個(gè)SQL查詢或者一個(gè)存儲(chǔ)過程)和SqlDataAdpater對(duì)象(把一個(gè)SqlCommand提交給SQL Server數(shù)據(jù)庫)。在此,我們使用SqlCommand對(duì)象來操作數(shù)據(jù)庫。
SqlCommand類位于System.Data.SqlClient空間中,表示要對(duì)SQL Server數(shù)據(jù)庫執(zhí)行的一個(gè)Transact-SQL語句或存儲(chǔ)過程。本例中用到的屬性和方法如下:
CommandText
獲取或設(shè)置要對(duì)數(shù)據(jù)源執(zhí)行的 Transact-SQL 語句或存儲(chǔ)過程。
CommandType
獲取或設(shè)置一個(gè)值,該值指示如何解釋 CommandText 屬性。
Connection
獲取或設(shè)置 SqlCommand 的此實(shí)例使用的 SqlConnection。
Parameters
獲取 SqlParameterCollection。
ExecuteReader
將 CommandText 發(fā)送到 Connection 并生成一個(gè) SqlDataReader。
SqlParameter類位于System.Data.SqlClient空間中,表示 SqlCommand 的參數(shù),也可以是它到 DataSet 列的映射。本例中用到的Value屬性(獲取或設(shè)置該參數(shù)的值)。
其實(shí)現(xiàn)程序如下:
- SqlCommand SCM=new SqlCommand(); //定義SqlCommand類
- SqlDataReader SDR; //定義SqlDataReader類
- private void GridView_Init(int PageSize,int PageIndex)
- {
- SCN.Open(); //打開數(shù)據(jù)庫連接
- SCM.Connection = SCN;
- SCM.CommandText = "pagecut"; //執(zhí)行存儲(chǔ)過程
- SCM.CommandType = CommandType.StoredProcedure;
- SqlParameter[] pares ={ new SqlParameter("@PageSize",SqlDbType.Int),
- new SqlParameter("@PageIndex",SqlDbType.Int)};
- pares[0].Value = PageSize;
- pares[1].Value = PageIndex;
- SCM.Parameters.Clear(); //清空參數(shù)
- foreach (SqlParameter parameter in pares)
- {
- SCM.Parameters.Add(parameter);
- }
- SDR = SCM.ExecuteReader(); //執(zhí)行存儲(chǔ)過程
- GridView1.DataSource = SDR; //定義GridView的數(shù)據(jù)源
- GridView1.DataBind(); // GridView數(shù)據(jù)源綁定
- SCN.Close(); //關(guān)閉連接
- }
3.4 程序的實(shí)現(xiàn)
在Web窗體上,添加一個(gè)GridView控件(用于數(shù)據(jù)的顯示),四個(gè)LinkButton(用作超級(jí)鏈接,分別為首頁、上一頁、下一頁、末頁),一個(gè)Label控件。將GridView控件的AllowPaging(是否在GridView中打開分頁功能)屬性設(shè)置為False。我們利用Session對(duì)象保存分頁程序中的參數(shù)。具體程序如下:
- protected void Page_Load(object sender, EventArgs e)
- {//頁面初始化
- if (!IsPostBack) //如果頁面不是***次加載
- {
- int PageCount,PageIndex,PageSize; //定義頁面總數(shù)、當(dāng)前頁面號(hào)、每頁記錄數(shù)
- SCN.Open();
- SCM.CommandText = "select count(*) from tdbLevMess ";
- SCM.Connection = SCN;
- int ReCount = Convert.ToInt32(SCM.ExecuteScalar().ToString());//數(shù)據(jù)集記錄總數(shù)
- SCN.Close();
- Session.Add("PageSize", 20); //為共享變量每頁記錄數(shù)PageSize賦值
- PageSize = Convert.ToInt16(Session["PageSize"]);//每頁記錄數(shù)為20
- PageCount=ReCount % PageSize == 0? ReCount / PageSize: ReCount / PageSize + 1;//計(jì)算頁面的總頁數(shù)
- Session.Add("PageCount", PageCount); //為共享變量總頁數(shù)PageCount賦值
- PageIndex = 1;
- Session.Add("PageIndex", PageIndex); //為共享變量總頁數(shù)PageIndex賦值
- GridView_Init (PageSize, PageIndex); //調(diào)用過程為GridView填充數(shù)據(jù)
- LinkButton1.Enabled = false, LinkButton2.Enabled = false;
- LinkButton3.Enabled = true,LinkButton4.Enabled = true;
- Label1.Text = "第"+PageIndex.ToString() + "頁/共" + PageCount.ToString() + "頁";
- }
- }
- protected void LinkButton2_Click(object sender, EventArgs e)
- {//上一頁按鈕
- int PageIndex = Convert.ToInt16( Session["PageIndex"] )- 1;
- int PageCount = Convert.ToInt16( Session["PageCount"]);
- Session.Add("PageIndex", PageIndex);
- int PageSize = Convert.ToInt16(Session["PageSize"]);
- if (PageIndex < = 1)
- {
- LinkButton1.Enabled = false;
- LinkButton2.Enabled = false;
- }
- LinkButton3.Enabled = true;
- LinkButton4.Enabled = true;
- GridView_Init(PageSize, PageIndex);
- Label1.Text = "第" + PageIndex.ToString() + "頁/共" + PageCount.ToString() + "頁";
- }
我們只給出了LinkButton2的代碼(實(shí)現(xiàn)向上翻頁),其它超級(jí)鏈接代碼跟此相類似。
4 結(jié)束語
ASP.NET查詢分頁技術(shù)是Web應(yīng)用系統(tǒng)開發(fā)中經(jīng)常遇到的重要工作,選擇一種高效的查詢分頁技術(shù),不僅能大大提高響應(yīng)速度,而且能提高整個(gè)系統(tǒng)性能,節(jié)約服務(wù)器寶貴資源。
【編輯推薦】


















