Skip to main content

Visual Basic .Net (VB.Net) 程式語言案例學習 (09. 聚餐問卷調查表)

Visual Basic .Net (VB.Net) 程式語言案例學習 (09. 聚餐問卷調查表)

Visual Basic .Net (VB.Net) 程式語言案例學習 (09. 聚餐問卷調查表)

9.1 問題

需求者因為想要辦聚餐,而且是多場聚餐,由於連絡的人數相當多,而且每一場次都有不同的人要邀請。如果一對一詢問那會非常耗時,因此想使用問卷的方式,使用問卷有個好處就是不必對受邀者一一連絡,由於是個人使用因此操作介面上不必設計太複雜,而且越簡單越好,不必考量到安全性的問題,只要能夠看到統計資料即可。

9.2 需求

表格 9‑1 「聚餐問卷調查表」系統目的分析表

版本:1.0   要做什麼    不要做什麼(不要做不代表不會做)  
能做什麼 (第一格:必要項目) (第二格:次要項目)
每個受邀者都有一份問卷表。 為受邀者設計可自由輸入的表單。
管理者可以看到所有問卷的統計表。  為管理者設計線上管理問卷功能。
不能做什麼(不能做代表不需要做) (第三格:不必要項目) (第四格:不需要項目)
為管理者設計線上寄送邀請函功能。 每位受邀者都有多份問卷。
管理者可以線上新增、修改、刪除問卷資料。  管理者可以管理受邀者的關連。

表格 9‑2 「聚餐問卷調查表」系統目標分析表

版本:   重要   不重要  
優先 (重) (急)
每個受邀者都有一份問卷表。 管理者可以看到所有問卷的統計表。
不急迫 (輕) (緩)
無。 無。

表格 9‑3 「聚餐問卷調查表」系統規格表

規格項目   規格內容   備註
問卷表 每個受邀者都有一份問卷表。
統計表 管理者可以看到所有問卷的統計表。
登入頁 輸入中文姓名即可登入到問卷表,輸入關鍵密碼即可看到統計表。 

9.3 特色

運用ASP.NET製作一張網頁,產生出十幾頁網頁的效果(每個使用者都有自己的頁面),管理群組化,不同聚餐可關聯至不同成員。

檔案數目少,但卻內容豐富;問卷群組化,但管理很簡單。


9.4 使用工具

語言   軟體  
ASP.NET   MS Visual Studio 2005 .NET、MS Access 

9.5 系統架構

如圖9-1首先由系統規格表可以看出我們只需要架構三個頁面,但由於該系統使用者使用需求量不大,因此我們將透過Panel將三個頁面設計在一張網頁中,以節省我們的開發時間,也無須替使用者設計管理介面,一個雛型架構就此產生。

image.png
圖 9‑1 「聚餐問卷表」網頁架構表

登入頁如圖9-2,在Panel1內配置一個textBox用來輸入姓名或是關鍵字管理密碼,以及一個Label用來回饋訊息,一個Button讓使用者登入。

image.png
圖 9‑2 登入頁配置

問卷表如圖9-3,我們將問卷表分為三個部分,使用水平線分隔,第一個部分是問卷選擇區,第二個部分是訊息回饋及送出調查表按鈕,第三部分是地點簡介。

image.png
圖 9‑3 問卷表配置

統計表如圖9-4,利用RadioButtonList來做為分群的選項,一個Button用來送出查詢。

image.png
圖 9‑4 統計表配置

9.6 程式實作

9.6.1 創建網站

Step 1:如圖9-5點選新網站創建網站。

image.png
圖 9-5 新網站

Step 2:如圖9-6點選ASP.NET網站,輸入位置,筆者輸入的是 http://localhost/dine ,按下確定鈕即可。

image.png
圖 9-6 建立新網站

Step 3:如圖9-7在方案總管就可以看到首頁Default.aspx,請點選兩下。

image.png
圖 9-7 方案總管

