程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0數據教程之二十六:排序自定義分頁數據

ASP.NET 2.0數據教程之二十六:排序自定義分頁數據

編輯:關於ASP.NET

返回“ASP.NET 2.0數據教程目錄”

導言

和默認翻頁方式相比,自定義分頁能提高幾個數量級的效率。當 我們的需要對大量數據分頁的時候就需要考慮自定義分頁,然而實現自定義分頁 相比默認分頁需要做更多工作。對於排序自定義分頁數據也是這樣,在本教程中 我們就會擴展前面的例子來實現自定義分頁數據的排序。

注意:既然本教 程是基於前一個的,因此我們需要把前面教程示例頁面EfficientPaging.aspx的 <asp:Content>元素中的代碼復制到本教程SortParameter.aspx示例頁面中 。關於如何進行這樣的復制操作請參看為刪除數據添加客戶端確認

Step 1: 回顧自定義分頁技術

要實現自定義分頁,我們需要使用一些方法根據 開始行索引和最大行參數返回一個記錄的子集。在前面的教程中,我們看了如何 使用微軟SQL SERVER 2005的ROW_NUMBER()來實現。簡而言之,ROW_NUMBER()為每 一個查詢返回的行分配一個行號。下面這個查詢演示了如何使用這個技術按照 ProductName排序獲取的11至20的產品數據。

SQL 1
2
3
4
5 SELECT ProductID, ProductName, ...
FROM
  (SELECT ProductID, ProductName, ..., ROW_NUMBER() OVER (ORDER BY ProductName) AS RowRank
   FROM Products) AS ProductsWithRowNumbers
WHERE RowRank > 10 AND RowRank <= 20

對 於按照一種固定的排序規則進行分頁,上述技術就能滿足了(比如按照 ProductName排序),但是如果我們希望獲取按照不同的排序表達式排序後的記錄 ,理想地,我們應該在OVER子句中使用參數重寫上述查詢,代碼如下: SQL 1
2
3
4
5 SELECT ProductID, ProductName, ...
FROM
  (SELECT ProductID, ProductName, ..., ROW_NUMBER() OVER (ORDER BY @sortExpression) AS RowRank
   FROM Products) AS ProductsWithRowNumbers
WHERE RowRank > 10 AND RowRank <= 20

可惜,ORDER BY子句中不能使用參數。而我們只能創建存儲過程來接受 @sortExpression輸入參數,使用如下任意一種方法:

為所有的排序表達 式硬編碼查詢,使用IF/ELSE T-SQL語句來決定執行哪個查詢

使用CASE語 句來根據輸入參數@sortExpression實現動態ORDER BY表達式,詳細請看The Power of SQL CASE Statements中的Used to Dynamically Sort Query Results 部分。

使用字符串來保存查詢語句然後使用sp_executesql系統存儲過程 來動態執行查詢

上述每一種實現方法都有各自的缺點。第一個方案和其 余兩個相比可維護性比較差,因為它需要為每一個可能的查新表達式創建一句查 詢。因此,如果你又在GridView中加入了一個允許排序的字段,還需要去修改存 儲過程。對於第二個方案如果我們的數據庫列不是字符串類型的話,排序就會引 發一定的效率問題,而且可維護性和第一種一個一樣也不是很好。至於最後一個 動態組合SQL語句的方案,如果你允許用戶自己輸入參數並傳入存儲過程的話則可 能帶來SQL注入攻擊的危害。

雖然沒有一種方案是完美的,但是我認識第 三種是這三個方案中最佳的。因為它是使用動態SQL語句的,所以靈活性比前兩者 都好。而且,只有當攻擊者能隨意把參數傳入存儲過程才能進行SQL注入攻擊。既 然DAL使用參數化查詢,ADO.NET會防止這些惡意參數傳入數據庫,也就是說只有 當攻擊者人直接執行存儲過程的時候才會有SQL注入的隱患。

要實現這個 功能,讓我們在Northwind數據庫中新建稱作GetProductsPagedAndSorted的一個 存儲過程。這個存儲過程接受三個參數:@sortExpression,nvarchar(100)類型 的輸入參數,用來指定排序方式,它會直接拼接在ORDER BY子句後面。 @startRowIndex 和 @maximumRows都是整數輸入參數,和前面教程中的一樣。你 可以參考下面的腳本建立GetProductsPagedAndSorted存儲過程:

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