首頁 後端開發 C#.Net教程 ASP.NET 高效能分頁程式碼

ASP.NET 高效能分頁程式碼

Jan 10, 2017 pm 01:57 PM

最近給分頁快搞死,記得之前曾經發過修改DW ASP分頁的方法,後來又寫過手工打造的ASP分頁,現在進入.NET當然要配合存儲過程打造純手工高性能分頁了. 

為什麼會叫做高效能,為什麼要手工打造,不使用.NET現有的分頁控制呢?這個還要追溯到我修改DW ASP分頁的時候,那個我還不怎麼懂程序這個東西,只會修修補補,就更不要去談什麼性能問題.當時改的很心煩,接著叫我的私人技術總監張總幫我看看,當時張總就以一種不屑一顧的眼神往著我,說了句話:值得嗎? 

接著到我手工打造ASP分頁,又搞不下去了,張總丟給我一堆.NET的代碼:自己研究吧.然後又丟了一句話:用.NET做吧,幾句話搞定,不用這個費神. 

後來我發現以前的分頁都是把整個資料集全部讀取後再做分頁處理的,一旦資料量過大,處理會十分緩慢,甚至伺服器崩潰.然後就是以前的分頁不能像遊標一樣滾動,總是固定在一組裡面,不可能實現當前頁碼在中間的效果. 

接著就要說.NET的分頁控件了,確實幾句話可以搞定,不過缺陷就是我發現的第一個問題,屬於把資料全部讀出再處理的那種,沒有效率,所以終於開始動手,純手工打造ASP.NET高性能分頁. 

首先是存儲過程,只取出我需要的那段資料,如果頁數超過資料總數,自動回傳最後一頁的紀錄: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: Clear

-- Create date: 2007-01-30

-- Description: 高性能分页

-- =============================================

Alter PROCEDURE [dbo].[Tag_Page_Name_Select]

-- 传入最大显示纪录数和当前页码

    @MaxPageSize int,

    @PageNum int,

-- 设置一个输出参数返回总纪录数供分页列表使用

    @Count int output

AS

BEGIN

    SET NOCOUNT ON;

 

   DECLARE

-- 定义排序名称参数

        @Name nvarchar(50),

-- 定义游标位置

        @Cursor int

-- 首先得到纪录总数

   Select @Count = count(tag_Name)

     FROM [viewdatabase0716].[dbo].[view_tag];

-- 定义游标需要开始的位置

    Set @Cursor = @MaxPageSize*(@PageNum-1)+1

-- 如果游标大于纪录总数将游标放到最后一页开始的位置

    IF @Cursor > @Count

    BEGIN

-- 如果最后一页与最大每次纪录数相等,返回最后整页

        IF @Count % @MaxPageSize = 0

            Set @Cursor = @Count - @MaxPageSize + 1

-- 否则返回最后一页剩下的纪录

        ELSE

            Set @Cursor = @Count - (@Count % @MaxPageSize) + 1

    END

-- 将指针指到该页开始

    Set Rowcount @Cursor

-- 得到纪录开始的位置

    Select @Name = tag_Name

     FROM [viewdatabase0716].[dbo].[view_tag]

    orDER BY tag_Name;

-- 设置开始位置

    Set Rowcount @MaxPageSize

-- 得到该页纪录

        Select * 

        From [viewdatabase0716].[dbo].[view_tag]

        Where tag_Name >= @Name

        order By tag_Name

 

    Set Rowcount 0

END

登入後複製

接著是分頁控制(... 為省略的產生HTML程式碼方法): 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Text;

 

/// <summary>

/// 扩展连接字符串

/// </summary>

public class ExStringBuilder

{

    private StringBuilder InsertString;

    private StringBuilder PageString;

    private int PrivatePageNum = 1;

    private int PrivateMaxPageSize = 25;

    private int PrivateMaxPages = 10;

    private int PrivateCount;

    private int PrivateAllPage;

    public ExStringBuilder()

    {

        InsertString = new StringBuilder("");

    }

    /// <summary>

    /// 得到生成的HTML

    /// </summary>

    public string GetHtml

    {

        get

        {

            return InsertString.ToString();

        }

    }

    /// <summary>

    /// 得到生成的分页HTML

    /// </summary>

    public string GetPageHtml

    {

        get

        {

            return PageString.ToString();

        }

    }

    /// <summary>

    /// 设置或获取目前页数

    /// </summary>

    public int PageNum

    {

        get

        {

            return PrivatePageNum;

        }

        set

        {

            if (value >= 1)

            {

                PrivatePageNum = value;

            }

        }

    }

    /// <summary>

    /// 设置或获取最大分页数

    /// </summary>

    public int MaxPageSize

    {

        get

        {

            return PrivateMaxPageSize;

        }

        set

        {

            if (value >= 1)

            {

                PrivateMaxPageSize = value;

            }

        }

    }

    /// <summary>

    /// 设置或获取每次显示最大页数

    /// </summary>

    public int MaxPages

    {

        get

        {

            return PrivateMaxPages;

        }

        set

        {

            PrivateMaxPages = value;

        }

    }

    /// <summary>

    /// 设置或获取数据总数

    /// </summary>

    public int DateCount

    {

        get

        {

            return PrivateCount;

        }

        set

        {

            PrivateCount = value;

        }

    }

    /// <summary>

    /// 获取数据总页数

    /// </summary>

    public int AllPage

    {

        get

        {

            return PrivateAllPage;

        }

    }

    /// <summary>

    /// 初始化分页

    /// </summary>

    public void Pagination()

