国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用ObjectDataSource實(shí)現(xiàn)自定義分頁(yè)的心得總結(jié)

2019-11-18 16:35:36
字體:
供稿:網(wǎng)友

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

SQL Server的分頁(yè)代碼:
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中的分頁(yè)方法:
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/

當(dāng)然在Oracle存儲(chǔ)中返回結(jié)構(gòu)集要使用ref cursor,使用Oracle的朋友一定很清楚,我在這里就不羅嗦了,那樣寫還得創(chuàng)建包,麻煩^_^,上面只是打印出了sql語(yǔ)句。
還望高手指點(diǎn)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盐池县| 文昌市| 万宁市| 鄢陵县| 宜兰市| 兴化市| 淮南市| 黄平县| 如东县| 临潭县| 兖州市| 星子县| 濮阳市| 济源市| 祁阳县| 盐城市| 二手房| 高唐县| 德阳市| 新化县| 察雅县| 韶山市| 高台县| 肇源县| 佛冈县| 宁强县| 怀安县| 壶关县| 浙江省| 沙雅县| 油尖旺区| 新绛县| 中牟县| 上栗县| 海盐县| 通城县| 三门县| 福建省| 谷城县| 绥棱县| 鹤岗市|