Step 4:如圖9-8點選屬性,找到Style,該列有三個點的按鈕,點選之後開啟屬性視窗。

image.png
圖 9-8 選擇屬性 Style

Step 5:如圖9-9先點選文字,在水平的部分選擇置中,你也可以自行設計喜好的樣式喔。

image.png
圖 9-9 樣式產生器

Step 6:如圖9-10設定完樣式產生器之後,自然在Style屬性列上產生出指令碼,而我們要自行在Title屬性中輸入文字,叫做聚餐調查表。

image.png
圖 9-10 屬性

Step 7:如圖9-11我們直接用已經設計好的資料庫來做網站資料庫,這份資料庫可以提供擴充的設計,我們將在程式設計的時候加以說明。

image.png
圖 9-11 資料庫關聯

9.6.2 設計登入頁

其實這個網站能夠只用一頁完成,概念上就是透過顯示或隱藏Panel,這樣就可以幫助我們把三個網頁作在一頁上。
Step 1:如圖9-12先安排一個Panel,然後在第一列上輸入標題,第三列輸入姓名以及安排一個textBox,用來輸入登入帳號(就是中文全名),或者是管理者才知道的關鍵密碼,第四列安排一個label,用來顯示訊息,第五列安排一個Button讓使用者可以登入。

image.png
圖 9-12 登入頁

Step 2:點選登入鈕兩下,進入程式編輯模式。
Step 3:接著請參考以下說明編輯程式。


‘設定必須宣告才能使用變數
Option Explicit On
‘參考OleDb用來存取資料庫
Imports System.Data.OleDb
‘參考Teble用來繪製表格
Imports System.Web.UI.WebControls.Table

