這是我的文章備份,原文請看:
[習題]上集 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 |
07 | < td >< b >Date & Time |
08 | < td >< b >Title |
09 | < td >< b >Summary |
10 |
|
11 |
|
12 |
13 | < ItemTemplate > |
14 | < tr > |
15 | < td >< small > < span style = "background-color:#ffa07a;" ><%#DataBinder.Eval(Container.DataItem, "id")%> |
16 | < td >< small > < span style = "background-color:#ffa07a;" ><%#DataBinder.Eval(Container.DataItem, "test_time", "{0:yyyy/MM/dd}")%> |
17 | < td > < b >< span style = "background-color:#ffa07a;" ><%#DataBinder.Eval(Container.DataItem, "title")%> |
18 | < td align = "left" > < small >< span style = "background-color:#ffa07a;" ><%# DataBinder.Eval(Container.DataItem, "summary") %> |
19 |
|
20 |
|
21 |
22 | < FooterTemplate > |
23 |
|
24 |
|
25 |
|
26 |
|
(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("
抱歉!無法找到您需要的資料!
")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("
搜尋資料庫: (共計" & RecordCount & "筆 / 共需" & Pages & "頁)
")Response.Write("
")
'-- StringBuilder的用法,請參考 http://msdn2.microsoft.com/zh-tw/library/system.text.stringbuilder(VS.80).aspx
html_sb.Append("")
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
'--- 如果您想要 C# 版範例,請打開 C#書本「上集」(光碟裡面有這支程式的原版)。拿他來改,修改幅度很小。
'--- 如果連這麼小幅度的修改(從 VB改成 C#)都作不到.....那就 Orz...
'--- 請看本文後續發展: [給讀者的話]軟土深掘
While (dr.Read())
haveRec = True
html_sb.Append("
html_sb.Append("
html_sb.Append("
html_sb.Append("
End While
html_sb.Append("
★(" & dr.Item("test_time").ToString() & ") | " & dr.Item("title").ToString() & " |
" & dr.Item("summary").ToString() & " | |
If (haveRec) Then
If (Pages > 0) Then
Response.Write("
If (p > 1) Then
Response.Write("[<<<上一頁]")
End If
Response.Write(" [首頁] & nbsp; ")
If (p < Pages) Then
Response.Write("[下一頁>>>]")
End If
'========= MIS2000 Lab.自製的「每十頁」一間隔,分頁功能=========start====
Response.Write("
")
'== 這裡跟書本一樣,只需修改超連結的「檔案名稱」即可(請配合書本的範例,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程式覺得很困難,那是正常的,請不要灰心。
沒有人能不經學習,就能一次搞定。
只要有人、有書本帶著您走一遍,這都很簡單。
=== 最後要打一下廣告 ==========================
1. 如果您覺得我的描述、寫作方式,符合您的胃口。
2. 如果您看完以後,知道我寫書、介紹一些控制項或是技術........不是「混過去」、「帶過去」而已,而是真真確確地蒐集 "有用的範例",讓您學得更深入!
3. 如果您覺得:我出完書以後,還不定期地提供售後服務,提供補充教材......這樣的互動是 "良性"的,是值得鼓勵的。......已經推出 兩百多篇 補充範例了
4. 如果您(尤其是學生)真的想把基礎學好,而不是 "混"過這一門課就好、而不是寫個(畢業專題的)屍體出來交差(能畢業就好).....那麼.......
請您購買下面的書籍,
東西多到您學不完
上 / 下兩集,兩本書的厚度(我蒐集的各種範例)將近 兩千頁 !!......絕對不會讓您失望
網頁上的補充範例(售後服務),不一定能立即提供 VB / C#語法(看時間夠不夠寫,請不要跟我們要)。
但書本上面的範例,一定有 VB / C#雙語法給您學習。 請看我們的「售後服務」範圍(嚴格認定)。
............................. 寫信給我,mis2000lab (at) yahoo.com.台灣......
上集( .NET 4.0版)全新改寫。範例增加66%,內容增加35%。上市以來,熱銷五刷!
下集(第二版,黑皮書)上市一個月熱銷再刷,2010一年內(第一版)熱銷四刷!第二版半年熱銷四刷! 下集內容增加66%。
上下兩集將近2,000頁,堪稱國內 [最詳盡]的ASP.NET範例教學。
南無普光佛 南無普明佛 南無普淨佛 南無多摩羅跋栴檀香佛 南無栴檀光佛 南無摩尼幢佛 南無歡喜藏摩尼寶積佛 南無一切世間樂見上大精進佛 南無摩尼幢燈光佛
南無慧炬照佛 南無海德光明佛 南無金剛牢強普散金光佛 南無大強精進勇猛佛 南無大悲光佛 南無慈力王佛 南無慈藏佛 南無栴檀窟莊嚴勝佛 南無賢善首佛
南無善意佛 南無廣莊嚴王佛 南無金華光佛 南無寶蓋照空自在力王佛 南無虛空寶華光佛 南無琉璃莊嚴王佛 南無普現色身光佛 南無不動智光佛 南無降伏眾魔王佛
南無才光明佛 南無智慧勝佛 南無彌勒仙光佛 南無善寂月音妙尊智王佛 南無世淨光佛 南無龍種上尊王佛 南無日月光佛 南無日月珠光佛 南無慧幢勝王佛
南無師子吼自在力王佛 南無妙音勝佛 南無常光幢佛 南無觀世燈佛 南無慧威燈王佛 南無法勝王佛 南無須彌光佛 南無須曼那華光佛 南無優曇鉢羅華殊勝王佛
南無大慧力王佛 南無阿閦毗歡喜光佛 南無無量音聲王佛 南無才光佛 南無金海光佛 南無山海慧自在通王佛 南無大通光佛 南無一切法常滿王佛 南無釋迦牟尼佛
南無金剛不壞佛 南無寶光佛 南無龍尊王佛 南無精進軍佛 南無精進喜佛 南無寶火佛 南無寶月光佛 南無現無愚佛 南無寶月佛 南無無垢佛 南無離垢佛
南無勇施佛 南無清淨佛 南無清淨施佛 南無娑留那佛 南無水天佛 南無堅德佛 南無栴檀功德佛 南無無量掬光佛 南無光德佛 南無無憂德佛
南無那羅延佛 南無功德華佛 南無蓮華光遊戲神通佛 南無財功德佛 南無德念佛 南無善名稱功德佛 南無紅燄帝幢王佛 南無善遊步功德佛 南無鬪戰勝佛
南無善遊步佛 南無周匝莊嚴功德佛 南無寶華遊步佛 南無寶蓮華善住娑羅樹王佛 南無法界藏身阿彌陀佛
............................. 寫信給我,mis2000lab (at) yahoo.com.台灣......