SQL分頁的儲存過程詳解

2021-04-12 12:43:54 字數 2592 閱讀 2733

asp.net中的datagrid有內建分頁功能,   但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁,   這種只選取了一小部分而丟掉大部分的方法是不可去取的.  

在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大,所以必須分頁顯示,並且不能用datagrid的內建分頁功能,於是自己實現分頁.   下面介紹一下我在專案中用到的分頁方法.  

當然顯示控制項還是用datagrid的,   因為資料繫結很方便^_^.    

要保證不傳輸冗餘的資料,那麼必須在資料庫中資料讀取時實現分頁,   資料庫的分頁操作可以放在儲存過程中.   看了csdn的一篇blog中講了乙個百萬級資料分頁的儲存過程的實現(http://blog.csdn.net/wellknow/posts/55167.aspx,他的這個方法可以根據不同情況進行適當的優化),   根據他的方法,這裡實現乙個簡單的sql語句來實現這裡分頁需要的儲存過程。  

create   procedure   listproduct  

(  

@pageindex   int,   --   分頁後需要頁的序號  

@pagesize   int,   --   一頁的大小  

@conditionsql   –   查詢條件的sql語句  

)  

具體的sql語句如下:  

select   top   100   *   from   (select   *   from   product   where   productid<200000)   t   where   t.productid   not   in    

(select   top   900   productid   from   (select   productid   from   product   where   productid<200000)   t1   order   by   t1.productid   asc)   order   by   productid   asc    

這條語句的   從總的商品(30萬)中取出productid<200000(共20萬),再按每頁100的大小分頁,然後取出第10頁.  

public   datatable   listproduct(int   pageindex,   int   pagesize)  

用上面的儲存過程讀出的資料在datagrid裡面分頁,   必須把datagrid的allowpaging和allowcustompaging設定為true  

protected   system.web.ui.webcontrols.datagrid   productgrid;  

productgrid.allowpaging   =   true;  

productgrid.allowcustompaging   =   true;  

然後在設定要顯示的一頁的大小  

productgrid.pagesize   =   100;   //   在顯示的時候依據實際的資料顯示。  

設定一頁大小後,如果要讓datagrid實際分出頁數來,還必須設定  

productgrid.virtualitemcount   =   getproductcount()   ;   //   getproductcount()   的功能是獲取滿足條件的產品數目,   這裡的條件就是productid<200000.   設定這項屬性後,那麼這個datagrid的頁數就是  

virtualitemcount/pagesize,   也就是pagecount的值.   不能對pagecount直接賦值,因為他是唯讀的屬性.  

這些屬性設定好後再繫結資料:  

productgrid.datasource   =   listproduct(1,   productgrid.pagesize);   //   在page_load裡面   pageindex為1,記住判斷ispostback,在ispostback為false時執行這些**  

productgrid.databind();  

這樣資料繫結後就可以看到具有分頁模樣的頁面了.但是還不能真正的分頁.要實現真正的分頁,還必須實現下面的功能.  

處理datagrid的pageindexchanged事件(處理使用者新選中某頁時的事件)  

private   void   productgrid_pageindexchanged(object   source,   system.web.ui.webcontrols.datagridpagechangedeventargs   e)  

如果你處理了datagrid的itemcommand的事件的話,必須在itemcommand事件處理**前面加上這些**:  

if   (e.item.itemtype   ==   listitemtype.pager)  

因為當pageindexchanged事件激發,也就是使用者選則了另外一頁時會先激發itemcommand事件,如果不這樣處理的話,可能會遇到一些意想不到的情況(如果你確實需要的話也可以上面這段**,不過最好實際測試一下)。  

整個過程完成後,再次瀏覽頁面,覺得速度真是快多了。 

SQL分頁的儲存過程詳解

asp.net中的datagrid有內建分頁功能,但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁,這種只選取了一小部分而丟掉大部分的方法是不可去取的.在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大...

SQL分頁的儲存過程詳解

asp.net中的datagrid有內建分頁功能,但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁,這種只選取了一小部分而丟掉大部分的方法是不可去取的.在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大...

SQL分頁的儲存過程詳解

asp.net中的datagrid有內建分頁功能,但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁,這種只選取了一小部分而丟掉大部分的方法是不可去取的.在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大...