ASP.NET处理数据分页
<p >在ASP的数据库编程的时,由于浏览器的大小限制,在要浏览的数据记录比较多的时候,为了达到更直观的效果,我们把这些数据记录分成若干的页面,通过数据导航按钮(或者其他超链接),分页的浏览。其实这种数据记录的分页浏览在ASP.NET也能够实现。并且在实现的过程中比起在ASP的处理过程显得条理更清晰,也更容易些。<p >通过浏览器进行分页浏览数据记录基本类型主要有二种。其他类型的分页浏览要么是对这二种类型的修改,要么是对这二种类型的综合。具体表现方式的如下面这二幅图:<p >图01:第一种分页浏览数据记录式样<p ><ccid_nobr><center><imgsrc="http://www.hh010.com/upload_files/article/244/9_5qzsya13263.gif"></center></ccid_nobr><p >图02:第二种分页浏览数据记录式样<p ><ccid_nobr><center><imgsrc="http://www.hh010.com/upload_files/article/244/9_7vohbb13264.gif"></center></ccid_nobr><p >下面就来探讨一下在ASP.NET中这二种分页浏览数据记录的具体实现过程:<p >首先来介绍一下我们使用的数据库,在本文中为了方便起见,我们使用了本地数据库Access 2000,数据库名称为"Data.mdb",里面存放了一张数据表"tblItem"。此数据表的结构如下:<p ><ccid_nobr><table border="1" cellpadding="0" cellspacing="0"bordercolor="#111111" width="550" ><tr><td>字段名称</td><td>字段类型</td></tr><tr><td>ItemID</td><td>自动编号</td></tr><tr><td>ItemName</td><td>文本类型</td></tr></table></ccid_nobr><p >如果你采用的是别的数据库,只需对下面介绍的程序进行简单的修改就可以了。这将在下面介绍。<p ><ccid_nobr><Strong>一. 本文程序设计和运行的软件环境:</strong></ccid_nobr><p >(1).微软公司视窗2000服务器版<p >(2)..Net FrameWork SDK Beta 2<p ><ccid_nobr><Strong>二. 第一种分页浏览数据记录的关键步骤以及实现方法:</strong></ccid_nobr><p >(1).首先要得到初始浏览数据记录的超链接字符串:<p >这其实很关键,因为在第一种分页浏览中的"首页"、"下一页"等操作,都是通过在这个超链接字符串后面加入要浏览页面的参数来实现的,在本文的程序中是通过GetPageName ( )函数来实现的。此函数具体如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> Function GetPageName ( ) As String<br> Dim Str As String<br> Dim Pos As Short<br> Str = Request.ServerVariables ( "Script_Name" ).Trim ( )<br> Pos = Str.LastIndexOf ( "/" )<br> If Pos >= 0 Then<br> Return Str.SubString ( Pos + 1 )<br> Else<br> Return Str<br> End If<br> End Function </td></tr></table></ccid_nobr><p >(2).要得到你所要浏览的数据记录总数:<p >在本文中,为了方便,我们是把数据表"tblItem"中的全部记录都拿来浏览。ASP.NET页面通过ADO.NET来得到数据表"tblItem"。下面代码就是利用ADO.NET来得到"tblItm"表中记录总数的程序代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> <% @ Page Language = "VB" %><br> <% @ Import Namespace = "System.Data" %><br> <% @ Import Namespace = "System.Data.OleDb" %><br> <script runat = "server" ><br> Dim strConn As String '定义数据连接字符串 <br> Dim SQL As String '定义SQL语句<br> Dim odConn As OleDbConnection<br> Dim odAdapt As OleDbDataAdapter<br> Dim DS As DataSet '创建DataSet对象<br> Dim DT As DataTable '创建DataTable对象<br> Dim nStart As Integer '存放当前页面的起始记录序号<br> Dim nEnd As Integer '存放当前页面的终止记录序号<br> Dim i As Integer <br><br> '确认要浏览的页面序号<br> nPage = Convert.ToInt32 ( Request.QueryString ( "Page" ) )<br> SQL = "SELECT * FROM tblItem "<br> <br> '创建数据连接字符串<br> strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; " & _<br> " Data Source = " & Server.MapPath ( "data.mdb" ) & " ; " & _<br> " User ID = ; Password = ; "<br> Try<br> '得到数据记录总数<br> odConn = New OleDbConnection ( strConn )<br> odAdapt = New OleDbDataAdapter ( SQL , odConn )<br> DS = New DataSet<br> odAdapt.Fill ( DS )<br> DT = DS.Tables ( 0 )<br> '得到数据记录总数<br> nRecCount = DT.Rows.Count<br> Catch e As Exception<br> Response.Write("错误信息: <b>" & e.Message & "</b><p>")<br> nRecCount = 0<br> End Try<br> </script ></td></tr></table></ccid_nobr><p >(3).计算出浏览的数据记录总共页面数:<p >在浏览页面中,我们发现了每一页只浏览5条记录,你可以通过修改程序中定义一个常量"Record_Per_Page"来改变每一页浏览数据记录的个数。在知道了要浏览数据记录的总数后,通过下面代码来计算出要显示这些数据记录所需要的页面总数:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> Const Record_Per_Page As Short = 5 '定义每一页显示的记录数<br> Dim nPageCount As Integer '保存总共的数据页面数目<br> Dim nPage As Integer '存放要浏览当前数据页面号<br> nPageCount = nRecCount \ Record_Per_Page<br> If nRecCount Mod Record_Per_Page > 0 Then<br> nPageCount += 1<br> End If<br> '确认浏览命令中的页面参数是否越界,如果越界则重置页面序号<br> If nPage < 1Then<br> nPage = 1 <br> End If<br> IfnPage > nPageCount Then<br> nPage = nPageCount <br> End If </td></tr></table></ccid_nobr><p >(4).数据导航的实现方法:<p >其实数据导航是通过对参数"Page"赋值来实现的,其中程序中的"nPage"是当前数据页面序号, "nPageCount"是数据页面的总和。下面是实现这些数据导航的具体实现代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> Response.Write ( " <p >数据导航:<A HREF = """ & Script_Name & _<br> "?Page=" & ( 1 ).ToString ( ) & _<br> """>首页 </A >" )<br> Response.Write( " &nbsp;&nbsp;&nbsp;&nbsp; " )<br> '浏览"上一页"处理办法<br> Response.Write ( " <A HREF = """ & Script_Name & _<br> "?Page=" & ( nPage - 1 ).ToString ( ) & _<br> """ >上一页</A > " )<br> Response.Write ( "&nbsp;&nbsp;&nbsp;&nbsp; " )<br> '浏览"下一页"处理办法<br> Response.Write ( "<A HREF =""" & Script_Name &_<br> "?Page=" & ( nPage + 1 ).ToString ( ) & _<br> """ >下一页</A > " )<br> Response.Write ( "&nbsp;&nbsp;&nbsp;&nbsp;" )<br> '浏览"尾页"处理办法<br> Response.Write ( "<A HREF = """ & Script_Name &_<br> "?Page=" & ( nPageCount ).ToString ( ) & _<br> """ >尾页</A > " )<br> '显示当前页和合计页数<br> Response.Write ( "&nbsp;&nbsp;&nbsp;&nbsp;" & "页次:"& nPage.ToString ( )& "/" & nPageCount.ToString ( ) & " <br > " ) </td></tr></table></ccid_nobr><p >(5).显示不同页面的数据记录:<p >根据超链接字符串得到"Page"值,然后根据此值来得到在此页面中要显示的起始记录号和结束记录号,再通过一个循环把这些记录给显示出来。下面这行代码是读取参数"Page":<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> nPage = Convert.ToInt32 ( Request.QueryString ( "Page" ) ) </td></tr></table></ccid_nobr><p >下面这些代码是根据用户想要去的页面得到起始记录号和结尾记录号,并通过屏幕显示出来:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> Dim nStart As Integer '存放当前页面的起始记录序号<br> Dim nEnd As Integer '存放当前页面的终止记录序号<br> Dim i As Integer <br> nStart = Record_Per_Page *( nPage - 1 )<br> nEnd = nStart + Record_Per_Page - 1<br> If nEnd > nRecCount - 1 Then<br> nEnd = nRecCount - 1<br> End If<br> '在屏幕中输出记录<br> For i = nStart To nEnd<br> Response.Write ( DT.Rows ( i ) ( "ItemName" ) & " <br > " )<br> Next<br> </td></tr></table></ccid_nobr>在本文介绍的二种分页浏览记录类型中,对于数据显示,我们采用了简化处理。我们知道在浏览器上,浏览记录一般都是通过DbGrid的形式来实现的,这一点在其实也好实现,读者只需稍微修改一下本文中的程序代码就可以实现。<p ><ccid_nobr><Strong>三. 第一种分页浏览数据记录的完整程序代码(no1.aspx):</strong></ccid_nobr><p >组织一下上面的这些步骤的实现方法,可以得到下列完整代码:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> <% @ Page Language = "VB" %><br> <% @ Import Namespace = "System.Data" %><br> <% @ Import Namespace = "System.Data.OleDb" %><br> <script runat = "server" ><br> Const Record_Per_Page As Short = 5 '定义每一页显示的记录数<br> Private Script_Name As String <br><br>Sub Page_Load ( Source As Object , e As EventArgs )<br> Script_Name = GetPageName ( )<br> '第一种方式来分页显示数据<br> ShowRecords ( )<br> End Sub<br> '得到起始浏览超链接字符串<br> Function GetPageName ( ) As String<br> Dim Str As String<br> Dim Pos As Short<br> Str = Request.ServerVariables ( "Script_Name" ).Trim ( )<br> Pos = Str.LastIndexOf ( "/" )<br> If Pos >= 0 Then<br> Return Str.SubString ( Pos + 1 )<br> Else<br> Return Str<br> End If<br> End Function<br><br> '此函数的功能是分页显示数据库中的记录<br> Private Sub ShowRecords ( )<br> Dim strConn As String '定义数据连接字符串 <br> Dim SQL As String '定义SQL语句<br> Dim odConn As OleDbConnection<br> Dim odAdapt As OleDbDataAdapter<br> Dim DS As DataSet '创建DataSet对象<br> Dim DT As DataTable '创建DataTable对象<br> Dim nRecCount As Integer '保存记录总数<br> Dim nPageCount As Integer '保存总共的数据页面数目<br> Dim nPage As Integer '存放要浏览当前数据页面号<br> Dim nStart As Integer '存放当前页面的起始记录序号<br> Dim nEnd As Integer '存放当前页面的终止记录序号<br> Dim i As Integer <br><br> '确认要浏览的页面序号<br> nPage = Convert.ToInt32 ( Request.QueryString ( "Page" ) )<br> SQL = "SELECT * FROM tblItem "<br><br> '创建数据连接字符串<br> strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; " & _<br> " Data Source = " & Server.MapPath ( "data.mdb" ) & " ; " & _<br> " User ID = ; Password = ; "<br> Try<br> '得到数据记录总数<br> odConn = New OleDbConnection ( strConn )<br> odAdapt = New OleDbDataAdapter ( SQL , odConn )<br> DS = New DataSet<br> odAdapt.Fill ( DS )<br> DT = DS.Tables ( 0 )<br> nRecCount = DT.Rows.Count<br> Catch e As Exception<br> Response.Write("错误信息: <b>" & e.Message & "</b><p>")<br> nRecCount = 0<br> End Try<br><br> '判断是否存在数据记录<br> If nRecCount > 0 Then<br> ' 确定数据记录要显示的页面数<br> nPageCount = nRecCount \ Record_Per_Page<br> If nRecCount Mod Record_Per_Page > 0 Then<br> nPageCount += 1<br> End If<br><br> '确认浏览命令中的页面参数是否越界,如果越界则重置页面序号<br> If nPage < 1Then<br> nPage = 1 <br> End If<br> IfnPage > nPageCount Then<br> nPage = nPageCount <br> End If<br><br> Response.Write ( "总共有数据记录" & nRecCount.ToString ( ) & " 条" & "。<br >" )<br> Response.Write(" <p > <b >第一种分页显示为:</b > <p > " )<br><br> '确认当前页面的开始记录和终止记录<br> nStart = Record_Per_Page *( nPage - 1 )<br> nEnd = nStart + Record_Per_Page - 1<br> If nEnd > nRecCount - 1 Then<br> nEnd = nRecCount - 1<br> End If<br> '在屏幕中输出记录<br> For i = nStart To nEnd<br> Response.Write ( DT.Rows ( i ) ( "ItemName" ) & " <br > " )<br> Next<br> End If<br> '浏览"首页"处理办法<br> Response.Write ( " <p >数据导航:<A HREF = """ & Script_Name & _<br> "?Page=" & ( 1 ).ToString ( ) & _<br> """>首页 </A >" )<br> Response.Write( " &nbsp;&nbsp;&nbsp;&nbsp; " )<br> '浏览"上一页"处理办法<br> Response.Write ( " <A HREF = """ & Script_Name & _<br> "?Page=" & ( nPage - 1 ).ToString ( ) & _<br> """ >上一页</A > " )<br> Response.Write ( "&nbsp;&nbsp;&nbsp;&nbsp; " )<br> '浏览"下一页"处理办法<br> Response.Write ( "<A HREF =""" & Script_Name &_<br> "?Page=" & ( nPage + 1 ).ToString ( ) & _<br> """ >下一页</A > " )<br> Response.Write ( "&nbsp;&nbsp;&nbsp;&nbsp;" )<br> '浏览"尾页"处理办法<br> Response.Write ( "<A HREF = """ & Script_Name &_<br> "?Page=" & ( nPageCount ).ToString ( ) & _<br> """ >尾页</A > " )<br> '显示当前页和合计页数<br> Response.Write ( "&nbsp;&nbsp;&nbsp;&nbsp;" & "页次:"& nPage.ToString ( )& "/" & nPageCount.ToString ( ) & " <br > " )<br> End Sub<br> </script ></td></tr></table></ccid_nobr><p ><ccid_nobr><Strong>四. 第二种分页浏览数据记录的关键步骤以及实现方法:</strong></ccid_nobr>其实这二种分页方法在程序设计中是大同小异的,在第二种方法中,其前面的关键步骤中和第一种分页几乎相同,也是要得到浏览数据记录的总数,设定每一页要显示的数据记录个数,计算出总共有多少数据页面等等。这些步骤的实现方法可以参考第一种方法。第二种分页方法和第一种分页方法的主要区别在于数据导航的实现方法上。下列代码功能是实现第二种分页方法数据导航:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> Response.Write ( " <p > 数据导航: " )<br> nPageEnd = nPage + 3<br> If nPageEnd > nPageCount<br> nPageEnd = nPageCount<br> End If<br> For i = 1 To nPageEnd<br> If i = nPage Then<br> Response.Write ( " <b > " & i.ToString ( ) & " </b > " )<br> Else<br> Response.Write ( "<A HREF = """ & SCRIPT_NAME & _<br> "?Page=" & ( i ).ToString ( )& _<br> """ > " & i.ToString ( ) & "</A > " )<br> End If<br> Next<br> <br> If nPageEnd < nPageCount Then<br> Response.Write ( "<A HREF = """ & SCRIPT_NAME & _<br> "?Page=" & ( nPageEnd + 1 ).ToString ( ) & _<br> """ >更多...</A > " )<br> End If </td></tr></table></ccid_nobr><p ><ccid_nobr><Strong>五. 第二种分页浏览数据记录的完整源程序代码(no2.aspx):</strong></ccid_nobr><p >no2.aspx和no1.aspx在程序设计的思想和方法上大致相同,下面是no2.aspx的源程序,具体如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> <% @ Page Language = "VB" %><br> <% @ Import Namespace = "System.Data" %><br> <% @ Import Namespace = "System.Data.OleDb" %><br> <br> <script runat = "server" ><br> Const Record_Per_Page As Short = 5 '定义每一页显示的记录数<br> Private Script_Name As String <br><br>Sub Page_Load ( Source As Object , e As EventArgs )<br> Script_Name = GetPageName ( )<br> '第二种方式来分页显示数据<br> ShowRecords ( )<br> End Sub<br> <br> '得到起始浏览超链接字符串<br> Function GetPageName ( ) As String<br> Dim Str As String<br> Dim Pos As Short<br> Str = Request.ServerVariables ( "Script_Name" ).Trim ( )<br> Pos = Str.LastIndexOf ( "/" )<br> If Pos >= 0 Then<br> Return Str.SubString ( Pos + 1 )<br> Else<br> Return Str<br> End If<br> End Function<br> <br> Private Sub ShowRecords ( )<br> Dim strConn As String '定义数据连接字符串 <br> Dim SQL As String '定义SQL语句<br> Dim odConn As OleDbConnection<br> Dim odAdapt As OleDbDataAdapter<br> Dim DS As DataSet '创建DataSet对象<br> Dim DT As DataTable '创建DataTable对象<br> Dim nRecCount As Integer '保存记录总数<br> Dim nPageCount As Integer '保存总共的数据页面数目<br> Dim nPage As Integer '存放要浏览当前数据页面号<br> Dim nStart As Integer '存放当前页面的起始记录序号<br> Dim nEnd As Integer '存放当前页面的终止记录序号<br> Dim nPageEnd As Integer '存储当前页面的最后一面的序号<br> Dim i As Integer <br> '确认要浏览的页面序号<br> nPage = Convert.ToInt32 ( Request.QueryString ( "Page" ) )<br> SQL = "SELECT * FROM tblItem "<br> <br> '创建数据连接字符串<br> strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; " & _<br> " Data Source = " & Server.MapPath ( "data.mdb" ) & " ; " & _<br> " User ID = ; Password = ; "<br> Try<br> '得到数据记录总数<br> odConn = New OleDbConnection ( strConn )<br> odAdapt = New OleDbDataAdapter ( SQL , odConn )<br> DS = New DataSet<br> odAdapt.Fill ( DS )<br> DT = DS.Tables ( 0 )<br> nRecCount = DT.Rows.Count<br> Catch e As Exception<br> Response.Write("错误信息: <b >" & e.Message & "</b > <p > " )<br> nRecCount = 0<br> End Try<br> <br> If nRecCount > 0 Then<br> ' 确定数据记录要显示的页面数<br> nPageCount = nRecCount \ Record_Per_Page<br> If nRecCount Mod Record_Per_Page > 0 Then<br> nPageCount += 1<br> End If<br> <br> '确认浏览命令中的页面参数是否越界,如果越界则重置页面序号<br> If nPage < 1Then<br> nPage = 1 <br> End If<br> IfnPage > nPageCount Then<br> nPage = nPageCount <br> End If<br> <br> Response.Write ( "总共有数据记录" & nRecCount.ToString ( ) & " 条" & "。<br >" )<br> Response.Write(" <p > <b >第二种分页显示为:</b > <p > " )<br> <br> '确认当前页面的开始记录和终止记录<br> nStart = Record_Per_Page *( nPage - 1 )<br> nEnd = nStart + Record_Per_Page - 1<br> If nEnd > nRecCount - 1 Then<br> nEnd = nRecCount - 1<br> End If<br> '在屏幕中输出记录<br> For i = nStart To nEnd<br> Response.Write ( DT.Rows ( i ) ( "ItemName" ) & " <br > " )<br> Next<br> End If<br> Response.Write ( " <p > 数据导航: " )<br> nPageEnd = nPage + 3<br> If nPageEnd > nPageCount<br> nPageEnd = nPageCount<br> End If<br> For i = 1 To nPageEnd<br> If i = nPage Then<br> Response.Write ( " <b > " & i.ToString ( ) & " </b > " )<br> Else<br> Response.Write ( "<A HREF = """ & SCRIPT_NAME & _<br> "?Page=" & ( i ).ToString ( )& _<br> """ > " & i.ToString ( ) & "</A > " )<br> End If<br> Next<br> <br> If nPageEnd < nPageCount Then<br> Response.Write ( "<A HREF = """ & SCRIPT_NAME & _<br> "?Page=" & ( nPageEnd + 1 ).ToString ( ) & _<br> """ >更多...</A > " )<br> End If<br> End Sub<br> </script ></td></tr></table></ccid_nobr><p >本文介绍的这二种分页浏览记录类型虽然采用的数据库都是本地数据库,但对其他类型的数据库也是一样适用的,这只需要修改一下数据连接字符串就可以实现了,譬如如果采用了SQL Server数据库。此SQL Server数据库服务器是"Server1",数据库是"Data",用户名为缺省的"sa",没有设定密码。只需要把上面二段程序中的字符串"strConn"变换成:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="0" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"> strConn = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = Data ; Data Source = server1 " </td></tr></table></ccid_nobr><p >就可以实现了。<p ><ccid_nobr><Strong>六. 总结:</strong></ccid_nobr><p >本文介绍的二种分页浏览数据记录方法在ASP.NET数据库编程方面是非常有用的,因为在数据处理方面,分页显示记录比起其他的一些处理,譬如:数据修改、删除等都要难些。希望上面的这些内容对你利用ASP.NET开发数据库程序有所帮助。<p ><p >(责任编辑 <ccid_nobr>赵正北</ccid_nobr>) <p align="center"></p></p>
页:
[1]