程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 用ObjectDataSource實現自定義分頁的心得總結

用ObjectDataSource實現自定義分頁的心得總結

編輯:.NET實例教程
 在Web應用開發中列表的分頁是難免要遇到的問題,在ASP.Net 2.0中微軟為我們提供了很多數據源控件,如SqlDataSource、ObjectDataSource等,它們都可以實現默認分頁,但是默認分頁是在內存中實現的,用戶量增大時Web服務器的負擔會急劇增大,在多層體系結構程序開發中,往往把分頁和排序的工作交給數據庫服務器來完成,在網上也能找到很多能夠快速實現分頁的控件,但是做為一個程序員對分頁的實現還是有一定的了解比較好,如果過渡的依賴於控件,你說寫出的代碼獨立性就很差,一般在多層web應用開發中建議盡量使用ObjectDataSource,而不要使用SqlDataSource,因為ObjectDataSource有一下有點:
1、SqlDataSource是針對SQL Server的,對其他的數據庫支持不夠,例如在訪問Oracle數據庫時,要用存儲過程返回結構集合SqlDataSource顯得無能為力。
2、ObjectDataSource 提供一個 TypeName 屬性(而不是 ConnectionString屬性),該屬性指定用於執行數據操作的業務邏輯類的類名,ObjectDataSource可以通過TypeName 屬性直接調用業務層的類,在多層應用中ObjectDataSource 顯得很實用,而SqlDataSource要在頁面上指定ConnectionString、Command,系統的層次結構被搞亂,不便於系統的維護工作。
3、ObjectDataSource 控件提供了EnablePaging屬性、SelectCountMethod屬性、StartRowIndexParameterName屬性和MaximumRowsParameterName屬性專門支持數據源分頁。 SelectCountMethod屬性指定的是獲取數據項總數的方法。StartRowIndexParameterName屬性用於指定一個參數的名稱,如程序中不特別設定,其默認參數名為startRowIndex,該參數代表該頁數據項的開始行索引;MaximumRowsParameterName屬性也用於指定一個參數名稱,其默認參數名為maximumRows,該參數代表一頁中容納的數據項總數。SqlDataSource完全沒有提供這些功能。
4、SqlDataSource只支持內存分頁,而不支持數據庫分頁,ObjectDataSource 兩者都支持,內存分頁每次都檢索出所有數據並將其綁定到數據綁定控件中,雖然該控件只能一頁一頁顯示這些數據,但是所有數據其實都已經被綁定到控件上了。而數據庫分頁的含義是顯示到哪一頁就檢索並綁定哪一頁的數據。顯然在大數據量的情況下,數據庫分頁的效率會高很多。
關於分頁方法
         很多人寫分頁的方法喜歡創建臨時表,雖然這是一個快捷的實現方法,但這樣做效率肯定很低,其實在SQL Server和Oracle中分別使用Top和ROWNUM可以很方便的使用排序,充分利用數據庫服務器來做計算可以降低web服務的負擔。

SQL Server的分頁代碼:
SelectByPage
 1SET QUOTED_IDENTIFIER ON
 2GO
 3SET ANSI_NULLS ON
 4GO
 5
 6
 7
 8ALTER    proc SelectByPage(@startRowIndex int,@maximumRows int,@SortBy varchar(50))
 9as
10declare @TotalCnt int
11declare @sql varchar(8000)
12begin
13select @TotalCnt = count(*) from sys_user
14
15set @sql = 'select top ' + convert(varchar(20),@maximumRows) + ' * from '
16set @sql = @sql + '('
17set @sql = @sql + '  select top ' + convert(varchar(20),(@TotalCnt-@startRowIndex)) + ' * from sys_user a '
18set @sql = @sql + '  order by a.' + @SortBy + ' desc '
19set @sql = @sql + ') b'
20set @sql = @sql + ' order by b.' + @SortBy
21exec(@sql)
22--print @sql
23end
24
25
26
27GO
28SET QUOTED_IDENTIFIER OFF
29GO
30SET ANSI_NULLS ON
31GO
32
33

Oracle中的分頁方法:
select_by_page
 1/**//* Formatted on 2007/04/16 11:16 (Formatter Plus v4.8.8) */
 2CREATE OR REPLACE PROCEDURE diswebuser.select_by_page (
 3   p_start_page   NUMBER,
 4   p_page_size    NUMBER,
 5   p_sort_by      VARCHAR2
 6)
 7AS
 8   v_cnt           INTEGER;
 9   v_sql           VARCHAR2 (4000);
10   v_start_index   INTEGER;
11   v_end_index 

  INTEGER;
12BEGIN
13   SELECT COUNT (*)
14     INTO v_cnt
15     FROM side_slope;
16
17   --v_start_index := (p_start_page - 1) * p_page_size + 1;
18   v_start_index := p_start_page + 1;
19   v_end_index := p_start_page + p_page_size;
20   v_sql := v_sql || 'SELECT   * ';
21   v_sql := v_sql || '    FROM (SELECT   ROWNUM AS row_id, a.* ';
22   v_sql := v_sql || '              FROM side_slope a ';
23   v_sql := v_sql || '          ORDER BY side_slope_id) ';
24   v_sql :=
25         v_sql
26      || '   WHERE row_id BETWEEN '
27      || TO_CHAR (v_start_index)
28      || ' AND '
29      || TO_CHAR (v_end_index)
30      || '  ';
31   v_sql := v_sql || 'ORDER BY side_slope_id ';
32   DBMS_OUTPUT.put_line (v_sql);
33END;
34/

當然在Oracle存儲中返回結構集要使用ref cursor,使用Oracle的朋友一定很清楚,我在這裡就不羅嗦了,那樣寫還得創建包,麻煩^_^,上面只是打印出了sql語句。
還望高手指點

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