随笔 - 3  文章 - 0 评论 - 70 trackbacks - 11
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

昵称:New InterFace
园龄:7年10个月
粉丝:3
关注:0

搜索

 
 

常用链接

随笔档案

最新评论

using System;

namespace CountryPark.DAL
{
    /**//// <summary>
    /// PageList 的摘要说明。
    /// </summary>
    public sealed class PageList
    {
        static PageList()
        {
        }
        
        /**//// <summary>
        /// 分页查询数据记录总数获取
        /// </summary>
        /// <param name="_tbName">----要显示的表或多个表的连接</param>
        /// <param name="_ID">----主表的主键</param>
        /// <param name="_strCondition">----查询条件,不需where</param>        
        /// <param name="_Dist">----是否添加查询字段的 DISTINCT 默认0不添加/1添加</param>
        /// <returns></returns>
        public static string getPageListCounts(string _tbName, string _ID, string _strCondition, int _Dist)
        {            
            //---存放取得查询结果总数的查询语句                    
            //---对含有DISTINCT的查询进行SQL构造
            //---对含有DISTINCT的总数查询进行SQL构造
            string strTmp="", SqlSelect="", SqlCounts="";
            
            if (_Dist == 0)
            {
                SqlSelect = "SELECT ";
                SqlCounts = "COUNT(*)";
            }
            else
            {
                SqlSelect = "SELECT DISTINCT ";
                SqlCounts = "COUNT(DISTINCT "+ _ID +")";
            }
            if (_strCondition == string.Empty)
            {
                strTmp = SqlSelect +" @Counts="+ SqlCounts +" FROM "+ _tbName;
            }
            else
            {
                strTmp = SqlSelect +" @Counts="+ SqlCounts +" FROM "+ " WHERE (1=1) "+ _strCondition; 
            }
            return strTmp;
        }


        /**//// <summary>
        /// 获取分页数据查询SQL
        /// </summary>
        /// <param name="_tbName">----要显示的表或多个表的连接</param>
        /// <param name="_fldName">----要显示的字段列表</param>
        /// <param name="_PageSize">----每页显示的记录个数</param>
        /// <param name="_Page">----要显示那一页的记录</param>
        /// <param name="_PageCount">----查询结果分页后的总页数</param>
        /// <param name="_Counts">----查询到的记录数</param>
        /// <param name="_fldSort">----排序字段列表或条件(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')</param>
        /// <param name="_Sort">----排序方法,0为升序,1为降序</param>
        /// <param name="_strCondition">----查询条件,不需where</param>
        /// <param name="_ID">----主表的主键</param>
        /// <param name="_Dist">----是否添加查询字段的 DISTINCT 默认0不添加/1添加</param>
        /// <returns></returns>                                                                           
        public static string getPageListSql(string _tbName, string _fldName, int _PageSize, int _Page, out int _PageCount, int _Counts, string _fldSort, int _Sort, string _strCondition, string _ID, int _Dist)
        {                
            string strTmp=""; //---strTmp用于返回的SQL语句
            string SqlSelect="", strSortType="", strFSortType="";   

            if (_Dist == 0)
            {
                SqlSelect = "SELECT ";            
            }
            else
            {
                SqlSelect = "SELECT DISTINCT ";                
            }

            if (_Sort == 0)
            {
                strFSortType = " ASC";
                strSortType = " DESC";
            }
            else
            {
                strFSortType = " DESC";
                strSortType = " ASC";
            }

//            ----取得查询结果总数量-----
            int tmpCounts = 1;
            if (_Counts != 0)
            {
                tmpCounts = _Counts;
            }
//          --取得分页总数
            _PageCount = (tmpCounts + _PageSize - 1)/_PageSize;
            //    /**//**当前页大于总页数 取最后一页**/
            if (_Page > _PageCount)
            {
                _Page = _PageCount; 
            }
            if (_Page <= 0)
            {
                _Page = 1;
            }
//          --/*-----数据分页2分处理-------*/
            int pageIndex = tmpCounts/_PageSize;
            int lastCount = tmpCounts%_PageSize;
            if (lastCount > 0)
            {
                pageIndex = pageIndex + 1;
            }
            else
            {
                lastCount = _PageSize;
            }
            if (_strCondition == string.Empty) // --没有设置显示条件
            {
                if (pageIndex < 2 || _Page <= (pageIndex/2 + pageIndex%2))  //--前半部分数据处理
                {
                    if (_Page == 1)
                    {
                        strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +" ORDER BY "+ _fldSort +" "+ strFSortType;
                    }
                    else
                    {
                        strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +" WHERE "+ _ID +" <(SELECT MIN("+ _ID +") FROM ("+ SqlSelect +" TOP "+ _PageSize*(_Page-1) +" "+ _ID +" FROM "+ _tbName +
                            " ORDER BY "+ _fldSort +" "+ strFSortType +") AS TBMinID) ORDER BY "+ _fldSort +" "+ strFSortType;
                    }
                }
                else
                {
                    _Page = pageIndex - _Page + 1; //后半部分数据处理
                    if (_Page <= 1) //--最后一页数据显示
                    {
                        strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ lastCount +" "+ _fldName +" FROM "+ _tbName +" ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB"+ " ORDER BY "+ _fldSort +" "+ strFSortType;
                    }
                    else
                    {
                        strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +
                            " WHERE "+ _ID +" >(SELECT MAX("+ _ID +") FROM("+ SqlSelect +" TOP "+ (_PageSize*(_Page-2)+lastCount) +" "+ _ID +" FROM "+ _tbName +
                            " ORDER BY "+ _fldSort +" "+ strSortType +") AS TBMaxID) ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB ORDER BY "+ _fldSort +" "+ strFSortType;
                    }
                }
            }
            else // --有查询条件
            {
                if (pageIndex < 2 || _Page <=(pageIndex/2 + pageIndex%2))//--前半部分数据处理
                {
                    if (_Page == 1)
                    {
                        strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +"WHERE 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strFSortType;
                    }
                    else
                    {
                        strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +
                            " WHERE "+ _ID +" <(SELECT MIN("+ _ID +") FROM ("+ SqlSelect +" TOP "+ (_PageSize*(_Page-1)) +" "+ _ID +" FROM " +_tbName +
                            " WHERE 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strFSortType +") AS TBMaxID) "+ _strCondition +
                            " ORDER BY "+ _fldSort +" "+ strFSortType;                            
                    }
                }
                else //--后半部分数据处理
                {
                    _Page = pageIndex-_Page+1;
                    if (_Page <= 1) //--最后一页数据显示
                    {
                        strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ lastCount +" "+ _fldName +" FROM "+ _tbName +
                            " WHERE 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB ORDER BY "+ _fldSort +" "+ strFSortType;
                    }
                    else
                    {   
                        strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +
                            " WHERE "+ _ID +" >(SELECT MAX("+ _ID +") FROM("+ SqlSelect +" TOP "+ (_PageSize*(_Page-2)+ lastCount) +" "+ _ID +" FROM "+ _tbName +
                            " WHERE 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strSortType +") AS TBMaxID) "+ _strCondition +
                            " ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB ORDER BY "+ _fldSort +" "+ strFSortType;
                    }
                }
            }

            return strTmp;
        }
    }
}
--以上代码是针对之前写的TOP MAX模式的分页存储过程修改
--以上分页算法对SQL SERVER 和 ACCESS同样有效
参见:http://www.cnblogs.com/hertcloud/archive/2005/12/21/301327.html
posted on 2006-08-23 17:24 New InterFace 阅读(3222) 评论(10) 编辑 收藏