    {

        PageString = new StringBuilder("");

//得到总页数

        PrivateAllPage = (int)Math.Ceiling((decimal)PrivateCount / (decimal)PrivateMaxPageSize);

//防止上标或下标越界

        if (PrivatePageNum > PrivateAllPage)

        {

            PrivatePageNum = PrivateAllPage;

        }

//滚动游标分页方式

        int LeftRange, RightRange, LeftStart, RightEnd;

        LeftRange = (PrivateMaxPages + 1) / 2-1;

        RightRange = (PrivateMaxPages + 1) / 2;

        if (PrivateMaxPages >= PrivateAllPage)

        {

            LeftStart = 1;

            RightEnd = PrivateAllPage;

        }

        else

        {

            if (PrivatePageNum <= LeftRange)

            {

                LeftStart = 1;

                RightEnd = LeftStart + PrivateMaxPages - 1;

            }

            else if (PrivateAllPage - PrivatePageNum < RightRange)

            {

                RightEnd = PrivateAllPage;

                LeftStart = RightEnd - PrivateMaxPages + 1;

            }

            else

            {

                LeftStart = PrivatePageNum - LeftRange;

                RightEnd = PrivatePageNum + RightRange;

            }

        }

 

//生成页码列表统计

        PageString.Append(...);

 

        StringBuilder PreviousString = new StringBuilder("");

//如果在第一页

        if (PrivatePageNum > 1)

        {

            ...

        }

        else

        {

            ...

        }

//如果在第一组分页

        if (PrivatePageNum > PrivateMaxPages)

        {

            ...

        }

        else

        {

            ...

        }

        PageString.Append(PreviousString);

//生成中间页

        for (int i = LeftStart; i <= RightEnd; i++)

        {

//为当前页时

            if (i == PrivatePageNum)

            {

                ...

            }

            else

            {

                ...

            }

        }

        StringBuilder LastString = new StringBuilder("");

//如果在最后一页

        if (PrivatePageNum < PrivateAllPage)

        {

            ...

        }

        else

        {

            ...

        }

//如果在最后一组

        if ((PrivatePageNum + PrivateMaxPages) < PrivateAllPage)

        {

            ...

        }

        else

        {

            ...

        }

        PageString.Append(LastString);

    }

    /// <summary>

    /// 生成Tag分类表格

    /// </summary>

    public void TagTable(ExDataRow myExDataRow)

    {

        InsertString.Append(...);

    }

登入後複製

呼叫方法: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

//得到分页设置并放入Session

        ExRequest myExRequest = new ExRequest();

        myExRequest.PageSession("Tag_", new string[] { "page", "size" });

//生成Tag分页

        ExStringBuilder Tag = new ExStringBuilder();

        //设置每次显示多少条纪录

        Tag.MaxPageSize = Convert.ToInt32(Session["Tag_size"]);

        //设置最多显示多少页码

        Tag.MaxPages = 9;

        //设置当前为第几页

        Tag.PageNum = Convert.ToInt32(Session["Tag_page"]);

        string[][] myNamenValue = new string[2][]{

            new string[]{"MaxPageSize","PageNum","Count"},

            new string[]{Tag.MaxPageSize.ToString(),Tag.PageNum.ToString()}

        };

//调用存储过程

        DataTable myDataTable = mySQL.BatchGetDB("Tag_Page_Name_Select", myNamenValue, "Count");

        Tag.DateCount = (int)mySQL.OutputCommand.Parameters["@Count"].Value;

        Tag.Pagination();

 

        HeadPage.InnerHtml = FootPage.InnerHtml = Tag.GetPageHtml;

 

        for (int i = 0, j = myDataTable.Rows.Count; i < j; i++)

        {

            Tag.TagTable(new ExDataRow(myDataTable.Rows[i]));

        }

        TagBox.InnerHtml = Tag.GetHtml;

登入後複製

處理頁碼到Session的方法就不提供了,沒有很大關.調用預存程序返回參數和紀錄的方法和之前我寫的批量數據操作方法差不多的,只需要定義一個輸出方式. 

目前我想這些代碼還會有瑕疵,等項目後期代碼審查的時候再強化吧,我想說的一點就是不要被那些拖來拖去的東西迷惑了,那樣對自己永遠都沒有提高,要抱著知其然,知其所以然的態度去做一件事,對自己的幫助才會明顯. 

更多ASP.NET 高效能分頁代碼相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

c語言編譯器怎麼加下一格 c語言編譯器怎麼加下一格 Mar 03, 2025 pm 05:44 PM

c語言編譯器怎麼加下一格

C語言中NULL的替代方案有哪些 C語言中NULL的替代方案有哪些 Mar 03, 2025 pm 05:37 PM

C語言中NULL的替代方案有哪些

c語言編譯器複製代碼方法 c語言編譯器複製代碼方法 Mar 03, 2025 pm 05:43 PM

c語言編譯器複製代碼方法

c語言編譯器哪個好? c語言編譯器哪個好? Mar 03, 2025 pm 05:39 PM

c語言編譯器哪個好?

c語言編譯器網頁版有哪些? c語言編譯器網頁版有哪些? Mar 03, 2025 pm 05:42 PM

c語言編譯器網頁版有哪些?

C語言中NULL在現代編程中還重要嗎 C語言中NULL在現代編程中還重要嗎 Mar 03, 2025 pm 05:35 PM

C語言中NULL在現代編程中還重要嗎

c語言在線編程網站 c語言編譯器官方網站匯總 c語言在線編程網站 c語言編譯器官方網站匯總 Mar 03, 2025 pm 05:41 PM

c語言在線編程網站 c語言編譯器官方網站匯總

c語言編譯器安裝教程(電腦版) c語言編譯器安裝教程(電腦版) Mar 03, 2025 pm 05:41 PM

c語言編譯器安裝教程(電腦版)

See all articles