• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • DataGrid連接Access的快速分頁法(1)——需求與現狀

    發表于:2007-06-30來源:作者:點擊數: 標簽:
    DataGrid連接Access的快速分頁法(1)——需求與現狀 一、需求分析 DataGrid是一個功能強大的ASP.NET Web 服務器 端控件,它除了能夠按各種方式格式化顯示數據,還可以對數據進行動態的排序、編輯和分頁。大大減輕了廣大Web 程序員 的工作量。實現DataGrid的
    DataGrid連接Aclearcase/" target="_blank" >ccess的快速分頁法(1)——需求與現狀
    一、需求分析
    DataGrid是一個功能強大的ASP.NET Web服務器端控件,它除了能夠按各種方式格式化顯示數據,還可以對數據進行動態的排序、編輯和分頁。大大減輕了廣大Web程序員的工作量。實現DataGrid的分頁功能一直是很多入門者感到棘手的問題,特別是自定義分頁功能,實現的方法多種多樣,非常靈活。

    目前大家公認性能最好的應該數SQL Sever結合存儲過程的解決方案。因為在SQL Server的存儲過程里面可以使用游標(Cursor)來遍歷數據庫表中所有的行,結合一個計數器變量就可以快速定位到數據庫表中的某一行了。但是在采用Access數據庫的ASP.NET應用程序中,一直沒有一種較好的解決方案。

    我們知道,在ASP中可以使用ADO的游標來快速定位當前頁面的數據在數據庫表中的位置??墒茿DO.NET中沒有游標這個東西,所以傳統的DataGrid分頁方法都是用諸如“SELECT * FROM Item”的SQL語句從數據庫表中取出所有的記錄,然后DataGrid的自動分頁功能會幫你顯示相應分頁的數據。
    二、目前的解決方案
    很多人已經意識到了上面描述的問題,并提出了解決方法,即采用自定義分頁,每次從數據庫表中取出要顯示的數據。那么,怎樣取呢?答案就我知道的大概有5種以上吧。使用不同的算法,將會得到不同的效率。經過我粗略的測試,最慢的算法耗費的時間大概是最快的3倍!而且這個數字會隨著記錄總數的增加而增加。

    為了方便接下來的討論,在展示 SQL 語句之前,首先讓我們做如下約定:

    PageIndex ItemId
    ProductId
    Price
    0
    001
    0011
    $12

    002
    0011
    $13

    003
    0011
    $12

    1
    004
    0012
    $13

    005
    0012
    $11

    006
    0012
    $14

    2
    007
    0013
    $14

    008
    0013
    $12

    009
    0014
    $13

    3
    010
    0011
    $13

    011
    0012
    $15

    012
    0014
    $16

    4
    013
    0013
    $12

    014
    0013
    $13



    變量 用途
    @PageSize 每頁顯示的記錄總數
    @PageCount 分頁總數
    @RecordCount 數據表的記錄總數
    @PageIndex 當前頁的索引
    @FirstIndex 第一頁的索引
    @MiddleIndex 中間頁的索引
    @LastIndex 最后一頁的索引
    @TableName 數據庫表名稱
    @PrimaryKey 主鍵字段名稱
    @QueryFields 要查詢的字段集
    @Condition 篩選條件


    定義:
    @PageCount = (int)Math.Ceiling((double)@RecordCount / @PageSize)
    @FirstIndex = 0
    @LastIndex = @PageCount - 1
    @MiddleIndex = (int)Math.Ceiling((double)@PageCount / 2) – 1

    預設:
    @PageSize = 2
    @RecordCount = 9
    @PageCount = 4

    現在先讓我們來看看速度最慢的 SQL 語句:

    SELECT TOP @PageSize * FROM @TableName AS a
    WHERE @PrimaryKey NOT IN (
    SELECT TOP @PageSize*@PageIndex @PrimaryKey FROM @TableName AS b
    ORDER BY @PrimaryKey
    )
    ORDER BY @PrimaryKey

    這條語句慢就慢在 NOT IN 這里,主 SELECT 語句遍歷的每個 @PrimaryKey 的值都要跟子 SELECT 語句的結果集中的每一個 @PrimaryKey 的值進行比較,這樣時間復雜度非常大。其實我們平時編寫 SQL 語句的時候應該盡量避免用 NOT IN 語句,因為它往往會提高整個 SQL 語句的時間復雜度。

    還有一種是用兩個 TOP 的 SQL 語句,如下所示:

    SELECT * FROM (
    SELECT TOP @PageSize * FROM (
    SELECT TOP @PageSize*(@PageIndex+1) * FROM @TableName
    ORDER BY @PrimaryKey
    ) TableA
    ORDER BY @PrimaryKey DESC
    ) TableB
    ORDER BY @PrimaryKey

    這條 SQL 語句空間復雜度比較大。如果要顯示的分頁面剛好是最后一頁,那么它的效率比直接SELECT 出所有的記錄還要低。

    下一篇將詳細介紹一種最快的算法,并根據不同情況,采用不同的變形來有效的提高查詢效率。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>