ASP.NET和MSSQL高性能分頁

来源:http://www.cnblogs.com/shouce/archive/2016/01/11/5120105.html
-Advertisement-
Play Games

首先是存儲過程,只取出我需要的那段數據,如果頁數超過數據總數,自動返回最後一頁的紀錄:set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Clear...


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

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Clear
-- Description: 高性能分頁
-- http://www.cnblogs.com/roucheng/
-- =============================================
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
        BEGIN
            IF @Cursor > @MaxPageSize
                Set @Cursor = @Count - @MaxPageSize + 1
            ELSE
                Set @Cursor = 1
        END
-- 否則返回最後一頁剩下的紀錄
        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代碼方法):

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);
//生成中間頁 http://www.cnblogs.com/roucheng/
        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(...);
    }

  調用方法:

//得到分頁設置並放入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));
        }
        TagBox.InnerHtml = Tag.GetHtml;

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • OK!第一篇博文!自賀一下!今日看了此書的前幾頁。嗯,說得挺全,基礎易懂。之前學過c++,但沒用過命令行編譯。本人用的VS里的編譯器,文件名是cl.exe,在VC目錄下。雖然有了編譯器,但並不能直接使用,要配置環境變數。寫個批處理文件,在裡面寫環境變數設置的代碼就行了,如下:@set PATH=D....
  • 直接使用JDBC一個非常普遍的問題是動態SQL。使用參數值、參數本身和數據列都是動態的SQL,通常非常困難。典型的解決方法是,使用一系列if-else條件語句和一連串討厭的字元串連接。對於這個問題,SQLMapAPI使用和mappedstatement非常相似的結構,提供了較為優雅的方法。這裡是一個...
  • 提要16 讀取轉換流17 寫入轉換流18 流操作規律-119 流操作規律-220 改變標準輸入輸出設備21 異常的日誌信息22 系統信息16 讀取轉換流字元流體系中的InputStreamReader,是位元組流通向字元流的橋梁:它使用指定的charset讀取位元組並將其解碼為字元。它使用的字元集可以由...
  • 問題描述 若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為迴文數。 例如:給定一個10進位數56,將56加65(即把56從右向左讀),得到121是一個迴文數。 又如:對於10進位數87: STEP1:87+78 = 165 STEP2:165+561 = 726 STE...
  • Jdk:Java程式設計語言、Java虛擬機、Java API類庫。Jdk是用於支持Java程式開發的最小環境。Jre:Java API類庫中的Java SE API子集、Java虛擬機。Jre是支持Java程式運行的標準環境。Program Counter Register:較小的記憶體空間,可以看...
  • dt.ToString();//2005-11-5 13:47:04 dt.AddYears(1).ToString();//2006-11-5 13:47:04 dt.AddDays(1.1).ToString();//2005-11-6 16:11:04 dt.AddHours(1.1).ToS...
  • 2:Set集合(理解) (1)Set集合的特點 無序,唯一 (2)HashSet集合(掌握) A:底層數據結構是哈希表(是一個元素為鏈表的數組) B:哈希表底層依賴兩個方法:hashCode()和equals() 執行順序: 首先比較哈希值是否相同 相同:繼續執行equals()方法 返回true:...
  • 原文:http://www.cnblogs.com/FreeDong/archive/2013/07/31/3227638.html一、委托調用方式1. 最原始版本:delegate string PlusStringHandle(string x, string y);class Program{...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...