分页存储过程及调用代码

数据库创建分页存储过程:

 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[Proc_GetInfoByPage]  
(  
  @TableName NVARCHAR(64),  
  @OrderBy NVARCHAR(256),  
  @Columns NVARCHAR(256) = '*',  
  @Where NVARCHAR(1024) = '',  
  @PageSize INT = 10,  
  @PageIndex INT = 1,  
  @RecordAmount INT = 0 OUTPUT 
)  
AS 
  DECLARE @Sql NVARCHAR(2048)  
  DECLARE @Filter NVARCHAR(2048)  
    
  -- Initialize ----------------------------------------------------------------------
    
  SET @Filter = '' 
  ----------------------------------------------------  
  IF (@Columns IS NULL OR LEN(@Columns) = 0) BEGIN 
    
    SET @Columns = '*' 
    
  END 
  ----------------------------------------------------  
  IF (LEN(@Where) > 0) BEGIN 
    
    SET @Filter = ' WHERE ' + @Where 
    
  END 
    
  -- Get record amount ---------------------------------------------------------------
    
  SET @Sql = 'SELECT @Count = COUNT(0) FROM ' + @TableName  
    
  SET @Sql = @Sql + @Filter  
    
  EXEC SP_EXECUTESQL @Sql,
 N'@Count INT OUTPUT',@RecordAmount OUTPUT 
    
  IF (@RecordAmount = 0) RETURN 
    
  -- Get bound -----------------------------------------------------------------------
    
  SET @PageIndex = @PageIndex - 1  
  DECLARE @TopBound INT 
  SET @TopBound = @PageIndex * @PageSize + 1  
  DECLARE @BottomBound INT 
  SET @BottomBound = @TopBound + @PageSize - 1  
    
  -- Get data ------------------------------------------------------------------------
    
  SET @Sql = 'SELECT * FROM (  
    
      SELECT ' + @Columns + ', ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS [RowNumber]  
      FROM ' + @TableName + @Filter + ' 
      
   ) AS [TempTable] WHERE [RowNumber] BETWEEN ' + CAST(@TopBound AS NVARCHAR) + ' AND ' + CAST(@BottomBound AS NVARCHAR)  
      
  EXEC SP_EXECUTESQL @Sql 

 

//服务器端调用分页存储过程

public partial class StudentDataDataContext
{
    public IList<TResultType> Proc_GetInfoByPage<TResultType>(int pageSize, int pageIndex,
         out int recordAmount, string tableName, string orderBy, string columns, string where)
    {

        DbCommand cm = this.Connection.CreateCommand();
        cm.CommandType = CommandType.StoredProcedure;
        cm.CommandText = "Proc_GetInfoByPage";

        #region Add Parameters

        DbParameter para1 = cm.CreateParameter();
        para1.DbType = DbType.String;
        para1.ParameterName = "@TableName";
        para1.Value = tableName;
        cm.Parameters.Add(para1);

        DbParameter para2 = cm.CreateParameter();
        para2.DbType = DbType.String;
        para2.ParameterName = "@OrderBy";
        para2.Value = orderBy;
        cm.Parameters.Add(para2);

        DbParameter para3 = cm.CreateParameter();
        para3.DbType = DbType.String;
        para3.ParameterName = "@Columns";
        para3.Value = columns;
        cm.Parameters.Add(para3);

        DbParameter para4 = cm.CreateParameter();
        para4.DbType = DbType.String;
        para4.ParameterName = "@Where";
        para4.Value = where;
        cm.Parameters.Add(para4);

        DbParameter para5 = cm.CreateParameter();
        para5.DbType = DbType.Int32;
        para5.ParameterName = "@PageSize";
        para5.Value = pageSize;
        cm.Parameters.Add(para5);

        DbParameter para6 = cm.CreateParameter();
        para6.DbType = DbType.Int32;
        para6.ParameterName = "@PageIndex";
        para6.Value = pageIndex;
        cm.Parameters.Add(para6);

        DbParameter para7 = cm.CreateParameter();
        para7.DbType = DbType.Int32;
        para7.ParameterName = "@RecordAmount";
        para7.Direction = ParameterDirection.Output;
        cm.Parameters.Add(para7);

        #endregion

        try
        {
            this.Connection.Open();

            DbDataReader dr = cm.ExecuteReader();

            IList<TResultType> list;

            // 这个判断不能少,否则照样和使用IMultipleResults的方法一样,出现异常。  
            if (dr.HasRows)
            {
                list = this.Translate<TResultType>(dr).ToList();
            }
            else
            {
                list = new List<TResultType>(0);
            }

            recordAmount = (int)para7.Value;

            return list;
        }
        catch
        {
            throw;
        }
        finally
        {
            cm.Dispose();
            this.Connection.Close();
        }
    }
}

posted @ 2012-12-18 15:29  as605  阅读(102)  评论(0)    收藏  举报