簡介:
         很多時候所有資料如果都集中在一張表上會有很多重複的資料,譬如選課時每個學生選好幾門課,如果每一筆選課資料都要寫學號、姓名與班級,就會很浪費時間與空間;而且如果寫錯了,同一個人產生兩個不同學號之類的就更加麻煩了。因此好的資料庫都會適當的切割,或重組資料表(術語稱為正規化Normalization)。在此我們以選課資料為例,將選課資料與學生資料、科目資料切割開來,並建立好欄位之間的關聯性,這樣只要記錄學號就可以連帶找出該學生的姓名與班級;科目部分也是一樣,以課程編號與科目表相連,於是就可以帶出該課程的細節資訊,譬如任課老師或上課時間等等。因為學生資料與科目資料都是唯一的,所以資料不會寫錯或重複,而且可以跨越多個資料表組織出資料檢視表(在Access軟體中稱為查詢),可以更具彈性的檢視(查詢)資料,不必受限於一次只能看一個資料表的檢視方式。
本單元以選課網頁為例,根據學生資料、課程資料與選課資料為基礎,可以建立各個課程的點名單,或選課的總表,並以它為基礎建立一個簡單的加選與退選的功能。

建立資料庫
請先建立一個ASP.NET空網站,並在網站目錄內手動加入一個名為App_Data的目錄。
接著參考建立Access資料庫單元,打開Access2010資料庫軟體,建立一個新的資料庫,將資料庫檔案放到App_Data。
資料庫檔案必須放在這個特定目錄之內,Visual Studio軟體的資料庫總管才會正常運作,這對後續的程式至關重要。
接下來建立以下三個資料表:
A.學生資料
設定欄位定義如下:

輸入幾筆資料:

B.課程資料
設定欄位定義如下:

輸入幾筆資料:

C.選課資料
在此兩欄位都選為主索引鍵,請用Shift或Ctrl鍵加選第二欄,表示「學號┼課程編號」的組合值不能重複!

輸入幾筆資料:

可以看到這個表變得很簡單,分別是三位學生各選了兩門課的意思。我們希望稍後可以列出各科目的點名單
40分
建立資料欄位關聯
請到資料庫工具→選擇資料庫關聯圖

此時如果問你要加入哪幾張資料表,請加入所有資料表。
接著將選課資料學號項目用滑鼠拖曳到學生資料學號,表示我想建立兩者的關聯性:

出現編輯關聯小視窗時選擇「建立」,就完成關聯選擇,接著在同樣建立兩個課程編號欄位的關聯。
記得應該由選課資料表往外拉出,代表以此表為主體。完成後的畫面如下,會有黑線相連,這是告訴資料庫:這兩個欄位在不同的資料表代表的意義是一樣的!接著按下磁碟圖示儲存,檔名使用預設值即可。

45分
建立查詢
此階段就是要定義一個自訂表格要顯示不太相同於個別資料表的內容,通常是兩三個表資料的組合。譬如此地目標是建立一個程式設計課程的點名單,也就是顯示所有選了程式設計課的學生名單。請先到功能表的「建立」項目下選擇「查詢設計」如下圖:

跳出下面視窗時全選所有資料表,按「新增」:

接著在畫面下方選擇以下欄位,請注意同時選對欄位的來源資料表(第二列),在準則處寫入篩選條件,此地就是
課程編號要等於"0001",也就是只有編號0001的程式設計課的資料會被列出來,就會變成程式設計的點名單了!

此時再按下儲存將表存為:程式設計點名單

50分
網頁呈現檢視表
接著回到網頁開發軟體,打開資料庫總管展勘「檢視表」應該會發現如下畫面:

在Access軟體中稱為查詢設計的物件,在這邊被稱為「檢視表」

接著開啟一個ASPX網頁,用GridView設定檢視這個『程式設計點名單』的檢視表,畫面應該如下:

60分
簡易加退選功能
接著我們要時做一個簡易版的加退選課頁面,首先請仿照上例,建立一個選課總表,就是不要加入篩選準則,讓所有選課資料都顯示唯一張表,存為「選課總表」。

開一張網頁用GridView顯示的畫面如下:

加選功能
請在下方設計兩個DropDownList物件分別連到學生資料與課程資料的資料表,
請注意要讓選單外顯學生姓名課程名稱,內藏Value則為學號課程編號!AutoPostBack選項不要勾選!
接著再加入一個確定選課的按鍵:
執行畫面如下:

選課按鍵的程式碼如下:

程式意義是先建立新增資料的SQL,學號來自DropDownList1的Value,課程編號來自DropDownList2的Value。
然後借用AccessDataSource1來完成與資料庫的溝通,最後重新連結GridView1。
我們替張三加選一門網路資料庫的結果如下:

70分
挑戰題之一(+5):按目前程式寫法,如果重複選取已選課程,是會當掉的!
請自行參考以前教過的單元資料程式,使它錯誤時可以提示使用者,且不會當掉。

退選功能
退選功能就是要能選取某一筆資料令其消失,請先讓上述的GridView物件加入樞紐分析表模式:

80分
挑戰題之二(+5):如何讓選取鍵變成按鍵(Butoon)外觀,為GridView加上格線(預設無格線),而且內文變成「退選」?
接著雙按前面的選取紐寫程式如下:

程式意義是當你選擇某一行時GridView1.SelectedRow就是你選的那一行,Cells就是第幾格,此處還是用索引計算的,但是第一行的按鍵要算進去,所以Cells(0)其實是指按鍵,不是資料。我們依序取得選擇行的學號與課程編號再據以製作刪除的SQL命令。
完成畫面如下,被按到的那行應該會立即消失:


挑戰題之三(+10):建立搜尋某學生課表的功能(不能用檢視表方式)