Partial Class _Default
    Inherits System.Web.UI.Page
    ‘宣告使用者識別碼暫存變數
    Private strMemberID As String = ""
    ‘宣告群組識別碼暫存變數
    Private strGroupID As String = ""
    ‘登入頁的登入按鈕被點選一下的事件
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        ‘做例外處理
        Try
            ‘建立與資料庫連接的物件
            Dim objOleDb_Cnn As New OleDbConnection()
            ‘建立傳送命令給資料庫的物件
            Dim objOleDb_Cmd As New OleDbCommand()
            ‘建立或得資料庫回傳資料的物件
            Dim objOleDb_DR As OleDbDataReader
            ‘設定連接字串
            objOleDb_Cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                            "Data Source=" & Server.MapPath("DineTogether.mdb")
            ‘開啟資料庫連接
            objOleDb_Cnn.Open()
            ‘當輸入姓名為關鍵密碼時
            If Me.TextBox1.Text = "admin" Then
                ‘顯示管理者統計表,並隱藏登入頁、問卷表
                Me.Panel1.Visible = False
                Me.Panel2.Visible = False
                Me.Panel3.Visible = True
                ‘查詢不重複的群組,做為選擇
                objOleDb_Cmd.CommandText = "SELECT DISTINCT [GroupName] FROM [GROUP]"
                ‘連接資料庫來源
                objOleDb_Cmd.Connection = objOleDb_Cnn
                ‘獲得資料庫查詢後的結果
                objOleDb_DR = objOleDb_Cmd.ExecuteReader()
                ‘使用迴圈將群組名稱加入點選鈕項目中
                While (objOleDb_DR.Read() = True)
                    Me.RadioButtonList2.Items.Add(objOleDb_DR("GroupName"))
                End While
                ‘設定統計表名稱
                Me.Label4.Text = "聚餐列表"
                ‘關閉資料讀取物件
                objOleDb_DR.Close()
                ‘關閉資料庫來源物件
                objOleDb_Cnn.Close()
                ‘跳離副程式
                Exit Sub
            ‘結束開啟管理者功能的判斷
            End If
            ‘若非管理者,當使用者輸入中文全名時,就必須查詢資料庫是否存在
            objOleDb_Cmd.CommandText = "SELECT * FROM [MEMBER] WHERE [MemberName] Like '" & Me.TextBox1.Text & "'"
            ‘連結資料庫來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取資料庫傳回結果
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘當查詢到有此成員時
            If objOleDb_DR.Read() = True Then
                ‘將成員識別碼存入全域變數中
                strMemberID = objOleDb_DR("MemberID")
                ‘將全域變數存入Session中
                Session.Add("MemberID", strMemberID)
                ‘隱藏登入頁
                Me.Panel1.Visible = False
                ‘顯示問卷表
                Me.Panel2.Visible = True
            ‘若無此成員時
            Else
                Me.Panel1.Visible = True
                Me.Panel2.Visible = False
                Me.Label1.Text = "查無此人,請輸入正確的中文全名。"
                ‘跳離副程式
                Exit Sub
            End If
            ‘關閉資料庫讀取物件
            objOleDb_DR.Close()
            ‘關閉資料庫來源物件
            objOleDb_Cnn.Close()
            ‘顯示成員問候語
            Me.LabelName.Text = Me.TextBox1.Text & "您好,"
            ‘重新設定資料庫連結字串
            objOleDb_Cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                            "Data Source=" & Server.MapPath("DineTogether.mdb")
            ‘開啟資料庫
            objOleDb_Cnn.Open()
            ‘設定由群組中找尋成員識別碼,以辨別該成員屬於哪一個群組
            objOleDb_Cmd.CommandText = "SELECT * FROM [Group] WHERE [GroupMemberID] Like '" & strMemberID & "'"
            ‘開啟資料庫來源連線
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘獲得資料結果
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘若找到該成員
            If objOleDb_DR.Read() = True Then
                ‘顯示群組名稱
                Me.Label2.Text = objOleDb_DR("GroupName")
                ‘存入群組名稱到全域變數
                strGroupID = objOleDb_DR("GroupID")
                ‘存入群組名稱到Session
                Session.Add("GroupID", strGroupID)
            ‘當發現沒有找到該成員時,最有可能就是資料庫沒有設定正確,必須通知管理員。
            Else
                Me.Panel1.Visible = True
                Me.Panel2.Visible = False
                Me.Label1.Text = "發生錯誤,請寫信給 xxx@xxx.com"
            End If
            ‘關閉讀取物件
            objOleDb_DR.Close()
            ‘設定找尋群組相關資訊
            objOleDb_Cmd.CommandText = "SELECT [GroupDate],[GroupID] FROM [GroupDate] WHERE [GroupID] Like '" & strGroupID & "'"
            ‘連接查詢來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘傳回群組讀取結果
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘將群組日期加入選項鈕
            While (objOleDb_DR.Read())
                Me.RadioButtonList1.Items.Add(objOleDb_DR("GroupDate"))
            End While
            ‘關閉讀取物件
            objOleDb_DR.Close()
            ‘設定查詢群組資訊命令文字
            objOleDb_Cmd.CommandText = "SELECT [GroupDate],[GroupID] FROM [GroupDate] WHERE [GroupID] Like '" & strGroupID & "'"
            ‘開啟資料來源連線
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取傳回結果
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘設定選項鈕
            If objOleDb_DR.Read() = True Then
                Me.RadioButtonList1.Text = objOleDb_DR("GroupDate")
            End If
            ‘關閉讀取物件
            objOleDb_DR.Close()
            ‘設定命令找尋地點相關的資訊
            objOleDb_Cmd.CommandText = "SELECT [PlaceGroupID],[PlaceName],[PlaceTel],[PlaceADDR],[PlacePark],[PlaceNote] FROM [Place] WHERE [PlaceGroupID] Like '" & strGroupID & "'"
            ‘連接資料來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取地點相關資訊
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘將地點名稱加入核取框項目中
            While (objOleDb_DR.Read() = True)
                Me.CheckBoxList1.Items.Add(objOleDb_DR("PlaceName"))
            End While
            ‘關閉資料讀取物件
            objOleDb_DR.Close()
            ‘設定命令讀取地點相關資訊
            objOleDb_Cmd.CommandText = "SELECT [PlaceGroupID],[PlaceName],[PlaceTel],[PlaceADDR],[PlacePark],[PlaceNote] FROM [Place] WHERE [PlaceGroupID] Like '" & strGroupID & "'"
            ‘設定連結資料來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取地點相關資料
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘宣告列計數器
            Dim intRowCtr As Integer = 0
            ‘宣告欄計數器
            Dim intCellCtr As Integer = 0
            ‘巡覽1到5列
            For intRowCtr = 1 To 5
                ‘讀取一個儲存格資料
                If objOleDb_DR.Read() = True Then
                    ‘創建新列物件
                    Dim tRow As New TableRow()
                    ‘巡覽1到5欄
                    For intCellCtr = 1 To 5
                        ‘創建新欄物件
                        Dim tCell As New TableCell()
                        ‘依據不同的計數器值,對應到地點相關資料
                        Select Case intCellCtr
                            Case 1
                                tCell.Text = objOleDb_DR("PlaceName") & ""
                            Case 2
                                tCell.Text = objOleDb_DR("PlaceTEL") & ""
                            Case 3
                                tCell.Text = objOleDb_DR("PlaceADDR") & ""
                            Case 4
                                tCell.Text = objOleDb_DR("PlacePark") & ""
                            Case 5
                                tCell.Text = objOleDb_DR("PlaceNote") & ""
                        End Select
                        ‘將欄位資料加入到列中
                        tRow.Cells.Add(tCell)
                    Next
                    ‘新增列資料到表格中
                    Table1.Rows.Add(tRow)
                End If
            Next
            ‘關閉讀取物件
            objOleDb_DR.Close()
            ‘關閉資料來源物件
            objOleDb_Cnn.Close()
        ‘當發生例外情形時
        Catch ex As Exception
            ‘呼叫錯誤顯示
            Call ErrorResult()
        End Try
    End Sub

