千萬級數據分頁詳細設計

1.1目的
爲適應大數據量分頁的需要,爲以後千萬級數據分頁提供解決方法或者參考,節省開發時間,特制定本詳細設計方案
1.2主要閱讀對象
腳本設計人員
1.3參考資料
2.1分頁存儲過程
2.1.1簡介
2.1.2分頁存儲過程代碼
以下代碼是網上找的分頁存儲過程,我是在原存儲過程的基礎上加了一個@IsCount bit = 0, 主要是用來返回紀錄總數,當爲非0值時返回。下面註釋部分是原作者的測試部分。我在本機sql server 2005上的測試是在10000011紀錄中查詢第100000頁,每頁10條紀錄按升序和降序時間均爲0.38秒,測試語法如下:exec GetRecordFromPage tbl_Briefness,I_BriefnessID,10,100000,其中在tbl_BriefnessI_BriefnessID字段上建立了索引。
/*
  經測試,在14483461 條記錄中查詢第100000 頁,每頁10 條記錄按升序和降序第一次時間均爲0.47 秒,第二次時間均爲0.43 秒,測試語法如下:
  exec GetRecordFromPage news,newsid,10,100000
  news 爲表名, newsid 爲關鍵字段, 使用時請先對newsid 建立索引。

  函數名稱: GetRecordFromPage
  函數功能: 獲取指定頁的數據
  參數說明: @tblName      包含數據的表名
           @fldName      關鍵字段名
           @PageSize     每頁記錄數
           @PageIndex    要獲取的頁碼
           @OrderType    排序類型, 0 - 升序, 1 - 降序
           @strWhere     查詢條件(注意: 不要加where)
  創建時間: 2004-07-04
  修改時間: 2008-02-13
*/

ALTER PROCEDURE [dbo].[GetRecordFromPage]
    
@tblName      varchar(255),       -- 表名
    @fldName      varchar(255),       -- 字段名
    @PageSize     int = 10,           -- 頁尺寸
    @PageIndex    int = 1,            -- 頁碼
    @OrderType    bit = 0,            -- 設置排序類型, 非0 值則降序
    @IsCount bit = 0-- 返回記錄總數, 非0 值則返回
    @strWhere     varchar(2000= ''  -- 查詢條件(注意: 不要加where)
    
AS

declare @strSQL   varchar(6000)       -- 主語句
declare @strTmp   varchar(1000)       -- 臨時變量
declare @strOrder varchar(500)        -- 排序類型

if @OrderType != 0
begin
    
set @strTmp = '<(select min'
    
set @strOrder = ' order by [' + @fldName + '] desc'
end
else
begin
    
set @strTmp = '>(select max'
    
set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize+ ' * from ['
    
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
    
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['
    
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
    
+ @strOrder

if @strWhere != ''
    
set @strSQL = 'select top ' + str(@PageSize+ ' * from ['
        
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['
        
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
        
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
    
set @strTmp = ''
    
if @strWhere != ''
        
set @strTmp = ' where (' + @strWhere + ')'

    
set @strSQL = 'select top ' + str(@PageSize+ ' * from ['
        
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end
if @IsCount != 0 
set @strSQL = 'select count(' + @fldName + ') as Total from [' + @tblName + ']' 
exec (@strSQL)
 
2.2分頁控件的實現
2.2.1分頁控件的詳細代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
    [ToolboxData(
"<{0}:AspNetPager runat='server' PageSize='25' FirstPageText='首頁' PrePageText='上一頁' NextPageText='下一頁' EndPageText='末頁' ButtonText='GO'></{0}:AspNetPager>")]
    
public class AspNetPager : WebControl, INamingContainer
    
{
        
屬性塊

        
分頁事件相關

        
樣式屬性

        
自定義視圖狀態

        
生成控件

        
按鈕點擊事件

        
重寫TagKey

        
繪製控件
    }

}

2.3千萬級數據分頁實現

2.3.1簡介

這次分頁我是用Gridview來實現的,測試時間沒算,但基本上從10000011紀錄中一次查詢25條紀錄,在10萬頁以內,時間花費 1秒以內。使用其他控件比如DataGridDataList或者DataReapter應該花費的時間更短。

2.3.2適用對象

服務器端控件GridviewDataGridDataListDataReapter等數據綁定控件

2.3.3分頁實現

分頁效果圖如下:

 

前臺代碼如下:

後臺代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Demo.aspx.cs" Inherits="Demo" %>

<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="cc2" %>

<%@ Register Assembly="MyLabel" Namespace="MyLabel" TagPrefix="cc1" %>




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>無標題頁</title>
     
<link type="text/css" rel="stylesheet" href="css/comm.css" /> 
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
&nbsp;&nbsp;
       
<asp:GridView ID="GridView1" runat="server"  AllowPaging="false" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" PagerSettings-Visible="false"
                    Width
="50%" height="35"   OnRowCommand="GridView1_RowCommand" DataKeyNames="I_BriefnessID">
         
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                    
<RowStyle BackColor="#EFF3FB" />
                    
<EditRowStyle BackColor="#2461BF" />
                    
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />  
                    
<PagerStyle ForeColor="White" VerticalAlign="Top" BackColor="Transparent"  />                 
                    
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                    
<AlternatingRowStyle BackColor="White" />
                    
<Columns>
                        
<asp:TemplateField HeaderText="序號">
                            
<ItemTemplate>
                                
<%# Container.DataItemIndex+1 %>
                            
</ItemTemplate>
                        
</asp:TemplateField>
                        
<asp:BoundField DataField="I_BriefnessID" HeaderText="ID" />
                        
<asp:BoundField DataField="I_KMID" HeaderText="科目" />
                        
<asp:BoundField DataField="C_Recno" HeaderText="試題號" />         
                        
<asp:BoundField DataField="M_Title" HeaderText="題面" />
                        
<asp:BoundField DataField="C_Answer" HeaderText="答案" />  
                          
<asp:TemplateField HeaderText="刪除">
                            
<ItemTemplate>                                 
                                   
<asp:LinkButton ID="LinkButton1"  OnClientClick="return confirm('確定要刪除?');" runat="server"
                                    CausesValidation
="False" CommandName="DeleteData"  CommandArgument='<%#DataBinder.Eval(Container.DataItem,"I_BriefnessID").ToString()%>' Text="刪除" ></asp:LinkButton>
                            
</ItemTemplate>
                        
</asp:TemplateField>
                    
</Columns>
        
</asp:GridView>
    
</div>
    
<div>
        
<cc2:AspNetPager ID="AspNetPager1" runat="server" ButtonText="GO" EndPageText="末頁"
            FirstPageText
="首頁" NextPageText="下一頁" PageSize="15" PrePageText="上一頁"  OnPageChanged="Page_Changed" Width="50%">
            
<ButtonStyle CssClass="btn1_mouseout" Width="30px" />
            
<TextBoxStyle Width="30px" CssClass="blue_rounded"/>
            
<LabelStyle ForeColor="red"  Font-Bold="true" />
        
</cc2:AspNetPager>
        
&nbsp;&nbsp;
        
</div>
    
</form>
</body>
</html>

 

 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;

public partial class Demo : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)
        
{
            TestDataCount();
            BindPaperDefineProgramme(
1);
        }

        
    }


    
綁定試卷定義方案列表

    
protected void Page_Changed(object sender, EventArgs e)
    
{
        BindPaperDefineProgramme(AspNetPager1.PageIndex);
    }


    
刪除紀錄

    
綁定試卷定義方案列表
}



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2244627


 
發佈了178 篇原創文章 · 獲贊 5 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章