浅述asp.net海量分页数据存储过程

数据分页是Web应用程序开发中经常使用的一种技术,也是提高Web数据访问性能的主要手段。本文结合ASP.NET,详细给出了两种ASP.NET海量分页数据存储的技术。

存储过程1

  1. CREATEPROCEDURE pagination
  2. @tblName varchar(255), -- 表名
  3. @strGetFields varchar(1000) = '*', -- 需要返回的列
  4. @fldName varchar(255)='', -- 排序的字段名
  5. @PageSize int , -- 页尺寸
  6. @PageIndex int, -- 页码
  7. @doCount bit , -- 返回记录总数, 非 0 值则返回
  8. @OrderType bit , -- 设置排序类型, 非 0 值则降序
  9. @strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
  10. AS
  11. declare @strSQL varchar(5000) -- 主语句
  12. declare @strTmp varchar(110) -- 临时变量
  13. declare @strOrder varchar(400) -- 排序类型
  14. if @doCount != 0
  15. begin
  16. if @strWhere !=''
  17. set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
  18. else
  19. set @strSQL = "select count(*) as Total from [" + @tblName + "]"
  20. end
  21. --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
  22. else
  23. begin
  24. if @OrderType != 0
  25. begin
  26. set @strTmp = "<(select min"
  27. set @strOrder = " order by [" + @fldName +"] desc"
  28. --如果@OrderType不是0,就执行降序,这句很重要!
  29. end
  30. else
  31. begin
  32. set @strTmp = ">(select max"
  33. set @strOrder = " order by [" + @fldName +"] asc"
  34. end
  35. if @PageIndex = 1
  36. begin
  37. if @strWhere != ''
  38. set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder
  39. else
  40. set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["+ @tblName + "] "+ @strOrder
  41. --如果是第一页就执行以上代码,这样会加快执行速度
  42. end
  43. else
  44. begin
  45. --以下代码赋予了@strSQL以真正执行的SQL代码
  46. set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
  47. + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder
  48. if @strWhere != ''
  49. set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
  50. + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
  51. + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
  52. + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
  53. + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder
  54. end
  55. end
  56. exec (@strSQL)
  57. GO
  58. 调用的程序(为了通用性,我写了一个方法,大家可以提意见,也可以对其进行修改,多多交换意见,共同进步)
  59. private static DataSet GetCustomersData(string tblName, string strGetFields,string fldName, int PageSize, int PageIndex, int doCount, int OrderType, string strWhere)
  60. {
  61. string connString = ConfigurationSettings.AppSettings["connstr"];
  62. SqlConnection conn = new SqlConnection(connString);
  63. SqlCommand comm = new SqlCommand("pagination3", conn);
  64. comm.Parameters.Add(new SqlParameter("@tblName", SqlDbType.VarChar));//表名
  65. comm.Parameters[0].Value =tblName ;
  66. comm.Parameters.Add(new SqlParameter("@strGetFields", SqlDbType.VarChar));//返回的列
  67. comm.Parameters[1].Value = strGetFields;
  68. comm.Parameters.Add(new SqlParameter("@fldName", SqlDbType.VarChar));//排序的字段名
  69. comm.Parameters[2].Value = fldName;
  70. comm.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));//页尺寸
  71. comm.Parameters[3].Value = PageSize;
  72. comm.Parameters.Add(new SqlParameter("@PageIndex", SqlDbType.Int));//页码
  73. comm.Parameters[4].Value = PageIndex;
  74. comm.Parameters.Add(new SqlParameter("@doCount", SqlDbType.Int));//是否返回记录总数,0为不返回,1为返回
  75. comm.Parameters[5].Value = doCount;
  76. comm.Parameters.Add(new SqlParameter("@OrderType", SqlDbType.Int));//设置排序类型,0为升序,非0为降序
  77. comm.Parameters[6].Value = OrderType;
  78. comm.Parameters.Add(new SqlParameter("@strWhere", SqlDbType.VarChar));//where语句
  79. comm.Parameters[7].Value = strWhere;
  80. comm.CommandType = CommandType.StoredProcedure;
  81. SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);
  82. DataSet ds = new DataSet();
  83. dataAdapter.Fill(ds);
  84. return ds;
  85. }

存储过程2

  1. CREATEPROCEDURE [dbo].[GetRecordFromPage]
  2. @SelectList VARCHAR(2000), --欲选择字段列表
  3. @TableSource VARCHAR(100), --表名或视图表
  4. @SearchCondition VARCHAR(2000), --查询条件
  5. @OrderExpression VARCHAR(1000), --排序表达式
  6. @PageIndex INT = 1, --页号,从0开始
  7. @PageSize INT = 10 --页尺寸
  8. AS
  9. BEGIN
  10. IF @SelectList IS NULL OR LTRIM(RTRIM(@SelectList)) = ''
  11. BEGIN
  12. SET @SelectList = '*'
  13. END
  14. PRINT @SelectList
  15. SET @SearchCondition = ISNULL(@SearchCondition,'')
  16. SET @SearchCondition = LTRIM(RTRIM(@SearchCondition))
  17. IF @SearchCondition <> ''
  18. BEGIN
  19. IF UPPER(SUBSTRING(@SearchCondition,1,5)) <> 'WHERE'
  20. BEGIN
  21. SET @SearchCondition = 'WHERE ' + @SearchCondition
  22. END
  23. END
  24. PRINT @SearchCondition
  25. SET @OrderExpression = ISNULL(@OrderExpression,'')
  26. SET @OrderExpression = LTRIM(RTRIM(@OrderExpression))
  27. IF @OrderExpression <> ''
  28. BEGIN
  29. IF UPPER(SUBSTRING(@OrderExpression,1,5)) <> 'WHERE'
  30. BEGIN
  31. SET @OrderExpression = 'ORDER BY ' + @OrderExpression
  32. END
  33. END
  34. PRINT @OrderExpression
  35. IF @PageIndex IS NULL OR @PageIndex < 1
  36. BEGIN
  37. SET @PageIndex = 1
  38. END
  39. PRINT @PageIndex
  40. IF @PageSize IS NULL OR @PageSize < 1
  41. BEGIN
  42. SET @PageSize = 10
  43. END
  44. PRINT @PageSize
  45. DECLARE @SqlQuery VARCHAR(4000)
  46. SET @SqlQuery='SELECT '+@SelectList+',RowNumber
  47. FROM
  48. (SELECT ' + @SelectList + ',ROW_NUMBER() OVER( '+ @OrderExpression +') AS RowNumber
  49. FROM '+@TableSource+' '+ @SearchCondition +') AS RowNumberTableSource
  50. WHERE RowNumber BETWEEN ' + CAST(((@PageIndex - 1)* @PageSize+1) ASVARCHAR)
  51. + ' AND ' +
  52. CAST((@PageIndex * @PageSize) ASVARCHAR)
  53. -- ORDER BY ' + @OrderExpression
  54. PRINT @SqlQuery
  55. SET NOCOUNT ON
  56. EXECUTE(@SqlQuery)
  57. SET NOCOUNT OFF
  58. RETURN @@RowCount
  59. END