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將三個頁面設計在一張網頁中,以節省我們的開發時間,也無須替使用者設計管理介面,一個雛型架構就此產生。
圖 9‑1 「聚餐問卷表」網頁架構表
登入頁如圖9-2,在Panel1內配置一個textBox用來輸入姓名或是關鍵字管理密碼,以及一個Label用來回饋訊息,一個Button讓使用者登入。
圖 9‑2 登入頁配置
問卷表如圖9-3,我們將問卷表分為三個部分,使用水平線分隔,第一個部分是問卷選擇區,第二個部分是訊息回饋及送出調查表按鈕,第三部分是地點簡介。
圖 9‑3 問卷表配置
統計表如圖9-4,利用RadioButtonList來做為分群的選項,一個Button用來送出查詢。
圖 9‑4 統計表配置
9.6 程式實作¶
9.6.1 創建網站¶
Step 1:如圖9-5點選新網站創建網站。
圖 9-5 新網站
Step 2:如圖9-6點選ASP.NET網站,輸入位置,筆者輸入的是 http://localhost/dine ,按下確定鈕即可。
圖 9-6 建立新網站
Step 3:如圖9-7在方案總管就可以看到首頁Default.aspx,請點選兩下。
圖 9-7 方案總管
Step 4:如圖9-8點選屬性,找到Style,該列有三個點的按鈕,點選之後開啟屬性視窗。
圖 9-8 選擇屬性 Style
Step 5:如圖9-9先點選文字,在水平的部分選擇置中,你也可以自行設計喜好的樣式喔。
圖 9-9 樣式產生器
Step 6:如圖9-10設定完樣式產生器之後,自然在Style屬性列上產生出指令碼,而我們要自行在Title屬性中輸入文字,叫做聚餐調查表。
圖 9-10 屬性
Step 7:如圖9-11我們直接用已經設計好的資料庫來做網站資料庫,這份資料庫可以提供擴充的設計,我們將在程式設計的時候加以說明。
圖 9-11 資料庫關聯
9.6.2 設計登入頁¶
其實這個網站能夠只用一頁完成,概念上就是透過顯示或隱藏Panel,這樣就可以幫助我們把三個網頁作在一頁上。
Step 1:如圖9-12先安排一個Panel,然後在第一列上輸入標題,第三列輸入姓名以及安排一個textBox,用來輸入登入帳號(就是中文全名),或者是管理者才知道的關鍵密碼,第四列安排一個label,用來顯示訊息,第五列安排一個Button讓使用者可以登入。
圖 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,聚餐問卷的配置最主要在於聚餐日期選項鈕,這是一個單一選項的功能;其次是聚餐地點核取鈕,這是一個可複選的功能。這些項目已經於登入頁成功之後,進行的程式運作的結果。
圖 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,建立一個標籤以及選項鈕列,和一個查詢按鈕。
圖 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 成品展示¶
圖 9-15 使用者登入頁
圖 9-16 使用者問卷表
圖 9-17 使用者問卷表地點簡介
圖 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,點選一下,按下滑鼠右鍵,叫出功能表,點選內容。
圖 9-19
Step 2:如圖9-20點選安全性,新增Everyone,將修改及寫入的權限打勾。
圖 9-20
Lai Tai-Yu (賴岱佑)