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

先说实现分页的两条主要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
ExpandedBlockStart.gifContractedBlock.gif
{
    
namespace Pages
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public class PagesClass
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
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)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{            
                strConnection 
= _strConnection;
                strDBType 
= _strDBType;

                strPageName 
= _strPageName;
                strParameterName 
= _strParameterName;
                intPageNumber 
= _intPageNumber;
                intPageSize 
= _intPageSize;
                strLogCountSQL 
= _strLogCountSQL;

                intLogCount 
= LogCount();
                intPageCount 
= PageCount();

                intPageNumber 
= CheckPageNumber();


            }


            
public string GetFirstPage()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
string _strFirstPage;
                
if(intPageNumber == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strFirstPage 
= String.Format("{0}","#");
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strFirstPage 
= String.Format("{0}?{1}={2}",strPageName,strParameterName,"1");
                }

                
return _strFirstPage;
            }


            
public string GetLastPage()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
string _strLastPage;
                
if(intPageNumber == intPageCount)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strLastPage 
= String.Format("{0}","#");
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strLastPage 
= String.Format("{0}?{1}={2}",strPageName,strParameterName,intPageCount);
                }

                
return _strLastPage;
            }


            
public string GetPrevPage()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
string _strPrevPage;
                
if(intPageNumber == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strPrevPage 
= String.Format("{0}","#");
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strPrevPage 
= String.Format("{0}?{1}={2}",strPageName,strParameterName,PrevPage());
                }

                
return _strPrevPage;
            }


            
public string GetNextPage()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
string _strNextPage;
                
if(intPageNumber == intPageCount)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strNextPage 
= String.Format("{0}","#");
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _strNextPage 
= String.Format("{0}?{1}={2}",strPageName,strParameterName,NextPage());
                }

                
return _strNextPage;
            }


            
public int GetLogCount()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return intLogCount;
            }


            
public int GetPageCount()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return intPageCount;
            }


            
public int GetPageSize()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return intPageSize;
            }


            
public int GetPageNumber()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return intPageNumber;
            }

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

        
            
private int PageCount()//统计总页数
ExpandedSubBlockStart.gifContractedSubBlock.gif
            {
                
int _intPageCount;
                
if(intLogCount % intPageSize != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _intPageCount 
= intLogCount / intPageSize + 1;
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _intPageCount 
= intLogCount / intPageSize;
                }

                
return _intPageCount;
            }


            
private int CheckPageNumber()//检查页码是否在合理范围
ExpandedSubBlockStart.gifContractedSubBlock.gif
            {
                
int _intPageNumber = intPageNumber;
                
if(_intPageNumber > intPageCount)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _intPageNumber 
= intPageCount;
                }

                
else if(_intPageNumber < 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _intPageNumber 
= 1;
                }

                
return _intPageNumber;
            }


            
private int PrevPage()//计算前一页
ExpandedSubBlockStart.gifContractedSubBlock.gif
            {
                
int _intPageNumber = intPageNumber - 1;
                
if(_intPageNumber < 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _intPageNumber 
= 1;
                }

                
return _intPageNumber;
            }


            
private int NextPage()//计算下一页
ExpandedSubBlockStart.gifContractedSubBlock.gif
            {
                
int _intPageNumber = intPageNumber + 1;
                
if(_intPageNumber > intPageCount)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _intPageNumber 
= intPageCount;
                }

                
return _intPageNumber;
            }

        }

    }

}


QS_Web.Data是组件包的另外一个数据库连接组件,主要实现数据库连接的分离,以便更好地实现三层代码的开发,以后我们会再讨论该组件的实现。

在本分页类中用到该数据库连接的地方是统计总记录数目:

 

             private   int  LogCount() // 统计总记录数
