这是我的文章备份,原文请看我的网站:
http://www.dotblogs.com.tw/mis2000lab/archive/2011/05/20/datareader_paging_row_number_repeater.aspx
这个范例,是从这篇文章稍作变化而来:
[习题]上集 Ch 14-4 撰写ADO.NET DataReader的分页程序#1(搭配SQL指令 ROW_NUMBER)
ASP.NET案例精编——适用于VS 2005/2008(配光盘)
當當網購買 http://product.dangdang.com/product.aspx?product_id=20583373&ref=search-1-pub
(1). 简单地说,修改的地方只有在「第三步骤」,把数据呈现在画面上。
我们在此使用 Repeater or ListView来呈现。 (执行成果 如下图)
而不是上一个范例 必须自己一列一列慢慢写程序的 While.....End While方式 (这种作法主要是搭配美工人员的HTML)。
HTML设计画面如下:
<asp:Repeater ID="Repeater1" runat="server"> <HeaderTemplate> <div align="center"> <table border="1" width="90%"> <tr> <td><b>id</b></td> <td><b>Date & Time</b></td> <td><b>Title</b></td> <td><b>Summary</b></td> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><small> <%#DataBinder.Eval(Container.DataItem, "id")%> </small></td> <td><small> <%#DataBinder.Eval(Container.DataItem, "test_time", "{0:yyyy/MM/dd}")%> </small></td> <td> <b><%#DataBinder.Eval(Container.DataItem, "title")%> </b></td> <td align="left"> <small><%# DataBinder.Eval(Container.DataItem, "summary") %> </small></td> </tr> </ItemTemplate> <FooterTemplate> </table> </div> </FooterTemplate> </asp:Repeater>
(2). 另外,我发现原本的SQL指令有一个 Bug,在此作了修正。
其余程序都没变化。谢谢。
=======================================================================
Imports System.Data
Imports System.Data.SqlClient
Protected Sub Page_Load(ByVal
sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim haveRec = False
Dim p As String = Request("p")
Dim Conn As SqlConnection = New SqlConnection("你的数据库连结字符串;MultipleActiveResultSets=True")
'-- 使用多重结果集(MARS)
Conn.Open()
Dim cmd As SqlCommand = New SqlCommand("select count(id) from test",
Conn)
'---每页展示 5笔资料
Dim PageSize
As Integer = 5
Dim RecordCount
As Integer = CType(cmd.ExecuteScalar().ToString, Integer)
cmd.Cancel()
If RecordCount = 0 Then
Response.Write("<h2>抱歉!无法找到您需要的数据!</h2>")
Conn.Close()
Response.End()
End If
Dim Pages As
Integer = 0
Pages = ((RecordCount + PageSize) - 1) \ PageSize
If IsNumeric(Request("p")) Then
If Request("p") <> "" And CInt(Request("p")) > 0 And CInt(Request("p"))
<= Pages Then
p = CInt(Request("p"))
Else
p = 1
End If
Else
p = 1
End If
Dim NowPageCount
As Integer = 0
If (p > 0) Then
NowPageCount = (p - 1) * PageSize
End If
Response.Write("<h3>搜寻数据库: (共计" & RecordCount & "笔 / 共需" &
Pages & "页)</h3>")
Response.Write("<hr width='97%' size='1'>")
Dim html_sb As New StringBuilder
'-- StringBuilder的用法,请参考
http://msdn2.microsoft.com/zh-tw/library/system.text.stringbuilder(VS.80).aspx
html_sb.Append("<table border=0 width='95%'>")
Dim dr As SqlDataReader = Nothing
'-- 批注: 2011/5/20,以下的程序略有修改。
Dim SqlStr As String =
"Select
test_time, id, title, summary
from (select ROW_NUMBER() OVER(ORDER BY id) AS 'RowNo', * from test) as t
where t.RowNo between " &
(NowPageCount+1) & " and " &
(NowPageCount + PageSize)
'==SQL指令的 ROW_NUMBER。参考数据:
http://technet.microsoft.com/zh-tw/library/ms186734.aspx
Dim cmd1 As SqlCommand = New SqlCommand(SqlStr, Conn)
dr = cmd1.ExecuteReader()
If dr.HasRows Then
haveRec = True
'*** 第三,自由发挥,透过 Repeater呈现画面。 ****
Repeater1.DataSource = dr
Repeater1.DataBind()
'********************************************
如果您想改成 ListView or
GridView,都行!!
End If
While (dr.Read())
haveRec = True
html_sb.Append("<tr><td WIDTH='12%' valign=top><font size='2'
color=#800000>★(" & dr.Item("test_time").ToString() & ")</font></td>")
html_sb.Append("<td WIDTH='88%'><a href='Default_Disp.aspx?id=" &
dr.Item("id").ToString() & "'><b>" & dr.Item("title").ToString() &
"</b></a></td></tr>")
html_sb.Append("<tr><td WIDTH='12%'></td><td WIDTH='88%'><font
color='#666666' size='2'>" & dr.Item("summary").ToString() &
"</font></td></tr>")
html_sb.Append("<tr><td colspan='2' height='12'> </td></tr>")
End While
html_sb.Append("</table>")
If (haveRec) Then
Response.Write(html_sb.ToString())
If (Pages > 0) Then
Response.Write("<div align='center'>")
If (p > 1) Then
Response.Write("<a
href='Advanced_Page_10_mis2000lab_DataReader_Row_Number.aspx?p=" & (p - 1) &
"'>[<<<上一页]</a>")
End If
Response.Write(" <b><a
href='http://127.0.0.1/'>[首页]</a></b> & nbsp; ")
If (p < Pages) Then
Response.Write("<a
href='Advanced_Page_10_mis2000lab_DataReader_Row_Number.aspx?p=" & (p + 1) &
"'>[下一页>>>]</a>")
End If
'========= MIS2000
Lab.自制的「每十页」一间隔,分页功能=========start====
Response.Write("<hr width='97%' size=1>")
'==
这里跟书本一样,只需修改超级链接的「文件名称」即可(请配合书本的范例,COPY上来即可)
'========= MIS2000 Lab.自制的「每十页」一间隔,分页功能=========end====
End If
End If
cmd1.Cancel()
dr.Close()
Conn.Close()
End Sub
=======================================================================
上面的 DataReader程序,大多来自于这个模板,
请您参考一下:http://www.dotblogs.com.tw/mis2000lab/archive/2008/04/24/3446.aspx
这个程序最大的缺点就是「分页的页数」,透过 HTTP Get来传递,
必须注意 SQL Injection(数据隐码)攻击。
如果您可以改成 Session来传递页数,那就安心多了。
这是给 书本(ASP.NET专题实务) "上集" 的读者,提供的补充习题。
当作 Ch. 12 与 Ch. 14的补充范例。
如果您「第一次」看这种 ADO.NET程序觉得很困难,那是正常的,请不要灰心。
没有人能不经学习,就能一次搞定。
只要有人、有书本带着您走一遍,这都很简单。
....................................................................................................寄信给我 mis2000lab (at)雅虎.com.台湾 ........
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)
![ASP.NET案例精编--适用于VS2005/2008](http://images.china-pub.com/ebook45001-50000/46063/zcover.jpg)