[習題]上集 Ch 14-4 (Repeater與 ListView版) -- 撰寫ADO.NET DataReader的分頁程式#2(搭配SQL指令 ROW_NUMBER)

把之前的範例,改成 Repeater來呈現畫面而已。
變動不大。僅供參考。





 

這個範例,是從這篇文章稍作變化而來:

[習題]上集 Ch 14-4 撰寫ADO.NET DataReader的分頁程式#1(搭配SQL指令 ROW_NUMBER)

 

 

(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 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 @A and @B"
        '==SQL指令的 ROW_NUMBER。參考資料: http://technet.microsoft.com/zh-tw/library/ms186734.aspx

       Dim cmd1 As SqlCommand = New SqlCommand(SqlStr, Conn)

        cmd1.Parameter.AddWithValue("@A", (NowPageCount+1) )

        cmd1.Parameter.AddWithValue("@B", (NowPageCount + PageSize))

        dr = cmd1.ExecuteReader()

 

        If dr.HasRows Then
            haveRec = True

            '*** 第三,自由發揮,透過 Repeater呈現畫面。 ****
            Repeater1.DataSource = dr
            Repeater1.DataBind()
            '********************************************
如果您想改成 ListView or GridView,都行!!

        End If

          '---  如果您想要 C# 版範例,請打開 C#書本「上集」(光碟裡面有這支程式的原版)。拿他來改,修改幅度很小。

          '---  如果連這麼小幅度的修改(從 VB改成 C#)都作不到.....那就  Orz...

          '--- 請看本文後續發展: [給讀者的話]軟土深掘

        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 or ViewState來傳遞頁數,那就安心多了。

 

 

這是給 書本(ASP.NET專題實務)  "上集" 的讀者,提供的補充習題。

當作 Ch. 12  與  Ch. 14的補充範例。

 

..................................................................................................................................................................

如果您想把這段程式集結成一個  function,可以參考下面的作法:

    protected void Page_Load(object sender, EventArgs e)
    {
        mis2000Lab_Page(GridView1);
        // 您可以輸入任何一種大型控制項
    }
 
    protected void mis2000Lab_Page(System.Web.UI.WebControls.BaseDataBoundControl uControl)
    {
        ......
    }

..................................................................................................................................................................

 

 

如果您「第一次」看這種 ADO.NET程式覺得很困難,那是正常的,請不要灰心。

沒有人能不經學習,就能一次搞定。

 

只要有人、有書本帶著您走一遍,這都很簡單。

 

 

 

===  最後要打一下廣告  ==========================

 

1.  如果您覺得我的描述、寫作方式,符合您的胃口。

2.  如果您看完以後,知道我寫書、介紹一些控制項或是技術........不是「混過去」、「帶過去」而已,而是真真確確地蒐集 "有用的範例",讓您學得更深入!

3.  如果您覺得:我出完書以後,還不定期地提供售後服務,提供補充教材......這樣的互動是 "良性"的,是值得鼓勵的。......已經推出 兩百多篇 補充範例了

4. 如果您(尤其是學生)真的想把基礎學好,而不是 "混"過這一門課就好、而不是寫個(畢業專題的)屍體出來交差(能畢業就好).....那麼.......

 

請您購買下面的書籍,

東西多到您學不完

上 / 下兩集,兩本書的厚度(我蒐集的各種範例)將近 兩千頁 !!......絕對不會讓您失望

 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

寫信給我,不要私訊 --  mis2000lab (at) yahoo.com.台灣  或  school (at) mis2000lab.net



ASP.NET遠距教學、線上課程(Web Form + MVC)。 第二門 課程「四折」-- 以MVC課程 作優惠。
第一天課程, "完整" 試聽。  如不滿意  全額退費!
................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ

*********************************************************************************************

*** ASP.NET MVC線上課程 第一天 免費看 (5.5小時) *** 

************************************************************(歡迎索取,免費申請)*****

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

......................................................................................................................................................

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

    MIS2000 Lab.  線上教學影片(YouTube) **免費觀賞**