天天看點

ASP .NET 如何在 SQL 查詢層面實作分頁

【編者按】本文作者為來自巴基斯坦的軟體開發工程師 aqeeel,主要介紹了在 sql 查詢層面實作 asp.net 應用的分頁方法。

gridview 提供了一種實作分頁的方法。但是,随着記錄的不斷擴大,我們需要在查詢層面進行優化。

在 sql 查詢層面實作 asp.net 程式分頁,而不借助 gridview。

無可否認,gridview 是在 asp.net web 表單展示資料的強大工具,它能在結果集較大時實作分頁。然而,後端會擷取完整的資料,抽取出相關資料,然後通過 gridview 展示在 web 表單中。在這種情況下,相關資料隻是完全抽取資料的一小部分。這些多餘的資料造成了處理能力、記憶體空間以及時間的極大浪費。在本文中,我們将展示如何僅從資料庫抽取所需資料,進而避免這些浪費。

下圖展示了從資料庫中擷取完整資料的方式。在渲染階段,相關資料會被抽取出來,填充到 gridview 中。

ASP .NET 如何在 SQL 查詢層面實作分頁

下圖展示了從資料庫中抽取過濾或相關資料的方式,進而得到更小的資料集。在 web 應用中,同樣的資料集無需經過進一步抽取,就可以填充到 gridview 中。

ASP .NET 如何在 SQL 查詢層面實作分頁

本例借助 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 中過濾資料所需的步驟也可以避免。進而切實提高并優化應用性能。