MIS2000 Lab. -- ASP.NET学习&分享 / ASP.NET案例精编(清华大学出版社)
您好,我来自台湾。很高兴与各位分享一些成果。希望对您有帮助。出版书籍是「ASP.NET案例精编 / 清华大学出版社」。

这是我的文章备份,原文请看我的网站:

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>搜寻数据库:&nbsp;&nbsp; (共计" & 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("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href='http://127.0.0.1/'>[首页]</a></b>&nbsp;& nbsp;&nbsp;&nbsp;&nbsp;&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程序,大多来自于这个模板,

[ADO.NET] DataReader的标准范例 for ASP.NET (Code Behind版)

              请您参考一下: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程序觉得很困难,那是正常的,请不要灰心。

没有人能不经学习,就能一次搞定。

只要有人、有书本带着您走一遍,这都很简单。

posted on 2011-05-20 17:25  MIS2000 Lab.  阅读(322)  评论(0编辑  收藏  举报


ASP.NET案例精编——适用于VS 2005/2008(配光盘)
 

当当网购买 http://product.dangdang.com/product.aspx?product_id=20583373&ref=search-1-pub