存儲過程學習(二)

AspNetPager高效分頁

如下是首頁添加了aspnetpager的代碼:
<webdiyer:AspNetPager ID="PagerUserService" runat="server" AlwaysShow="True" 
                            CustomInfoHTML="共[%RecordCount%]條,[%CurrentPageIndex%] / [%PageCount%]頁"
                            FirstPageText="[ 首頁 ]" LastPageText="[ 末頁 ]" NextPageText="[ 下一頁 ]" NumericButtonCount="15"
                            PageSize="50" PrevPageText="[ 上一頁 ]" CustomInfoTextAlign="Left" ShowCustomInfoSection="Left"
                            Direction="LeftToRight" Width="100%" InvalidPageIndexErrorMessage="你確定你輸入的是數字?!"
                            PageIndexOutOfRangeErrorMessage="沒這麼多頁o(∩_∩)o 哈哈.." SubmitButtonText="轉到" CssClass="pageStyle"
                            HorizontalAlign="Right" OnPageChanged="PagerUserService_PageChanged" CustomInfoSectionWidth="20%">
                        </webdiyer:AspNetPager>

後臺通過調用存儲過程,對repeater控件進行數據綁定,並用aspnetpager進行分頁,如下函數LoadData()便是對repeater控件和aspnetpager控件的數據綁定:
 private void LoadData()
{
//實例化用來作爲參數對象的DataTogther類
            Model.DataTogther ModelTo = new CRM.Model.DataTogther();
            ModelTo.TableName = " T_UserInfo ";           //指定表名
            ModelTo.PageSize = PagerUserService.PageSize; //指定分頁尺寸
            ModelTo.PageIndex = PagerUserService.CurrentPageIndex; //當前頁尺寸
            ModelTo.PrimaryKey = " T_UserID ";            //主鍵ID號
            ModelTo.SortType = 3;                         //排序類型
            //排序中一定要包含主鍵 否則報錯“無法找到表0”
            ModelTo.Order = " T_DateTime DESC,T_UserID DESC ";
            ModelTo.FieldList = " T_UserID,T_Person,T_CompanyName,T_DateTime," +
                                "T_UserType,T_UserLeave,T_UserFrom,T_UserState,T_NowService ";
            ModelTo.Where = GetWhere();                   //獲取查詢條件
            ModelTo.RecorderCount = 0;                    //初始化記錄條數
            int RecordCount=0;
            //指定Repeater的數據源
            RpUserService.DataSource = BLL.SysBase.GetDataList(ModelTo, out RecordCount);
            RpUserService.DataBind();                   //執行數據綁定
            PagerUserService.RecordCount = RecordCount; //指定AspNetPager的記錄行數
}

該函數裏面的BLL.SysBase.GetDataList方法便是調用了存儲過程,進行數據綁定和分頁效果。該存儲過程如下:



ALTER PROCEDURE [dbo].[DataPageList]
@TableName VARCHAR(200),     --表名    
@FieldList VARCHAR(2000),    --顯示列名,如果是全部字段則爲*   
@PrimaryKey VARCHAR(100),    --單一主鍵或唯一值鍵    
@Where VARCHAR(1000),        --查詢條件 不含'where'字符,如id>10 and len(userid)>9    
@Order VARCHAR(100),        --排序 不含'order by'字符,如id asc,userid desc,必須指定asc或desc --注意當@SortType=3時生效,記住一定要在最後加上主鍵    
@SortType INT,               --排序規則 1:正序asc 2:倒序desc 3:多列排序方法    
@RecorderCount INT,          --記錄總數 0:會返回總記錄    
@PageSize INT,               --每頁輸出的記錄數    
@PageIndex INT,              --當前頁數    
@TotalCount INT OUTPUT      --記返回總記錄 
AS       
IF ISNULL(@TotalCount,'') = '' 
SET @TotalCount = 0    
SET @Order = RTRIM(LTRIM(@Order))    
SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))    
SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','')    
WHILE CHARINDEX(', ',@Order) > 0 OR CHARINDEX(' ,',@Order) > 0    
BEGIN        
SET @Order = REPLACE(@Order,', ',',')        
SET @Order = REPLACE(@Order,' ,',',')        
END    
IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''OR ISNULL(@PrimaryKey,'') = ''
OR @SortType < 1 OR @SortType >3 OR @RecorderCount  < 0 OR @PageSize < 0 OR @PageIndex < 0            
BEGIN                 
RETURN  
END        
IF @SortType = 3    
BEGIN        
IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC')        
BEGIN 
RETURN
END    
END    
DECLARE @new_where1 VARCHAR(1000)    
DECLARE @new_where2 VARCHAR(1000)    
DECLARE @new_order1 VARCHAR(1000)       
DECLARE @new_order2 VARCHAR(1000)    
DECLARE @new_order3 VARCHAR(1000)    
DECLARE @Sql VARCHAR(8000)    
DECLARE @SqlCount NVARCHAR(4000)    
IF ISNULL(@where,'') = ''        
BEGIN            
SET @new_where1 = ' '            
SET @new_where2 = ' WHERE  '        
END    
ELSE        
BEGIN            
SET @new_where1 = ' WHERE ' + @where             
SET @new_where2 = ' WHERE ' + @where + ' AND '        
END    
IF ISNULL(@order,'') = '' OR @SortType = 1  OR @SortType = 2         
BEGIN            
IF @SortType = 1             
BEGIN                 
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC'                
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC'            
END            
IF @SortType = 2            
BEGIN                 
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC'                
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC'            
END        
END    
ELSE        
BEGIN            
SET @new_order1 = ' ORDER BY ' + @Order        
END    
IF @SortType = 3 AND  CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0        
BEGIN            
SET @new_order1 = ' ORDER BY ' + @Order            
SET @new_order2 = @Order + ','                        
SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')                        
SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')            
SET @new_order2 = ' ORDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)                        
IF @FieldList <> '*'                
BEGIN                                
SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')                                                  
SET @FieldList = ',' + @FieldList                                        
WHILE CHARINDEX(',',@new_order3)>0                    
BEGIN                        
IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0                        
BEGIN                         
SET @FieldList =@FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))                                                
END                        
SET @new_order3 =SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))                    
END                    
SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))                                     
END                    
END    
SET @SqlCount = 'SELECT @TotalCount=COUNT(*) FROM ' + @TableName + @new_where1        
IF @RecorderCount  = 0        
BEGIN             
EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT', @TotalCount OUTPUT      
END   
ELSE        
BEGIN             
SELECT @TotalCount = @RecorderCount                    
END    
IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)        
BEGIN            
SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)        
END    
IF @PageIndex = 1 OR @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)        
BEGIN            
IF @PageIndex = 1 --返回第一頁數據                
BEGIN                    
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' + @TableName + @new_where1 + @new_order1                
END            
IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最後一頁數據                
BEGIN                    
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM ('+ 'SELECT TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))+ ' ' + @FieldList + 
' FROM '+ @TableName + @new_where1 + @new_order2 + ' ) AS TMP '+ @new_order1 
END                
END        
ELSE        
BEGIN            
IF @SortType = 1  --僅主鍵正序排序                
BEGIN                    
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向檢索                        
BEGIN                            
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM '+ @TableName + @new_where2 + @PrimaryKey + ' > '+ '(SELECT MAX(' + @PrimaryKey + ') 
FROM (SELECT TOP '+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey+ 
' FROM ' + @TableName                                       + @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1  
END                    
ELSE  --反向檢索                        
BEGIN                            
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM ('+ 'SELECT TOP ' + STR(@PageSize) + ' '+ @FieldList + 
' FROM '+ @TableName + @new_where2 + @PrimaryKey + ' < '+ '(SELECT MIN(' + @PrimaryKey + ') 
FROM (SELECT TOP '+ STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey + 
' FROM ' + @TableName                                       + @new_where1 + @new_order2 +' ) AS TMP) 
'+ @new_order2+ ' ) AS TMP ' + @new_order1
END                
END            
IF @SortType = 2  --僅主鍵反序排序               
 BEGIN                    
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向檢索                        
BEGIN                            
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM '+ @TableName + @new_where2 + @PrimaryKey + ' < '+ '(SELECT MIN(' + @PrimaryKey + ') 
FROM (SELECT TOP '+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey +
' FROM '+ @TableName+ @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1                                                       
END                     
ELSE  --反向檢索                        
BEGIN                            
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM ('+ 'SELECT TOP ' + STR(@PageSize) + ' '+ @FieldList + 
' FROM '+ @TableName + @new_where2 + @PrimaryKey + ' > '+ '(SELECT MAX(' + @PrimaryKey + ') 
FROM (SELECT TOP '+ STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey+ 
' FROM ' + @TableName+ @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2+ ' ) AS TMP ' + @new_order1                        
END                  
END                                     
IF @SortType = 3  --多列排序,必須包含主鍵,且放置最後,否則不處理                
BEGIN                    
IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0                     
BEGIN PRINT('ERR_02') RETURN END                    
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向檢索                        
BEGIN                            
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' 
FROM ( '+ 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM ( '+ ' SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList+ 
' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '+ @new_order2 + ' ) AS TMP ' + @new_order1                            
END                    
ELSE  --反向檢索                        
BEGIN                            
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM ( '+ 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + 
' FROM ( '+ ' SELECT TOP ' + STR(@TotalCount-@PageSize*@PageIndex+@PageSize) + ' ' + @FieldList+ 
' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '+ @new_order1 + ' ) AS TMP ' + @new_order1                        
END                
END        
END    
EXEC(@Sql)

效果如下如所示:



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