ExpandedBlockStart.gifContractedBlock.gif
             {
                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
ExpandedBlockStart.gifContractedBlock.gif
{
    
namespace Pages
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
public class PagesClassHelper : Page
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
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)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                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()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                strFore 
= "<a href='" + strFirstPage + "'><FONT color=red>首页</FONT></a>&nbsp;&nbsp;<a href='" + strPrevPage + "'><FONT color=red>上一页</FONT></a>&nbsp;&nbsp;";
                strHind 
= "<a href='" + strNextPage + "'><FONT color=red>下一页</FONT></a>&nbsp;&nbsp;<a href='" + strLastPage + "'><FONT color=red>尾页</FONT></a>&nbsp;&nbsp;";
                
if(intPageNumber == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    strFore 
= "首页&nbsp;&nbsp;上一页&nbsp;&nbsp;";
                    strHind 
= "<a href='" + strNextPage + "'><FONT color=red>下一页</FONT></a>&nbsp;&nbsp;<a href='" + strLastPage + "'><FONT color=red>尾页</FONT></a>&nbsp;&nbsp;";
                }

                
else if(intPageNumber == intPageCount)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    strFore 
= "<a href='" + strFirstPage + "'><FONT color=red>首页</FONT></a>&nbsp;&nbsp;<a href='" + strPrevPage + "'><FONT color=red>上一页</FONT></a>&nbsp;&nbsp;";
                    strHind 
= "下一页&nbsp;&nbsp;尾页&nbsp;&nbsp;";
                }

                
if(intPageCount == 0 || intPageCount == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    strFore 
= "首页&nbsp;&nbsp;上一页&nbsp;&nbsp;";
                    strHind 
= "下一页&nbsp;&nbsp;尾页&nbsp;&nbsp;";
                }

                
string strTheLink = "[分页统计]共 <FONT color=red>" + intPageCount.ToString() + "</FONT> 页 <FONT color=red>" + strLogCount + "</FONT> 条记录&nbsp;&nbsp;每页 <FONT color=red>" + strPageSize + "</FONT> 条记录&nbsp;&nbsp;" + strFore + strHind + "当前第 <FONT color=red>" + intPageNumber.ToString() + "</FONT> 页";
                
return strTheLink;
            }


            
public DataTable PageDataBind()//核心取值函数
ExpandedSubBlockStart.gifContractedSubBlock.gif
            {
                DataTable dt 
= new DataTable();
                DBClient newDBClient 
= CreateDBClient.GetDBClient(strConnection,strDBType);
                
if(intPageNumber == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    dt 
= newDBClient.GetDataTable(strPageSQL1);
                }

                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    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数据操作组件(百万分页) ,实用环境:Asp+DLL+MsSQL(这个网上很多地方都可以下载),并且其中结合SQL存储过程,实话以前SQL存储过程接触的比较少,所以在调试该组件的时候遇到了一些问题,并试着改了一下(作者别生气(^..^)),高手们别笑话我。 原代码如下: 有分页列表数据: cls.tblName="Tablename" '表名 cls.fldName="Id" '排序关键字段 cls.PageIndex=Request("P")*1 '当前页码 cls.PageSize=20 '每页列数 cls.OrderType=1 '排序方式,0 、1 cls.strWhere=StrW '查询条件,不带Where cls.ListUrl="?Y="&Y&"&M="&M&"&D="&D&"&Sn="&Sn&"&P=" 分页URL Set Rs=cls.Result do while not rs.eof rs.movenext loop 分页数据 cls.page 在原文的使用明中,在翻页代码中对表查询默认是全部字段也就是*,这样是不是会浪费资源,而无法查询需要的字段,于是我在DLL代码中新加入一个变量名为zdName,作为传递可控制查询条件的变量,同时在SQL存储过程中也加入相应的接受变量@zdName 字符型。 在这个小问题解决后,又在使用上发现cls.strWhere付给它的变量StrW 如果条件变量其中带有类似 例如 a='b'则执行SQL存储过程时候会提示错误,后来发现是DLL代码中: sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",'" & strWhere & "' " 这个地方是否写的不够严谨,在StrW中如果含有单引,那么将无法执行,所以我在DLL的VB代码改成 If InStr(strWhere, "'") 0 Then sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",""" & strWhere & """ " Else sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",'" & strWhere & "' " End If 试了试目前的问题确实解决了,这个组件我也是刚刚使用,希望对大家能有点帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值