首页 > 编程 > .NET > 正文

asp.net中如何调用sql存储过程实现分页

2024-07-10 13:29:17
字体:
来源:转载
供稿:网友

使用sql存储过程实现分页,在网上能找到好多种解决方案,但是如何用asp.net后台调用呢,通过本篇文章小编给大家详解asp.net中如何调用sql存储过程实现分页,有需要的朋友可以来参考下

首先看下面的代码创建存储过程

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. IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0 
  18. SET @Order = RTRIM(LTRIM(@Order)) 
  19. SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey)) 
  20. SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ',''
  21.  
  22. WHILE CHARINDEX(', ',@Order) > 0 OR CHARINDEX(' ,',@Order) > 0 
  23. BEGIN 
  24. SET @Order = REPLACE(@Order,', ',','
  25. SET @Order = REPLACE(@Order,' ,',',')  
  26. END 
  27.  
  28. IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = '' 
  29. OR ISNULL(@PrimaryKey,'') = '' 
  30. OR @SortType < 1 OR @SortType >3 
  31. OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0  
  32. BEGIN 
  33. PRINT('ERR_00')  
  34. RETURN 
  35. END 
  36.  
  37. IF @SortType = 3 
  38. BEGIN 
  39. IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC'
  40. BEGIN PRINT('ERR_02') RETURN END 
  41. END 
  42.  
  43. DECLARE @new_where1 VARCHAR(1000) 
  44. DECLARE @new_where2 VARCHAR(1000) 
  45. DECLARE @new_order1 VARCHAR(1000)  
  46. DECLARE @new_order2 VARCHAR(1000) 
  47. DECLARE @new_order3 VARCHAR(1000) 
  48. DECLARE @Sql VARCHAR(8000) 
  49. DECLARE @SqlCount NVARCHAR(4000) 
  50.  
  51. IF ISNULL(@where,'') = '' 
  52. BEGIN 
  53. SET @new_where1 = ' ' 
  54. SET @new_where2 = ' WHERE ' 
  55. END 
  56. ELSE 
  57. BEGIN 
  58. SET @new_where1 = ' WHERE ' + @where 
  59. SET @new_where2 = ' WHERE ' + @where + ' AND ' 
  60. END 
  61.  
  62. IF ISNULL(@order,'') = '' OR @SortType = 1 OR @SortType = 2  
  63. BEGIN 
  64. IF @SortType = 1  
  65. BEGIN 
  66. SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC' 
  67. SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC' 
  68. END 
  69. IF @SortType = 2  
  70. BEGIN 
  71. SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC' 
  72. SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC' 
  73. END 
  74. END 
  75. ELSE 
  76. BEGIN 
  77. SET @new_order1 = ' ORDER BY ' + @Order 
  78. END 
  79.  
  80. IF @SortType = 3 AND CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0 
  81. BEGIN 
  82. SET @new_order1 = ' ORDER BY ' + @Order 
  83. SET @new_order2 = @Order + ',' 
  84. SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')  
  85. SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,'
  86. SET @new_order2 = ' ORDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)  
  87. IF @FieldList <> '*' 
  88. BEGIN 
  89. SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')  
  90. SET @FieldList = ',' + @FieldList  
  91. WHILE CHARINDEX(',',@new_order3)>0 
  92. BEGIN 
  93. IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0 
  94. BEGIN 
  95. SET @FieldList =  
  96. @FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))  
  97. END 
  98. SET @new_order3 =  
  99. SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3)) 
  100. END 
  101. SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))  
  102. END 
  103. END 
  104.  
  105. SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/' 
  106. + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1 
  107. IF @RecorderCount = 0 
  108. BEGIN 
  109. EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT'
  110. @TotalCount OUTPUT,@TotalPageCount OUTPUT 
  111. END 
  112. ELSE 
  113. BEGIN 
  114. SELECT @TotalCount = @RecorderCount  
  115. END 
  116.  
  117. IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize) 
  118. BEGIN 
  119. SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize) 
  120. END 
  121.  
  122. IF @PageIndex = 1 OR @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) 
  123. BEGIN 
  124. IF @PageIndex = 1 --返回第一页数据 
  125. BEGIN 
  126. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 
  127. + @TableName + @new_where1 + @new_order1 
  128. END 
  129. IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) --返回最后一页数据 
  130. BEGIN 
  131. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 
  132. 'SELECT TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))  
  133. ' ' + @FieldList + ' FROM ' 
  134. + @TableName + @new_where1 + @new_order2 + ' ) AS TMP ' 
  135. + @new_order1  
  136. END 
  137. END 
  138. ELSE 
  139. BEGIN 
  140. IF @SortType = 1 --仅主键正序排序 
  141. BEGIN 
  142. IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 
  143. BEGIN 
  144. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 
  145. + @TableName + @new_where2 + @PrimaryKey + ' > ' 
  146. '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP ' 
  147. + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey  
  148. ' FROM ' + @TableName 
  149. + @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1 
  150. END 
  151. ELSE --反向检索 
  152. BEGIN 
  153. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 
  154. 'SELECT TOP ' + STR(@PageSize) + ' ' 
  155. + @FieldList + ' FROM ' 
  156. + @TableName + @new_where2 + @PrimaryKey + ' < ' 
  157. '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP ' 
  158. + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey  
  159. ' FROM ' + @TableName 
  160. + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2  
  161. ' ) AS TMP ' + @new_order1 
  162. END 
  163. END 
  164. IF @SortType = 2 --仅主键反序排序 
  165. BEGIN 
  166. IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 
  167. BEGIN 
  168. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 
  169. + @TableName + @new_where2 + @PrimaryKey + ' < ' 
  170. '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP ' 
  171. + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey  
  172. +' FROM '+ @TableName 
  173. + @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1  
  174. END 
  175. ELSE --反向检索 
  176. BEGIN 
  177. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 
  178. 'SELECT TOP ' + STR(@PageSize) + ' ' 
  179. + @FieldList + ' FROM ' 
  180. + @TableName + @new_where2 + @PrimaryKey + ' > ' 
  181. '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP ' 
  182. + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey  
  183. ' FROM ' + @TableName 
  184. + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2  
  185. ' ) AS TMP ' + @new_order1 
  186. END 
  187. END 
  188. IF @SortType = 3 --多列排序,必须包含主键,且放置最后,否则不处理 
  189. BEGIN 
  190. IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0  
  191. BEGIN PRINT('ERR_02') RETURN END 
  192. IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索 
  193. BEGIN 
  194. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 
  195. 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 
  196. ' SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList 
  197. ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP ' 
  198. + @new_order2 + ' ) AS TMP ' + @new_order1  
  199. END 
  200. ELSE --反向检索 
  201. BEGIN 
  202. SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 
  203. 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( ' 
  204. ' SELECT TOP ' + STR(@TotalCount-@PageSize*@PageIndex+@PageSize) + ' ' + @FieldList 
  205. ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP ' 
  206. + @new_order1 + ' ) AS TMP ' + @new_order1 
  207. END 
  208. END 
  209. END 
  210. PRINT(@Sql) 
  211. EXEC(@Sql) 
  212. GO 

2、SQL Server 中调用测试代码

 

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

asp.net 代码实现:

 

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

以上内容就是本文介绍asp.net中如何调用sql存储过程实现分页的全部内容,希望对大家今后的学习有所帮助,当然方法不止本文所述,欢迎与大家分享好的方案。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表