.net 公用的分页查询方法(c#)+公用的分页查询存储过程(SqlServer)

1.存储过程

CREATE PROCEDURE [dbo].[p_PageList]
@Tables varchar(1000),				--表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
@Sort varchar(200) = '',			--排序字段和排序方向,为空时,默认按主键倒序排
@PageNumber int = 1,				--开始页码
@PageSize int = 10,					--页大小
@Fields varchar(1000) = '*',		--读取字段
@Filter varchar(2000) = NULL,		--Where条件 长度不够,从1000变为2000
@Group varchar(1000) = NULL,		--分组
@isCount bit = 0,					--是否获得总记录数
@TotalCounts    int = 0 output      --查询到的总记录数(wuxl 添加于2010.01.14)
AS
DECLARE @strFilter varchar(2000)     --长度不够,从2000变为2000
declare @sql varchar(max)            --长度不够,从2000变为max
Declare @strTmp nvarchar(max)        --存放取得查询结果总数的查询语句

-- 过滤数据
SET @strFilter = ' 1 = 1 '
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
 SET @strFilter += @Filter 
END

--获得总记录条数
if @isCount = 1						
begin
	set @strTmp = 'SELECT @TotalCounts= Count(1) FROM '+ @Tables + ' where ' + @strFilter
	exec sp_executesql @strTmp,N'@TotalCounts int out ',@TotalCounts out  
end

--查询所有数据
IF @PageNumber < 1
	SET @PageNumber = 1
if @PageSize = 0
begin	
	if @Sort = ''
	begin
		set @sql = 'select ' + @Fields + ' from ' + @Tables + ' WHERE  ' + @strFilter 
	end
	else
	begin
		set @sql = 'select ' + @Fields + ' from ' + @Tables + ' WHERE  ' + @strFilter + ' ORDER BY  '+ @Sort	
	end	
end
else
begin
	if @PageNumber = 1				--第一页提高性能
	begin 
		if @Sort = ''
		begin
			set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ '  from ' + @Tables + ' WHERE ' + @strFilter
		end
		else
		begin
			set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ '  from ' + @Tables + ' WHERE ' + @strFilter + ' ORDER BY  '+ @Sort
		end
	end 
	else
	begin
		DECLARE @START_ID varchar(50)
		DECLARE @END_ID varchar(50)
		SET @START_ID = convert(varchar(50),(@PageNumber - 1) * @PageSize + 1)
		SET @END_ID = convert(varchar(50),@PageNumber * @PageSize)
		if @Sort = ''
		begin
			set @sql =  ' SELECT * FROM ( ' + 
				' SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS rownum, ' + @Fields + 
				' FROM ' + @Tables + 
				' WHERE ' + @strFilter + 
			') AS D WHERE rownum BETWEEN ' + @START_ID + ' AND ' + @END_ID
		end
		else
		begin
			set @sql =  ' SELECT * FROM ( ' + 
				' SELECT ROW_NUMBER() OVER(ORDER BY ' + @Sort + ') AS rownum, ' + @Fields + 
				' FROM ' + @Tables + 
				' WHERE ' + @strFilter + 
			') AS D WHERE rownum BETWEEN ' + @START_ID + ' AND ' + @END_ID
		end
	END
END

PRINT @sql
EXEC(@sql)

GO

2.调用存储过程的方法

    public class PageData
    {
        /// <summary>
        /// 新的分页获取数据
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="fieldName"></param>
        /// <param name="pageSize"></param>
        /// <param name="currentPage"></param>
        /// <param name="sortField">排序字段和排序方向,如:SortA DESC;</param>
        /// <param name="condition"></param>
        /// <param name="isCount">是否查询总数</param>
        /// <param name="totalCount">查询到的总记录数</param>  
        /// <returns></returns>
        public static DataSet GetDataByPage(
            string tableName,
            string fieldName,
            int pageSize,
            int currentPage,
            string sortField,
            string condition,
            bool isCount,
            out int totalCount
            )
        {
            SqlConnection CONN = new SqlConnection("数据库连接字符串");
            SqlDataAdapter SDA = new SqlDataAdapter("p_PageList",CONN);
            SDA.SelectCommand.CommandType = CommandType.StoredProcedure;
            SDA.SelectCommand.CommandTimeout = 30000;

            SDA.SelectCommand.Parameters.Add("@Tables", SqlDbType.VarChar,1000).Value = tableName;
            SDA.SelectCommand.Parameters.Add("@Sort", SqlDbType.VarChar,200).Value = sortField;
            SDA.SelectCommand.Parameters.Add("@PageNumber", SqlDbType.Int).Value = currentPage  ;
            SDA.SelectCommand.Parameters.Add("@PageSize", SqlDbType.Int).Value =  pageSize;
            SDA.SelectCommand.Parameters.Add("@Fields", SqlDbType.VarChar,1000).Value =   fieldName;
            SDA.SelectCommand.Parameters.Add("@Filter", SqlDbType.VarChar, 2000).Value = condition;     
            SDA.SelectCommand.Parameters.Add("@Group", SqlDbType.VarChar,1000).Value = null;
            SDA.SelectCommand.Parameters.Add("@isCount", SqlDbType.Bit).Value = isCount;
            SDA.SelectCommand.Parameters.Add("@TotalCounts", SqlDbType.Int).Direction = ParameterDirection.Output;

            DataSet ds = new DataSet();
            if (CONN.State == ConnectionState.Closed)
	        {
		         CONN.Open();
	        }
            SDA.Fill(ds);
            if (CONN.State == ConnectionState.Open)
	        {
		         CONN.Close();
	        }

            try
            {
                totalCount =int.Parse(SDA.SelectCommand.Parameters["@TotalCounts"].Value.ToString());
            }
            catch
            {
                totalCount = 0;
            }
            return ds;
        }

  

猜你喜欢

转载自www.cnblogs.com/by-lhc/p/8926347.html