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

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

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

Python 日期與時間的處理

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

Image

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

Image

Python 日期與時間的處理

Image

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

Image

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

Image

修復損毀的 SQLite DB 資料庫

Image

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

解決 ValueError: If using all scalar values, you must pass an index

Image

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

Image

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

Image