【編者按】本文作者為來自巴基斯坦的軟體開發工程師 aqeeel,主要介紹了在 sql 查詢層面實作 asp.net 應用的分頁方法。
gridview 提供了一種實作分頁的方法。但是,随着記錄的不斷擴大,我們需要在查詢層面進行優化。
在 sql 查詢層面實作 asp.net 程式分頁,而不借助 gridview。
無可否認,gridview 是在 asp.net web 表單展示資料的強大工具,它能在結果集較大時實作分頁。然而,後端會擷取完整的資料,抽取出相關資料,然後通過 gridview 展示在 web 表單中。在這種情況下,相關資料隻是完全抽取資料的一小部分。這些多餘的資料造成了處理能力、記憶體空間以及時間的極大浪費。在本文中,我們将展示如何僅從資料庫抽取所需資料,進而避免這些浪費。
下圖展示了從資料庫中擷取完整資料的方式。在渲染階段,相關資料會被抽取出來,填充到 gridview 中。

下圖展示了從資料庫中抽取過濾或相關資料的方式,進而得到更小的資料集。在 web 應用中,同樣的資料集無需經過進一步抽取,就可以填充到 gridview 中。
本例借助 sql server 2014 與 visual studio 2015 實作。2012 之前的 sql server 版本不支援 fetch,但是使用 row number 可以達到同樣的效果。
建立名為 testpaginginaspnet 的資料庫,
建立名為 administrativeunits 與 cities 的兩張表。
建立存儲過程(stored procedures,簡稱 sp),用于從資料庫擷取資料。請注意,筆者建立了兩個存儲過程,名字分别為 selectcitieswithpaging 與 selectcitieswithpagingoldsqlversions。由于筆者是在 sql server 2014 中實作該解決方案的,在第一個 sp 中,筆者使用了 offset fetch 聲明。對于更早的版本,比如 sql server 2005 與 sql server 2008,則應該使用 row_number() 函數而非 offset fetch。是以,請建立與開發環境相适合的 sp。與傳統的 sp 不同,此處建立的 sp 将包含三個參數,細節如下:
@pagenumber 為将會傳回的頁碼數(page number)
@rowsperpage 為每頁的行數(number of rows)
@totalresords(輸出參數)為總的記錄
aspx
在 web 表單中繪制一個表格,其包含兩個表格行(table rows)
在第一個表格行中推拽下放一個 gridview。此處無需啟用分頁,因為存儲過程實作該功能。
在第二個表格行中,放置兩個按鈕來實作前頁與後頁之間的跳轉。此外,為兩個按鈕建立點選事件。
在第三個表格行中,放置頁面導航連結。
在下面;提供了 .aspx 檔案中的代碼。
aspx.cs
在 .aspx.cs 檔案中,我們會建立兩個函數。
getandbinddata()
第一個函數将得到來自資料庫的請求資料。請注意,我們以頁碼數與每頁的行數為參數。
接收到的資料将填充在網格中。
在頁面加載(page load)事件觸發,且參數頁面數(pagenumber)為1時,即會調用該函數。
createpager()
第二個函數将建立用于導航的連結。
通過此方法,在使用者改變頁面索引時,開發者可以隻擷取相關資料進行展示,而非完整的資料集。這樣,不僅可以從資料庫中選出相關資料,在 gridview 中過濾資料所需的步驟也可以避免。進而切實提高并優化應用性能。