[習題]ASP.NET的 簡易投票區 #2 -- 不同的 Table設計,程式寫法也有差異

上一篇文章有提到----
同一個題目(投票區),但資料表的設計不同,功能也會有差異。

* 上一篇文章,重點是「分享 "長條圖"」的作法。
* 這篇文章,則是讓初學者能體會一下「同一個題目,不同的Table schema帶來哪種變化?」

如果這兩篇文章都能學透了,初學者最害怕的「自己設計流程、設計Table」這一關,就有可能突破!





上一篇文章([習題]ASP.NET的 簡易投票區 & 長條圖(繪製圖表)#1 )有提到----

雖然是同一個題目(投票區),但資料表的設計不同,功能也會有差異。

 

    上一篇文章,重點是「分享 "長條圖"」的作法。

    這篇文章,則是讓初學者能體會一下「同一個題目,不同的Table帶來哪種變化?」

如果這兩篇文章都能學透了,初學者最害怕的「自己設計流程、設計Table」這一關,就有可能突破!

=========================================================================

老話重題,這些習題是送給本書讀者的課後練習,尤其是本書Ch. 14讀完(ADO.NET程式)應該會覺得很簡單。

如果您毫無基礎,讀起來可能覺得很吃力。   

 

投票區的 [資料表]。

投票區的資料表有很多種設計方法,一開始的規劃不同,後續的程式寫法會差距很大。

沒有什麼方法是最好的,要依照實際需求與自己的能力來規劃才行。

底下的 Table是上一個範例的作法。

    設計方法,是「每舉辦一次投票」當作一列記錄!

    當User投票給一位候選人,就會撈出原本的票數,然後加一。     再回寫資料庫(以Update指令)

   資料存放的樣子如下圖。

 

 

而這個範例的 Table設計,改用如下:

每一次User投票,都是一筆記錄。然後透過 Select Count()的方式去統計得票數。

這也有好處,就是每一個人的投票,都可以記錄更多資訊起來(如:投票時間、IP來源、投票者的會員編號...等等

本文使用這種方式設計Table,您可以比較一下程式將會有哪些變化?

Table Schema的設計,是一門大學問。

設計得好,程式就很好寫。      設計偏差了,寫程式的時候就會哭出來~

 

 

 Table修改之後,程式寫法也會有差異。

這一支程式,在投票區的部份每投一票,就會 Insert Into一筆全新的紀錄到 Table裡面了。

因為HTML設計畫面完全一樣(請看上一篇文章),所以這裡只提供後置程式碼:

01 '----自己寫的----
02 '----自己寫的----
03 Imports System
04 Imports System.Web.Configuration
05 Imports System.Data
06 Imports System.Data.SqlClient

07 '----自己寫的----
08
09
10 Partial Class Vote_EasyVote_2
11     Inherits System.Web.UI.Page
12
13     Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
14
15         Session("vote") = RadioButtonList1.Items.Count  '--共有幾個候選人
16
17         For i As Integer = 0 To (RadioButtonList1.Items.Count - 1)
18
19             If RadioButtonList1.Items(i).Selected Then
20                 '************************************************
21                 Dim Conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString)
22                 Conn.Open()   '---- 連結DB
23
24                 Dim cmd As SqlCommand = New SqlCommand("Insert into Vote_2(vote_id,vote_date,vote_to,vote_ip) values(1, getdate(),'" & RadioButtonList1.Items(i).Text & "', '" & Request.ServerVariables("LOCAL_ADDR") & "')", Conn)
25                 cmd.ExecuteNonQuery()
26                 cmd.Cancel()
27
28                 '---- Close the connection when done with it.
29                 If (Conn.State = ConnectionState.Open) Then
30                     Conn.Close()
31                     Conn.Dispose() '---- 一開始宣告有用到 New的,最後必須以 .Dispose()結束
32                 End If
33                 '************************************************
34             End If
35         Next
36
37         '--投票完成, 直接到下一個網站看結果!
38         Response.Redirect("EasyVote_2_End.aspx")
39
40     End Sub

41 End Class

 

投票完成後,可以直接看見「得票數」。

在HTML畫面的設計上也沒變,但為了配合資料表的改變,後置程式碼修改如下:

01 '----自己寫的----
02 '----自己寫的----
03 Imports System
04 Imports System.Web.Configuration
05 Imports System.Data
06 Imports System.Data.SqlClient

07 '----自己寫的----
08
09 Partial Class Vote_EasyVote_2_End
10     Inherits System.Web.UI.Page
11
12     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
13         Dim Conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString)
14         Conn.Open()   '---- 連結DB
15
16         Dim end_str As String = Nothing  '--給一個初始值,VS 2008比較不會出現警告訊息
17
18         For i As Integer = 1 To CInt(Session("vote"))
19             Dim cmd As SqlCommand = New SqlCommand("select count(id) from Vote_2 where vote_id =1 and vote_to like '" & i & "%'", Conn)
20             Dim vote_no As Integer = CInt(cmd.ExecuteScalar)   '---- 執行SQL指令,取出每一位候選人的得票數
21
22             end_str = end_str & "<p>" & i & "號候選人的得票數:"
23             end_str = end_str & "<img src='images/sum" & i & ".gif' height=10 width=" & (vote_no * 10) & ">"
24             end_str = end_str & vote_no & "</p>"
25
26             cmd.Cancel()
27         Next
28
29         Label1.Text = end_str
30
31         If (Conn.State = ConnectionState.Open) Then
32             Conn.Close()
33             Conn.Dispose()  
34         End If
35     End Sub

36 End Class

 

這些範例,日後如果有機會收集成冊(出書),

就可以講得更細緻一點。包含設計步驟,每一步都會抓圖。

程式碼也會講解多一點。

 

 

今天有點累,先到這裡為止。

 

 

 

本範例與完整說明,已經改寫成書本內的文章,

並集結出書,收錄在「[新書上市]ASP.NET專題實務II(下集):範例應用與4.0新功能

 

 

C#範例請由此下載:[習題][下載]ASP.NET的 簡易投票區 #5 --C#範例下載

 

 

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

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

線上課程教學,遠距教學 (Web Form 約51hr)  https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015

線上課程教學,遠距教學 (ASP.NET MVC 約75~88hr)  https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab

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

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


ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。 

................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/

 

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

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

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

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

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

 

ASP.NET MVC 5 線上教學

         累積時數約 75~ 88小時...... 第一天(5.5小時)完整內容,"免費"讓您評估