這是我的文章備份,原文請看:

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

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)

 

 

(1).  簡單地說,修改的地方只有在「第三步驟」,把資料呈現在畫面上。

        我們在此使用 Repeater or ListView來呈現。 (執行成果 如下圖)

        而不是上一個範例 必須自己一列一列慢慢寫程式的 While.....End While方式 (這種作法主要是搭配美工人員的HTML)。

 

        HTML設計畫面如下:

01        <asp:Repeater ID="Repeater1" runat="server">
02             <HeaderTemplate>
03                 <div align="center">
04                 <table border="1" width="90%">
05                   <tr>
06                     <td><b>id</b></td>
07                     <td><b>Date & Time</b></td>
08                     <td><b>Title</b></td>
09                     <td><b>Summary</b></td>
10                   </tr>
11             </HeaderTemplate>
12  
13             <ItemTemplate>
14                 <tr>
15                   <td><small> <span style="background-color:#ffa07a;"><%#DataBinder.Eval(Container.DataItem, "id")%></span> </small></td>
16                   <td><small> <span style="background-color:#ffa07a;"><%#DataBinder.Eval(Container.DataItem, "test_time", "{0:yyyy/MM/dd}")%></span> </small></td>
17                   <td> <b><span style="background-color:#ffa07a;"><%#DataBinder.Eval(Container.DataItem, "title")%></span> </b></td>
18                   <td align="left"> <small><span style="background-color:#ffa07a;"><%# DataBinder.Eval(Container.DataItem, "summary") %></span> </small></td>
19                 </tr>
20             </ItemTemplate>
21  
22             <FooterTemplate>
23                 </table>
24                 </div>
25             </FooterTemplate>
26         </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 @A " and @B"
        '==SQL指令的 ROW_NUMBER。參考資料: http://technet.microsoft.com/zh-tw/library/ms186734.aspx

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

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

       cmd1.Parameters.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程式,大多來自於這個範本,

              請您參考一下: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) yahoo.com.台灣......





 

arrow
arrow
    全站熱搜

    MIS2000 Lab 發表在 痞客邦 留言(0) 人氣()