我們可以觀察到,有多次的開關讀取資料,為何要這樣寫作呢?因為為了彈性,而不一次寫死,同樣的可以保持未來的擴充性。

9.6.3 設計問卷頁

問卷頁的內容已於登入頁的程式建立完畢,因此我們要處理的部分就是記錄問卷選項的部分。
Step 1:如圖9-13,聚餐問卷的配置最主要在於聚餐日期選項鈕,這是一個單一選項的功能;其次是聚餐地點核取鈕,這是一個可複選的功能。這些項目已經於登入頁成功之後,進行的程式運作的結果。

image.png
圖 9-13 問卷頁

Step 2:點選送出調查表按鈕兩下,進而編輯程式如下。


    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        ‘做例外處理
        Try
            ‘藉由Session獲得群組識別碼
            strGroupID = Session.Item("GroupID")
            ‘藉由Session獲得使用者識別碼
            strMemberID = Session.Item("MemberID")
            ‘隱藏表格
            Me.Table1.Visible = False
            ‘宣告並設定計數器
            Dim intI As Integer = 0
            ‘宣告並設定選擇暫存變數
            Dim strChoiced As String = ""
            ‘宣告並設定選擇日期暫存變數
            Dim strChoiceData_Date As String = ""
            ‘宣告並設定選擇地點暫存變數
            Dim strChoiceData_Place As String = ""
            ‘尋找被使用者選擇的日期項目
            For intI = 0 To Me.RadioButtonList1.Items.Count - 1
                If Me.RadioButtonList1.Items(intI).Selected = True Then
                    strChoiceData_Date = Me.RadioButtonList1.Items(intI).Value()
                    strChoiced = "Yes"
                    Exit For
                End If
            Next
            ‘倘若沒有選取則跳出訊息
            If strChoiced = "" Then
                Me.Label3.Text = "請選擇聚餐日期"
                Exit Sub
            End If
            ‘重置選擇變數
            strChoiced = ""
            ‘尋找被使用者選擇的地點項目
            For intI = 0 To Me.CheckBoxList1.Items.Count - 1
                If Me.CheckBoxList1.Items(intI).Selected = True Then
                    strChoiceData_Place += Me.CheckBoxList1.Items(intI).Value() & ","
                    strChoiced = "Yes"
                End If
            Next
            ‘倘若沒有選擇地點項目則退出
            If strChoiced = "" Then
                Me.Label3.Text = "請選擇聚餐地點"
                Exit Sub
            End If
            ‘清除訊息
            Me.Label3.Text = ""
            ‘若日期選擇為不參加時,出現訊息
            If strChoiceData_Date = "不參加" Then
                Response.Write("真的嗎?真希望您也能夠參加。")
                Exit Sub
            End If
            ‘宣告並建立資料庫連線物件
            Dim objOleDb_Cnn As New OleDbConnection()
            ‘宣告並建立資料命令物件
            Dim objOleDb_Cmd As New OleDbCommand()
            ‘宣告並建立資料讀取物件
            Dim objOleDb_DR As OleDbDataReader
            ‘宣告資料暫存字串
            Dim strDataKey As String = ""
            ‘宣告SQL命令字串
            Dim strSQL As String = ""
            ‘宣告地點資料陣列
            Dim aryPlace As Array
            ‘設定資料庫連線字串
            objOleDb_Cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                            "Data Source=" & Server.MapPath("DineTogether.mdb")
            ‘開啟資料庫來源
            objOleDb_Cnn.Open()
            ‘尋找使用者是否曾有過選擇記錄
            objOleDb_Cmd.CommandText = "SELECT * FROM [MemberChoice] WHERE " & _
                                       "[GroupID] Like '" & strGroupID & "' AND " & _
                                       "[MemberID] Like '" & strMemberID & "'"
            ‘連接資料庫來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取資料結果
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘倘若有資料代表曾經有留下選擇記錄
            If objOleDb_DR.Read() = True Then
                strDataKey = "UPDATE "
            ‘倘若無資料代表這是新的資料記錄
            ElseIf objOleDb_DR.Read() = False Then
                strDataKey = "INSERT "
            End If
            ‘關閉資料讀取物件
            objOleDb_DR.Close()
            ‘為了讓使用者可以重複的選擇資料,因此當有舊的資料存在時,我們必須先把
            ‘舊資料刪除掉
            If strDataKey = "UPDATE " Then
                ‘設定刪除命令文字
                objOleDb_Cmd.CommandText = "DELETE FROM [MemberChoice] WHERE " & _
                                           "[GroupID] Like '" & strGroupID & "' AND " & _
                                           "[MemberID] Like '" & strMemberID & "'"
                ‘連接資料來源
                objOleDb_Cmd.Connection = objOleDb_Cnn
                ‘執行不傳回結果的查詢命令
                objOleDb_Cmd.ExecuteNonQuery()
            End If
            ‘將地點選擇文字轉換成陣列模式
            aryPlace = Split(strChoiceData_Place, ",")
            ‘透過巡覽陣列的方式將選擇的資料加入資料庫中
            For intI = 0 To UBound(aryPlace) – 1
                ‘設定新增資料的命令文字
                strSQL = "INSERT INTO [MemberChoice] " & _
                         "(GroupID,MemberID,MemberChoiceDate,MemberChoiceTime,MemberChoicePlaceID) VALUES " & _
                         "('" & strGroupID & "','" & _
                                strMemberID & "','" & _
                                strChoiceData_Date & "','" & _
                                "6:30PM','" & _
                                aryPlace(intI).ToString() & "')"
                ‘設定命令文字
                objOleDb_Cmd.CommandText = strSQL
                ‘連接資料庫來源
                objOleDb_Cmd.Connection = objOleDb_Cnn
                ‘執行不傳回結果的查詢
                objOleDb_Cmd.ExecuteNonQuery()
            Next
            ‘關閉資料庫讀取物件
            objOleDb_DR.Close()
            ‘隱藏所有的Panel
            Me.Panel1.Visible = False
            Me.Panel2.Visible = False
            Me.Panel3.Visible = False
            ‘顯示更新或記錄成功的訊息
            If strDataKey = "UPDATE " Then
                Response.Write("修改完畢,資料成功記錄。<br/><hr/>")
            ElseIf strDataKey = "INSERT " Then
                Response.Write("登錄完畢,資料成功記錄。<br/><hr/>")
            End If
            ‘關閉資料庫讀取物件
            objOleDb_DR.Close()
            ‘關閉資料庫來源物件
            objOleDb_Cnn.Close()
            ‘呼叫統計表副程式
            Call VoteResult(strGroupID)
        ‘例外處理
        Catch ex As Exception
            ‘呼叫顯示錯誤的副程式
            Call ErrorResult()
        End Try
    End Sub

