asp.net SQL Server 存储过程分页及代码调用

分类: C#.NET编程 103人阅读 评论(0) 收藏 举报
1、创建存储过程,语句如下:

  1. CREATE PROC P_viewPage  
  2.     @TableName VARCHAR(200),     --表名  
  3.     @FieldList VARCHAR(2000),    --显示列名,如果是全部字段则为*  
  4.     @PrimaryKey VARCHAR(100),    --单一主键或唯一值键  
  5.     @Where VARCHAR(2000),        --查询条件 不含'where'字符,如id>10 and len(userid)>9  
  6.     @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc                                   
  7.                                                             --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷  
  8.     @SortType INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序方法  
  9.     @RecorderCount INT,          --记录总数 0:会返回总记录  
  10.     @PageSize INT,               --每页输出的记录数  
  11.     @PageIndex INT,              --当前页数  
  12.     @TotalCount INT OUTPUT,      --记返回总记录  
  13.     @TotalPageCount INT OUTPUT   --返回总页数  
  14. AS  
  15.     SET NOCOUNT ON  
  16.   
  17.   
  18.     IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0  
  19.     SET @Order = RTRIM(LTRIM(@Order))  
  20.     SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))  
  21.     SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','')  
  22.   
  23.   
  24.     WHILE CHARINDEX(', ',@Order) > 0 OR CHARINDEX(' ,',@Order) > 0  
  25.     BEGIN  
  26.         SET @Order = REPLACE(@Order,', ',',')  
  27.         SET @Order = REPLACE(@Order,' ,',',')      
  28.     END  
  29.   
  30.   
  31.     IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''   
  32.         OR ISNULL(@PrimaryKey,'') = ''  
  33.         OR @SortType < 1 OR @SortType >3  
  34.         OR @RecorderCount  < 0 OR @PageSize < 0 OR @PageIndex < 0          
  35.     BEGIN   
  36.         PRINT('ERR_00')         
  37.         RETURN  
  38.     END      
  39.   
  40.   
  41.     IF @SortType = 3  
  42.     BEGIN  
  43.         IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC')  
  44.         BEGIN PRINT('ERR_02'RETURN END  
  45.     END  
  46.   
  47.   
  48.     DECLARE @new_where1 VARCHAR(1000)  
  49.     DECLARE @new_where2 VARCHAR(1000)  
  50.     DECLARE @new_order1 VARCHAR(1000)     
  51.     DECLARE @new_order2 VARCHAR(1000)  
  52.     DECLARE @new_order3 VARCHAR(1000)  
  53.     DECLARE @Sql VARCHAR(8000)  
  54.     DECLARE @SqlCount NVARCHAR(4000)  
  55.   
  56.   
  57.     IF ISNULL(@where,'') = ''  
  58.         BEGIN  
  59.             SET @new_where1 = ' '  
  60.             SET @new_where2 = ' WHERE  '  
  61.         END  
  62.     ELSE  
  63.         BEGIN  
  64.             SET @new_where1 = ' WHERE ' + @where   
  65.             SET @new_where2 = ' WHERE ' + @where + ' AND '  
  66.         END  
  67.   
  68.   
  69.     IF ISNULL(@order,'') = '' OR @SortType = 1  OR @SortType = 2   
  70.         BEGIN  
  71.             IF @SortType = 1   
  72.             BEGIN   
  73.                 SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC'  
  74.                 SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC'  
  75.             END  
  76.             IF @SortType = 2   
  77.             BEGIN   
  78.                 SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC'  
  79.                 SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC'  
  80.             END  
  81.         END  
  82.     ELSE  
  83.         BEGIN  
  84.             SET @new_order1 = ' ORDER BY ' + @Order  
  85.         END  
  86.   
  87.   
  88.     IF @SortType = 3 AND  CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0  
  89.         BEGIN  
  90.             SET @new_order1 = ' ORDER BY ' + @Order  
  91.             SET @new_order2 = @Order + ','              
  92.             SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')              
  93.             SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')  
  94.             SET @new_order2 = ' ORDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)              
  95.             IF @FieldList <> '*'  
  96.                 BEGIN              
  97.                     SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')                                
  98.                     SET @FieldList = ',' + @FieldList                      
  99.                     WHILE CHARINDEX(',',@new_order3)>0  
  100.                     BEGIN  
  101.                         IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0  
  102.                         BEGIN   
  103.                         SET @FieldList =   
  104.                             @FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))                          
  105.                         END  
  106.                         SET @new_order3 =   
  107.                         SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))  
  108.                     END  
  109.                     SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))                       
  110.                 END              
  111.         END  
  112.   
  113.   
  114.     SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'  
  115.                     + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1  
  116.       
  117.     IF @RecorderCount  = 0  
  118.         BEGIN  
  119.              EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',  
  120.                                @TotalCount OUTPUT,@TotalPageCount OUTPUT  
  121.         END  
  122.     ELSE  
  123.         BEGIN  
  124.              SELECT @TotalCount = @RecorderCount              
  125.         END  
  126.   
  127.   
  128.     IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)  
  129.         BEGIN  
  130.             SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)  
  131.         END  
  132.   
  133.   
  134.     IF @PageIndex = 1 OR @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  
  135.         BEGIN  
  136.             IF @PageIndex = 1 --返回第一页数据  
  137.                 BEGIN  
  138.                     SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '   
  139.                                + @TableName + @new_where1 + @new_order1  
  140.                 END  
  141.             IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最后一页数据  
  142.                 BEGIN  
  143.                     SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('   
  144.                                + 'SELECT TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))   
  145.                                + ' ' + @FieldList + ' FROM '  
  146.                                + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '  
  147.                                + @new_order1                      
  148.                 END          
  149.         END      
  150.     ELSE  
  151.         BEGIN  
  152.             IF @SortType = 1  --仅主键正序排序  
  153.                 BEGIN  
  154.                     IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索  
  155.                         BEGIN  
  156.                             SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '   
  157.                                        + @TableName + @new_where2 + @PrimaryKey + ' > '  
  158.                                        + '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '  
  159.                                        + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey   
  160.                                        + ' FROM ' + @TableName  
  161.                                        + @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1  
  162.                         END  
  163.                     ELSE  --反向检索  
  164.                         BEGIN  
  165.                             SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('   
  166.                                        + 'SELECT TOP ' + STR(@PageSize) + ' '   
  167.                                        + @FieldList + ' FROM '  
  168.                                        + @TableName + @new_where2 + @PrimaryKey + ' < '  
  169.                                        + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '  
  170.                                        + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey   
  171.                                        + ' FROM ' + @TableName  
  172.                                        + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2   
  173.                                        + ' ) AS TMP ' + @new_order1  
  174.                         END  
  175.                 END  
  176.             IF @SortType = 2  --仅主键反序排序  
  177.                 BEGIN  
  178.                     IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索  
  179.                         BEGIN  
  180.                             SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '   
  181.                                        + @TableName + @new_where2 + @PrimaryKey + ' < '  
  182.                                        + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '  
  183.                                        + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey   
  184.                                        +' FROM '+ @TableName  
  185.                                        + @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1                                 
  186.                         END   
  187.                     ELSE  --反向检索  
  188.                         BEGIN  
  189.                             SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('   
  190.                                        + 'SELECT TOP ' + STR(@PageSize) + ' '   
  191.                                        + @FieldList + ' FROM '  
  192.                                        + @TableName + @new_where2 + @PrimaryKey + ' > '  
  193.                                        + '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '  
  194.                                        + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey   
  195.                                        + ' FROM ' + @TableName  
  196.                                        + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2   
  197.                                        + ' ) AS TMP ' + @new_order1  
  198.                         END    
  199.                 END                           
  200.             IF @SortType = 3  --多列排序,必须包含主键,且放置最后,否则不处理  
  201.                 BEGIN  
  202.                     IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0   
  203.                     BEGIN PRINT('ERR_02'RETURN END  
  204.                     IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索  
  205.                         BEGIN  
  206.                             SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '  
  207.                                        + 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '  
  208.                                        + ' SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList  
  209.                                        + ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '  
  210.                                        + @new_order2 + ' ) AS TMP ' + @new_order1      
  211.                         END  
  212.                     ELSE  --反向检索  
  213.                         BEGIN  
  214.                             SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '    
  215.                                        + 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '  
  216.                                        + ' SELECT TOP ' + STR(@TotalCount-@PageSize*@PageIndex+@PageSize) + ' ' + @FieldList  
  217.                                        + ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '  
  218.                                        + @new_order1 + ' ) AS TMP ' + @new_order1  
  219.                         END  
  220.                 END  
  221.         END  
  222.     PRINT(@Sql)  
  223.     EXEC(@Sql)  
  224. GO  



2、SQL Server 中调用测试代码

  1. --执行存储过程  
  2. declare @TotalCount int,  
  3.         @TotalPageCount int  
  4. exec P_viewPage 'T_Module','*','ModuleID','','',1,0,10,1,@TotalCount output,@TotalPageCount output  
  5. Select @TotalCount,@TotalPageCount;  

asp.net 代码实现:

 

  1. #region ===========通用分页存储过程===========  
  2.     public static DataSet RunProcedureDS(string connectionString, string storedProcName, IDataParameter[] parameters, string tableName)  
  3.     {  
  4.         using (SqlConnection connection = new SqlConnection(connectionString))  
  5.         {  
  6.             DataSet dataSet = new DataSet();  
  7.             connection.Open();  
  8.             SqlDataAdapter sqlDA = new SqlDataAdapter();  
  9.             sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);  
  10.             sqlDA.Fill(dataSet, tableName);  
  11.             connection.Close();  
  12.             return dataSet;  
  13.         }  
  14.     }  
  15.   
  16.     /// <summary>  
  17.     /// 通用分页存储过程  
  18.     /// </summary>  
  19.     /// <param name="connectionString"></param>  
  20.     /// <param name="tblName"></param>  
  21.     /// <param name="strGetFields"></param>  
  22.     /// <param name="primaryKey"></param>  
  23.     /// <param name="strWhere"></param>  
  24.     /// <param name="strOrder"></param>  
  25.     /// <param name="sortType"></param>  
  26.     /// <param name="recordCount"></param>  
  27.     /// <param name="PageSize"></param>  
  28.     /// <param name="PageIndex"></param>  
  29.     /// <param name="totalCount"></param>  
  30.     /// <param name="totalPageCount"></param>  
  31.     /// <returns></returns>  
  32.     public static DataSet PageList(string connectionString, string tblName, string strGetFields, string primaryKey, string strWhere, string strOrder, int sortType, int recordCount,  
  33.         int PageSize, int PageIndex,ref int totalCount,ref int totalPageCount)  
  34.     {  
  35.         SqlParameter[] parameters ={ new SqlParameter("@TableName ",SqlDbType.VarChar,200),  
  36.                 new SqlParameter("@FieldList",SqlDbType.VarChar,2000),  
  37.                 new SqlParameter("@PrimaryKey",SqlDbType.VarChar,100),  
  38.                 new SqlParameter("@Where",SqlDbType.VarChar,2000),  
  39.                 new SqlParameter("@Order",SqlDbType.VarChar,1000),  
  40.                 new SqlParameter("@SortType",SqlDbType.Int),  
  41.                 new SqlParameter("@RecorderCount",SqlDbType.Int),  
  42.                 new SqlParameter("@PageSize",SqlDbType.Int),  
  43.                 new SqlParameter("@PageIndex",SqlDbType.Int),  
  44.                 new SqlParameter("@TotalCount",SqlDbType.Int),  
  45.                 new SqlParameter("@TotalPageCount",SqlDbType.Int)};  
  46.   
  47.   
  48.         parameters[0].Value = tblName;  
  49.         parameters[1].Value = strGetFields;  
  50.         parameters[2].Value = primaryKey;  
  51.         parameters[3].Value = strWhere;  
  52.         parameters[4].Value = strOrder;  
  53.         parameters[5].Value = sortType;  
  54.         parameters[6].Value = recordCount;  
  55.         parameters[7].Value = PageSize;  
  56.         parameters[8].Value = PageIndex;  
  57.         parameters[9].Value = totalCount;  
  58.         parameters[9].Direction = ParameterDirection.Output;  
  59.         parameters[10].Value = totalPageCount;  
  60.         parameters[10].Direction = ParameterDirection.Output;  
  61.   
  62.   
  63.         DataSet ds = RunProcedureDS(connectionString, "P_viewPage", parameters, "PageListTable");  
  64.         totalCount = int.Parse(parameters[9].Value.ToString());  
  65.         totalPageCount = int.Parse(parameters[10].Value.ToString());  
  66.         return ds;  
  67.     }  
  68.     #endregion  
  69.   
  70. DataSet ds = SqlHelper.PageList(SqlHelper.LocalSqlServer, "T_User""*""UserID""""", 1, 0, pageSize, 1, ref totalCount, ref totalPageCount);  
  71. this.RptData.DataSource = ds;  
  72. this.RptData.DataBind();  

主题推荐
sql server 存储 分页 asp.net 数据
猜你在找
asp.net 常用功能
ASP.NET优化
sql server面试题
[知识库分享系列] 二、.NET(ASP.NET)
C#+SQL Server
Asp.net性能的技巧
ASP.NET面试资料
何种情况适用存储过程以及常用的分页、查询案例
什么时候用存储过程
asp.net网站的性能优化
查看评论

  暂无评论

* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    博客专栏
    .NET SL GIS开发群
    欢迎大家加入群,交流分享GIS开发的点点滴滴, 共同进步! 群号:106887513
    个人资料
    • 访问:389768次
    • 积分:8111分
    • 排名:第645名
    • 原创:414篇
    • 转载:55篇
    • 译文:2篇
    • 评论:253条
    链接分享
    推荐文章
    最新评论
公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告|合作伙伴|论坛反馈
网站客服 杂志客服 微博客服 400-600-2320
京 ICP 证 070598 号
北京创新乐知信息技术有限公司 版权所有
江苏乐知网络技术有限公司 提供商务支持
Copyright © 1999-2014, CSDN.NET, All Rights Reserved GongshangLogo