FeedBack:
//调用函数例子
public IList getParkDataList(string key, int curPage, out int pageCount, int pageSize, int Counts)
        
{
            
            IList list 
= new ArrayList();

            
string SECLECT_FIELD = "T_Park.ParkID, T_Park.ParkTitle, T_Park.ParkLetter, T_ParkArea.AreaName, T_ParkType.ParkTypeName ";
            
string SECLECT_TABLE = "T_ParkType INNER JOIN (T_ParkArea INNER JOIN T_Park ON T_ParkArea.ParkAreaID = T_Park.ParkAreaID) ON T_ParkType.ParkTypeID = T_Park.ParkTypeID";
            
string SECLECT_CONDITION = string.Empty;


            
if (key != string.Empty)
            
{
                SECLECT_CONDITION 
= " AND T_Park.ParkTitle like '%"+ key +"%'";
            }


            
string SELECT_ID = "ParkID";
            
string SELECT_FLDSORT = "ParkID";
            
int SELECT_SORT = 1;
            
int SELECT_DIST = 0;
            
string SQL = PageList.getPageListSql(SECLECT_TABLE, SECLECT_FIELD, pageSize, curPage, out pageCount, Counts, SELECT_FLDSORT, SELECT_SORT, SECLECT_CONDITION, SELECT_ID, SELECT_DIST);
            
//string strCondition;        
            OleDb db = new OleDb();
            ParkBE park;            
            
using(OleDbDataReader dr = (OleDbDataReader)db.ExecuteReader(CommonFun.GetConnectionString(), CommandType.Text, SQL))
            
{
                
while (dr.Read())
                
{    
                    park 
= new ParkBE();
                    park.ParkID 
= Convert.ToInt32(dr[0]);
                    park.ParkTitle 
= dr[1].ToString();
                    park.ParkLetter 
= dr[2].ToString();
                    park.ParkAreaName 
= dr[3].ToString();
                    park.ParkTypeName 
= dr[4].ToString();
                    list.Add(park);
                }

            }
            
            
return list;
        }


 回复 引用 查看   
UP
 回复 引用   
#3楼 2006-08-23 23:18 悟空[未注册用户]
排序字段有重复值可以用这个不
 回复 引用   
#4楼 2006-08-27 01:09 e旋风      
楼主我又来提意见了

我换用了你 2005-6-15 (存储过程 分页处理 孙伟 2005-06-15修改 多字段排序修改)

这个版本后


因为我是参考了这个帖子
http://community.csdn.net/Expert/topic/4700/4700485.xml?temp=.4185907

我把最后那个贴你代码的存储过程修改到我的系统里,数据就显示正常了


我的QQ: 84993908
MSN:xiangzi@live.com
Email:xiangzi@gmail.com
欢迎交流!!

 回复 引用 查看   
#5楼 2006-08-30 10:04 fsdy2000[未注册用户]
主表的主键(_ID)要求是自增长列吧?我看到 " WHERE "+ _ID +" >(SELECT MAX("+ _ID +") From....
 回复 引用   
@fsdy2000
楼上说的确实是 这个方法我是改的之前 写的ID为自增长字段的
不过
有时间我会把not in模式的版本 写上来
这样就没有 主键类型的限制了
有兴趣你可以看我之前写的not in的SQL存储过程版本
http://www.cnblogs.com/hertcloud/archive/2005/09/29/246702.html

 回复 引用 查看   
#7楼 2006-12-07 15:11 匿名[未注册用户]
怎么不用StringBuilder呢?效率会更高的
 回复 引用   
#8楼 2008-10-22 12:01 yiyanxiyin      
1.第一页应该单独处理
2.sqlserver2005里面已经有更好的方法了

 回复 引用 查看