在這裡採用將字串轉為陣列的方式,是相當方便的一種處理模式,最主要透過Split函式來處理,可以將你設定的中斷字元,轉換成陣列內容,再藉由陣列的方式來進行資料的處理。

9.6.4 設計統計表

統計表是提供給管理者使用的,但呼叫的顯示內容的函式與使用者相同,我們將顯示統計資料的功能做成函式,方便問卷表以及統計表來呼叫。
Step 1:如圖9-14,建立一個標籤以及選項鈕列,和一個查詢按鈕。

image.png
圖 9-14 統計表

Step 2:請將以下程式碼加入查詢按鈕的點選事件中。


    Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
        ‘例外處理
        Try
            ‘宣告及建立資料庫連接物件
            Dim objOleDb_Cnn As New OleDbConnection()
            ‘宣告並建立命令物件
            Dim objOleDb_Cmd As New OleDbCommand()
            ‘宣告並建立讀取物件
            Dim objOleDb_DR As OleDbDataReader
            ‘設定資料來源連接字串
            objOleDb_Cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                            "Data Source=" & Server.MapPath("DineTogether.mdb")
            ‘開啟資料來源
            objOleDb_Cnn.Open()
            ‘依照選項鈕查詢相關資料
            objOleDb_Cmd.CommandText = "SELECT * FROM [GROUP] WHERE [GroupName] Like '" & Me.RadioButtonList2.SelectedItem.Value & "'"
            ‘連接查詢資料來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取查詢結果
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘當讀到有資料的時候,用暫存變數記錄群組識別碼
            If objOleDb_DR.Read() = True Then
                strGroupID = objOleDb_DR("GroupID")
            End If
            ‘關閉讀取物件
            objOleDb_DR.Close()
            ‘關閉資料庫來源
            objOleDb_Cnn.Close()
            ‘呼叫統計表函式並傳入群組識別碼
            Call VoteResult(strGroupID)
        ‘例外處理
        Catch ex As Exception
            ‘顯示錯誤訊息
            Call ErrorResult()
        End Try
    End Sub


    Protected Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Unload
        ‘釋放本網頁
        Me.Dispose()
    End Sub


    ‘自訂的統計表函式
    Protected Sub VoteResult(ByVal strGroupID As String)
        ‘例外處理
        Try
            ‘宣告並建立資料庫來源物件
            Dim objOleDb_Cnn As New OleDbConnection()
            ‘宣告並建立命令物件
            Dim objOleDb_Cmd As New OleDbCommand()
            ‘宣告並建立讀取物件
            Dim objOleDb_DR As OleDbDataReader
            ‘宣告並建立暫存命令物件
            Dim objOleDb_Cmd_Temp As New OleDbCommand()
            ‘宣告並建立暫存讀取物件
            Dim objOleDb_DR_Temp As OleDbDataReader
            ‘宣告整數計數器
            Dim intI As Integer = 0
            ‘顯示標題
            Response.Write("投票紀錄<br/><hr/>")
            ‘設定連接資料來源命令文字
            objOleDb_Cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                            "Data Source=" & Server.MapPath("DineTogether.mdb")
            ‘開啟資料來源
            objOleDb_Cnn.Open()
            ‘設定查詢群組日期相關資料命令文字
            objOleDb_Cmd.CommandText = "SELECT * FROM [GroupDate] WHERE " & _
                                       "[GroupID] Like '" & strGroupID & "'"
            ‘連接資料來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取資料
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘依照讀取結果進行統計
            While (objOleDb_DR.Read() = True)
                ‘顯示群組日期
                Response.Write(objOleDb_DR("GroupDate") & " : ")
                ‘設定查詢該日期的使用者數量命令文字
                objOleDb_Cmd_Temp.CommandText = "SELECT DISTINCT [MemberChoiceDate],[GroupID] FROM [MemberChoice] WHERE " & _
                                                "[MemberChoiceDate] Like '" & objOleDb_DR("GroupDate") & "' AND " & _
                                                "[GroupID] Like '" & strGroupID & "'"
                ‘連接資料來源
                objOleDb_Cmd_Temp.Connection = objOleDb_Cnn
                ‘讀取資料
                objOleDb_DR_Temp = objOleDb_Cmd_Temp.ExecuteReader()
                ‘將計數器歸零
                intI = 0
                ‘累計選擇群組中的數量
                While (objOleDb_DR_Temp.Read() = True)
                    intI += 1
                End While
                ‘顯示共有多少人選擇
                Response.Write("共有" & intI.ToString() & "人<br/>")
                ‘關閉暫存讀取物件
                objOleDb_DR_Temp.Close()
            End While
            ‘關閉讀取物件
            objOleDb_DR.Close()
            ‘顯示水平線
            Response.Write("<hr/>")
            ‘設定查詢地點命令文字
            objOleDb_Cmd.CommandText = "SELECT * FROM [Place] WHERE " & _
                                       "[PlaceGroupID] Like '" & strGroupID & "'"
            ‘設定連接資料來源
            objOleDb_Cmd.Connection = objOleDb_Cnn
            ‘讀取資料
            objOleDb_DR = objOleDb_Cmd.ExecuteReader()
            ‘讀取地點相關資訊並進行統計
            While (objOleDb_DR.Read() = True)
                ‘顯示地點名稱
                Response.Write(objOleDb_DR("PlaceName") & " : ")
                ‘設定查詢地點統計數量
                objOleDb_Cmd_Temp.CommandText = "SELECT [MemberChoiceDate],[GroupID] FROM [MemberChoice] WHERE " & _
                                                "[MemberChoicePlaceID] Like '" & objOleDb_DR("PlaceName") & "' AND " & _
                                                "[GroupID] Like '" & strGroupID & "'"
                ‘設定連接資料來源
                objOleDb_Cmd_Temp.Connection = objOleDb_Cnn
                ‘設定讀取資料
                objOleDb_DR_Temp = objOleDb_Cmd_Temp.ExecuteReader()
                ‘將計數器歸零
                intI = 0
                ‘統計地點選擇數量
                While (objOleDb_DR_Temp.Read() = True)
                    intI += 1
                End While
                ‘顯示共有多少人選擇該地點
                Response.Write("共有" & intI.ToString() & "人<br/>")
                ‘關閉暫存讀取物件
                objOleDb_DR_Temp.Close()
            End While
            ‘顯示水平線
            Response.Write("<hr/>")
            ‘關閉讀取物件
            objOleDb_DR.Close()
            ‘關閉資料來源物件
            objOleDb_Cnn.Close()
        ‘例外處理
        Catch ex As Exception
            ‘顯示錯誤訊息
            Call ErrorResult()
        End Try
    End Sub


    Protected Sub ErrorResult()
        ‘顯示錯誤訊息
        Response.Clear()
        Response.Write("<h1>發生錯誤,請寫信給 xxx@xxx.com</h1>")
    End Sub

