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 (賴岱佑)