返回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

posted @ 2013-11-12 13:55  顿金  阅读(629)  评论(0编辑  收藏  举报