由於統計表函式的功能無論是管理者或是使用者都近似,因此我們將它寫成一個函式,而不用分開來寫,往後若有功能不同的時候,透過參數的設定也可以做不同功能的判斷與顯示。

9.6.5 成品展示

image.png
圖 9-15 使用者登入頁

image.png
圖 9-16 使用者問卷表

image.png
圖 9-17 使用者問卷表地點簡介

image.png
圖 9-18 使用者統計表(測試資料)

9.7 修改重點

資料庫中我們設計了許多備而不用的資料訊息,這都方便為了讀者可以自由擴增,例如使用者線上註冊,使用者資料新增、修改、刪除,管理者線上管理功能,而非單純的只能瀏覽統計結果。設計這個程式只有三個按鈕要填寫程式碼而已,而且若日後功能增加,必須分開頁面撰寫的話,也只需要將三個程式碼分開而已,透過簡單的複製、貼上的動作就可以完成,一點也不難。畫面美觀的部分,其實只要置換一下背景圖案及可,無須太多花俏的設計。倘若需要特別的美工設計,採用樣式產生器來設計美工也是一種方法。
我們在這個程式中只用DataReader,這是因為該物件讀取速度比較快,可以只讀取一列的資料,若採用DataSet的話,將會加重主機的負擔,因為會讀取一張資料表下來。這個程式若需要修改的話,還是建議採用DataReader來進行會比較好。程式中有些部分會重複開關,這是為了讓讀者或是未來的開發者,預先切割好的概念,也方便擴充,而不用一次由頭到尾的重新開發,需要修改哪一段的功能就只要動到其中一部分,正所謂頭痛醫頭、腳痛醫腳,無需全身麻醉。你可以刪除某一段認為不需要的部分,卻不影響整個程式的運作。
當若您考慮要擴增連線到千人的系統時,請將資料庫移植到MS SQL或My SQL以及其它的SQL Server,程式碼只有將引用的物件做修改而已。因為MS Access並不是合作為大量連線時的資料庫系統。

