再来说说ASP.NET的分页(实现ACCESS百万数据分页)

mac2022-06-30  79

先说实现分页的两条主要SQL语句

            strPageSQL1  =   " select top  "   +  intPageSize  +   "  pages_id,pages_name,pages_content,pages_datetime,pages_addrows1,pages_addrows2 from pages order by pages_id desc " ;            strPageSQL2  =   " select top  "   +  intPageSize  +   "  pages_id,pages_name,pages_content,pages_datetime,pages_addrows1,pages_addrows2 from pages where pages_id<(select min(pages_id) from(select top  "   +  intPageSize  *  (intPageNumber  -   1 +   "  pages_id from pages order by pages_id desc) as T) order by pages_id desc " ;

这种方法是现在为止我发现的最快的分页方法,当然,写成存储过程更快!至于题目说的“ACCESS百万数据分页”,这是在特定条件下的分页方法。先来说说上边两条SQL语句的特点吧,它们是根据比较ID大小来实现获取指定范围的数据,这样就ID这个项要求能够迅速被查找到!在SQL server中可以用到“聚集索引”对ID进行物理上的排序,在SQL server的测试中,该分页语句对SQL server千万数据的分页丝毫不觉得延迟(在普通PC机下),但是如果没有对ID进行聚集索引,分页时间却大于3秒,特别是最后一页,甚至你会觉得是死机了。这样,你知道聚集索引的威力了吧!说会ACCESS的百万分页吧,ACCESS没有聚集索引项,所以只能在特定情况下实现百万数据的快速反应。说到这里,你应该猜到了如何用ACCESS模拟实现SQL server的聚集索引的效果了吧?对了,就是ACCESS中的“压缩和修复数据库”,在压缩数据库过程用,ACCESS数据库会整理数据并将数据按照指定的顺序(在数据界面右键可以选顺序或逆序)排列。经过压缩的ACCESS数据已经按照顺序物理排列好了。这样,只要上边的SQL语句顺序和排列的顺序一致,就算ACCESS百万数据情况下,分页反应也可以在一秒左右,应该可以接受了。呵呵,这不过是一个测试,实用价值不大。 哦,几乎忘了我们是说分页的,离题了!!呵呵,由于分页的显示内容的不用,所以分页显示数据方面不可能做到一致的。我们能实现的就是分页的控制。废话少讲,先奉上代码:

 

using  System; using  System.Data; using  System.Web.UI; using  System.Data.OleDb; using  System.Configuration; // 读取web.config using  QS_Web.Data; namespace  QS_Web {    namespace Pages    {        public class PagesClass        {            private int intPageSize,intPageNumber,intLogCount,intPageCount;//定义每页记录数目,当前页码            private string strLogCountSQL,strPageName,strParameterName;//统计总记录SQL语句,分页页面名称和分页参数名称            private string strConnection,strDBType;            public PagesClass(string _strPageName,string _strParameterName,int _intPageNumber,int _intPageSize,string _strLogCountSQL,string _strConnection,string _strDBType)            {                            strConnection = _strConnection;                strDBType = _strDBType;                strPageName = _strPageName;                strParameterName = _strParameterName;                intPageNumber = _intPageNumber;                intPageSize = _intPageSize;                strLogCountSQL = _strLogCountSQL;                intLogCount = LogCount();                intPageCount = PageCount();                intPageNumber = CheckPageNumber();            }            public string GetFirstPage()            {                string _strFirstPage;                if(intPageNumber == 1)                {                    _strFirstPage = String.Format("{0}","#");                }                else                {                    _strFirstPage = String.Format("{0}?{1}={2}",strPageName,strParameterName,"1");                }                return _strFirstPage;            }            public string GetLastPage()            {                string _strLastPage;                if(intPageNumber == intPageCount)                {                    _strLastPage = String.Format("{0}","#");                }                else                {                    _strLastPage = String.Format("{0}?{1}={2}",strPageName,strParameterName,intPageCount);                }                return _strLastPage;            }            public string GetPrevPage()            {                string _strPrevPage;                if(intPageNumber == 1)                {                    _strPrevPage = String.Format("{0}","#");                }                else                {                    _strPrevPage = String.Format("{0}?{1}={2}",strPageName,strParameterName,PrevPage());                }                return _strPrevPage;            }            public string GetNextPage()            {                string _strNextPage;                if(intPageNumber == intPageCount)                {                    _strNextPage = String.Format("{0}","#");                }                else                {                    _strNextPage = String.Format("{0}?{1}={2}",strPageName,strParameterName,NextPage());                }                return _strNextPage;            }            public int GetLogCount()            {                return intLogCount;            }            public int GetPageCount()            {                return intPageCount;            }            public int GetPageSize()            {                return intPageSize;            }            public int GetPageNumber()            {                return intPageNumber;            }                    private int LogCount()//统计总记录数            {                DBClient newDBClient = CreateDBClient.GetDBClient(strConnection,strDBType);                int intTemp = (int)newDBClient.GetScalar(strLogCountSQL);                newDBClient.DBClose();                return intTemp;            }                    private int PageCount()//统计总页数            {                int _intPageCount;                if(intLogCount % intPageSize != 0)                {                    _intPageCount = intLogCount / intPageSize + 1;                }                else                {                    _intPageCount = intLogCount / intPageSize;                }                return _intPageCount;            }            private int CheckPageNumber()//检查页码是否在合理范围            {                int _intPageNumber = intPageNumber;                if(_intPageNumber > intPageCount)                {                    _intPageNumber = intPageCount;                }                else if(_intPageNumber < 1)                {                    _intPageNumber = 1;                }                return _intPageNumber;            }            private int PrevPage()//计算前一页            {                int _intPageNumber = intPageNumber - 1;                if(_intPageNumber < 1)                {                    _intPageNumber = 1;                }                return _intPageNumber;            }            private int NextPage()//计算下一页            {                int _intPageNumber = intPageNumber + 1;                if(_intPageNumber > intPageCount)                {                    _intPageNumber = intPageCount;                }                return _intPageNumber;            }        }    }}

QS_Web.Data是组件包的另外一个数据库连接组件,主要实现数据库连接的分离,以便更好地实现三层代码的开发,以后我们会再讨论该组件的实现。 在本分页类中用到该数据库连接的地方是统计总记录数目:

 

             private   int  LogCount() // 统计总记录数              {                DBClient newDBClient = CreateDBClient.GetDBClient(strConnection,strDBType);                int intTemp = (int)newDBClient.GetScalar(strLogCountSQL);                newDBClient.DBClose();                return intTemp;            }

代码的意思是根据数据库连接字符串strConnection和数据库类型strDBType创建数据库连接对象,然后调用该对象的GetScalar方法取得总记录数目。这里知道LogCount函数是取得总记录数即可,关于数据库连接的代码可以先不管。 有了该PagesClass类,我们就可以通过调用相应的方法拼装分页语句实现分页了,但是,为了方便自己的调用,我还写了个PagesClassHelper类来实现快速拼装分页字符串,我们来看看:

 

using  System; using  System.Data; using  System.Web.UI; using  System.Data.OleDb; using  System.Configuration; // 读取web.config using  QS_Web.Data; namespace  QS_Web {    namespace Pages    {        public class PagesClassHelper : Page        {            private int intPageNumber,intPageSize,intPageCount;            private string strPageName,strParameterName,strLogCountSQL,strPageSQL1,strPageSQL2,strConnection,strDBType;            private string strFore,strHind,strFirstPage,strLastPage,strPrevPage,strNextPage,strLogCount,strPageSize;                public PagesClassHelper(string _strPageName,string _strParameterName,int _intPageNumber,int _intPageSize,string _strLogCountSQL,string _strPageSQL1,string _strPageSQL2,string _strConnection,string _strDBType)            {                intPageNumber = _intPageNumber;                intPageSize = _intPageSize;                strPageName = _strPageName;                strParameterName = _strParameterName;                strLogCountSQL = _strLogCountSQL;                strPageSQL1 = _strPageSQL1;                strPageSQL2 = _strPageSQL2;                strConnection = _strConnection;                strDBType = _strDBType;                            PagesClass newPagesClass = new PagesClass(strPageName,strParameterName,intPageNumber,intPageSize,strLogCountSQL,strConnection,strDBType);                strFirstPage = newPagesClass.GetFirstPage();                strLastPage = newPagesClass.GetLastPage();                strPrevPage = newPagesClass.GetPrevPage();                strNextPage = newPagesClass.GetNextPage();                strLogCount = newPagesClass.GetLogCount().ToString();                strPageSize = intPageSize.ToString();                intPageNumber = newPagesClass.GetPageNumber();                intPageCount = newPagesClass.GetPageCount();            }                public string QuickPages()            {                strFore = "<a href='" + strFirstPage + "'><FONT color=red>首页</FONT></a>  <a href='" + strPrevPage + "'><FONT color=red>上一页</FONT></a>  ";                strHind = "<a href='" + strNextPage + "'><FONT color=red>下一页</FONT></a>  <a href='" + strLastPage + "'><FONT color=red>尾页</FONT></a>  ";                if(intPageNumber == 1)                {                    strFore = "首页  上一页  ";                    strHind = "<a href='" + strNextPage + "'><FONT color=red>下一页</FONT></a>  <a href='" + strLastPage + "'><FONT color=red>尾页</FONT></a>  ";                }                else if(intPageNumber == intPageCount)                {                    strFore = "<a href='" + strFirstPage + "'><FONT color=red>首页</FONT></a>  <a href='" + strPrevPage + "'><FONT color=red>上一页</FONT></a>  ";                    strHind = "下一页  尾页  ";                }                if(intPageCount == 0 || intPageCount == 1)                {                    strFore = "首页  上一页  ";                    strHind = "下一页  尾页  ";                }                string strTheLink = "[分页统计]共 <FONT color=red>" + intPageCount.ToString() + "</FONT> 页 <FONT color=red>" + strLogCount + "</FONT> 条记录  每页 <FONT color=red>" + strPageSize + "</FONT> 条记录  " + strFore + strHind + "当前第 <FONT color=red>" + intPageNumber.ToString() + "</FONT> 页";                return strTheLink;            }            public DataTable PageDataBind()//核心取值函数            {                DataTable dt = new DataTable();                DBClient newDBClient = CreateDBClient.GetDBClient(strConnection,strDBType);                if(intPageNumber == 1)                {                    dt = newDBClient.GetDataTable(strPageSQL1);                }                else                {                    dt = newDBClient.GetDataTable(strPageSQL2);                }                newDBClient.DBClose();                return dt;            }        }    }}

其中Pages_Load函数的

                PagesClass newPagesClass  =   new  PagesClass(strPageName,strParameterName,intPageNumber,intPageSize,strLogCountSQL,strConnection,strDBType);                strFirstPage  =  newPagesClass.GetFirstPage();                strLastPage  =  newPagesClass.GetLastPage();                strPrevPage  =  newPagesClass.GetPrevPage();                strNextPage  =  newPagesClass.GetNextPage();                strLogCount  =  newPagesClass.GetLogCount().ToString();                strPageSize  =  intPageSize.ToString();                intPageNumber  =  newPagesClass.GetPageNumber();                intPageCount  =  newPagesClass.GetPageCount();

就是调用PagesClass来获取相应的分页参数。在QuickPages函数中就用Page_Load函数获取的数据拼装成完整的分页字符串,然后返回。这样在需要显示分页的地方,只要简单调用PagesClassHelper类的QuickPages函数就可以轻松实现分页。就像这样:

 

            PagesClassHelper IndexPagesHelper  =   new  PagesClassHelper(strPageName,strParameterName,intPageNumber,intPageSize,strLogCountSQL,strPageSQL1,strPageSQL2,strConnection,strDBType);                        rptPagesShow.DataSource  =  IndexPagesHelper.PageDataBind(); // 核心取值函数;             rptPagesShow.DataBind();            ltrPages.Text  =  IndexPagesHelper.QuickPages();

这其中更调用了PagesClassHelper的PageDataBind函数,该函数根据分页的SQL语句(就是文章开头提出的两个语句)获取分页的具体内容,并以DataTable的形式返回,只要将该DataTable绑定到页面显示控件就实现了分页内容的显示。简单吧?看看上边的代码,通过调用这两个类,用四行语句实现了分页。吼吼~~

今天是星期天,总想着出去玩,所以写得点乱,凑合着看吧,有批评建议请留言或Email给我kenblove#gmail.com(#->@)

这个分页方法还是显得很不成熟,不过对应分页的初学者还是可以了解一下分页的思想和方法的.希望能成为引玉之砖吧.现在贴上完整代码:点击下载

 

转载于:https://www.cnblogs.com/KenBlove/articles/463340.html

相关资源:asp.net access数据库分页
最新回复(0)