返回List的分页方法

时间:2023-03-09 15:54:50
返回List的分页方法

cs代码 

/// <summary>

        /// 处理分页检索存储过程(SQL2005)

        /// </summary>

        /// <param name="fields">需要查询的字段</param>

        /// <param name="tables">表名</param>

        /// <param name="filters">sql条件</param>

        /// <param name="sortStr">排序字符串</param>

        /// <param name="currentPage">当前页</param>

        /// <param name="pageSize">每页记录数</param>

        /// <param name="total">总记录数</param>

        /// <param name="totalPage">总页数</param>

        /// <returns>DataTable</returns>

protected IList<T> ExecutePaginationQueryListSP<T>(string fields, string tables, string filters, string sortFields, string sortType,

                                                    int currentPage, int pageSize, out int total) where T : new()

        {

            IList<T> result=default(List<T>);

string spName = "ceb_Pagination";

            //参数赋值

SqlParameter pFields = new SqlParameter("@fields", SqlDbType.NVarChar, 1000);

pFields.Value = fields;

SqlParameter pTables = new SqlParameter("@tables", SqlDbType.NVarChar, 400);

pTables.Value = tables;

SqlParameter pFilters = new SqlParameter("@filters", SqlDbType.NVarChar, 1000);

pFilters.Value = filters;

SqlParameter pSortFields = new SqlParameter("@sortfields", SqlDbType.NVarChar, 100);

pSortFields.Value = sortFields;

SqlParameter pSortType = new SqlParameter("@sorttype", SqlDbType.NVarChar, 4);

pSortType.Value = sortType;

SqlParameter pCurrentPage = new SqlParameter("@currentpage", SqlDbType.Int);

pCurrentPage.Value = currentPage;

SqlParameter pPageSize = new SqlParameter("@pagesize", SqlDbType.Int);

pPageSize.Value = pageSize;

SqlParameter pTotal = new SqlParameter("@total", SqlDbType.Int);

pTotal.Direction = ParameterDirection.Output;

            //添加参数

            SqlParameter[] param = new SqlParameter[]{

            pFields,

            pTables,

            pFilters,

            pSortFields, 

pSortType,

            pCurrentPage,

            pPageSize,

            pTotal

            };

            

            try

            {

total = Convert.ToInt32(pTotal.Value);

                result=ExecuteQueryListSP<T>(spName, param);

            }

            catch (Exception e)

            {

                total = 0;

            }

            finally

            {

                Close();

            }

            return result;

        }

///<summary>

///利用反射将SqlDataReader转换成List模型

        ///</summary>

        ///<param name="spName">存储过程名称</param>

        ///<returns></returns>





        public virtual IList<T> ExecuteQueryListSP<T>(string spName, params SqlParameter[] listParams) where T : new()

        {

            IList<T> list = new List<T>();





            Type type = typeof(T);





            string tempName = string.Empty;





            using (SqlDataReader reader = ExecuteReaderSP(spName, new ArrayList(listParams)))

            {

                if (reader.HasRows)

                {

                    //list = new List<T>();

                    while (reader.Read())

                    {

                        T t = new T();





                        PropertyInfo[] propertys = t.GetType().GetProperties();





                        foreach (PropertyInfo pi in propertys)

                        {

                            tempName = pi.Name;





                            //for (int intField = 0; intField < reader.FieldCount; intField++)

                            //{//遍历该列名是否存在

                            //}





                            if (readerExists(reader, tempName))

                            {

                                if (!pi.CanWrite)

                                {

                                    continue;

                                }

                                var value = reader[tempName];





                                if (value != DBNull.Value)

                                {

                                    pi.SetValue(t, value, null);

                                }





                            }





                        }





                        list.Add(t);





                    }





                }

                if (reader != null && (!reader.IsClosed))

                {

                    reader.Close();

                }

            }

            return list;

}

/// <summary>

        /// 处理存储过程

        /// </summary>

        /// <param name="spName">存储过程名</param>

        /// <param name="parameters">参数数组</param>

        /// <returns>sql数据流</returns>

        public virtual SqlDataReader ExecuteReaderSP(string spName, ArrayList parameters)

        {

            SqlDataReader result = null;

            cmd.CommandText = spName;

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Clear();

            if (parameters != null)

            {

                foreach (SqlParameter param in parameters)

                {

                    cmd.Parameters.Add(param);

                }

            }

            try

            {

                Open();

                result = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            }

            catch (Exception e)

            {

                if (result != null && (!result.IsClosed))

                {

                    result.Close();

                }

                //LogHelper.WriteLog("\r\n方法异常【ExecuteReaderSP(string spName, ArrayList parameters)】" + spName, e);

               // LogStackTrace.WriteError(e);

                throw new Exception(e.Message);

            }

            //finally

            //{

            //    Close();

            //}

            return result;

        }

//存储过程

Create proc [dbo].[ceb_Pagination2005]

@strFields nvarchar(2000),  --字段名

@strTableName nvarchar(2000), --表名

@strWhere nvarchar(4000),  --条件 无需加where

@strOrderBy nvarchar(200), --排序 必添 无需加order by

@PageSize int,    --分页大小

@CurrentPage int,   --当前页,1为起始页

@PageCount int output,  --返回总页数

@RecordCount int output  --返回记录总数

as

begin

declare @StartIndex int     --定义起始位置

set @StartIndex = (@currentPage - 1) * @PageSize + 1

declare @strSql1 nvarchar (Max) --数据查询

declare @strSql2 nvarchar (Max) --统计记录总数

declare @ParmDefinition nvarchar (Max)

set @ParmDefinition = N'@tmp int output'

set @strSql1 = N'select row_number() over (order by ' + @strOrderBy + ' ) as RowID, '

set @strSql2 = 'select @tmp = count(*) '

if @strFields <> ''

 set @strSql1 = @strSql1 + @strFields

else

 set @strSql1 = @strSql1 + ' * '

if @strTableName <> ''

begin

 set @strSql1 = @strSql1 + ' from ' + @strTableName

 set @strSql2 = @strSql2 + ' from ' + @strTableName

end

if @strWhere <> ''

begin

 set @strSql1 = @strSql1 + ' where ' + @strWhere

 set @strSql2 = @strSql2 + ' where ' + @strWhere

end

exec sp_executesql @strSql2,@ParmDefinition,@tmp = @RecordCount output  --执行统计记录总数SQL语句





if @RecordCount % @PageSize = 0  --计算总页数

 set @PageCount = @RecordCount / @PageSize

else

 set @PageCount = @RecordCount / @PageSize + 1

set @strSql1 = 'with TempTable as ( ' + @strSql1 + ' ) select * from TempTable where RowID between ' 

  + Convert(varchar(10),@StartIndex) + ' and ' + Convert(varchar(10),@StartIndex + @PageSize - 1)

exec(@strSql1)

end