9.8 結論

在一開始分析該程式的規格時,我們還思考了一些有可能的發展,因此採用DataReader來作為資料的讀取,為了是可以負荷更多使用者的連線,使用DataReader的好處就是佔主機資源低,效率較好。而為求迅速開發,我們將三頁的功能,全部寫在一頁網頁中,在網頁介面的部分,安排三個區塊,也就是三個Panel,在程式碼運作的部分也是對應的三段程式碼。因此您要隨時抽離其中任何一段都相當容易,而抽離的過程中也不會造成程式無法運作。簡單的說,您想要將這一頁網頁改成三頁的話,只需要在準備另外兩頁,然後複製對應的Panel到所屬的頁面上,程式碼也是一樣畫葫蘆的方式複製過去,再加個傳遞網頁的指令,這三頁就連起來了。因此相當有彈性,且容易修改。

9.9 備註

使用者第一次將原始碼放在IIS上的時候,會發生運作更新失敗,這是因為資料庫的權限沒有打開,因此只要依照下列敘述操作即可。
Step 1:如圖9-19找到資料庫檔案DineTogether.mdb,點選一下,按下滑鼠右鍵,叫出功能表,點選內容。

image.png
圖 9-19

Step 2:如圖9-20點選安全性,新增Everyone,將修改及寫入的權限打勾。

image.png
圖 9-20

image.png
Lai Tai-Yu (賴岱佑)

Popular posts from this blog

Python 日期與時間的處理

Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Python 日期與時間的處理

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)

Image

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Image

數位影像處理:最佳化處理策略之快速消除扭曲演算法

Image

用10種程式語言做影像二值化(Image binarization)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (04. 人事考勤管理系統)

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (06. 題庫測驗系統)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (11. 生產線拍照程式)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (07. 收據列印程式)

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (03. 場地預約系統)

Image