最簡單的資料庫是文字檔案
       最簡單的資料庫其實就是一般可以用記事本程式建立與編輯的文字檔。正規的資料庫固然無所不能,但是我們去巷口便利商店買泡麵應該不會開汽車去吧?走路或騎單車去都比較方便,很多時候簡易的資料處理用文字檔案就夠了!有趣的是資料庫盛行之後很多程式設計書籍反而忽略了最基本的檔案操作介紹,真的有很多程式師會用複雜的資料庫卻不會用簡易的文字檔處理問題。本單元就是介紹使用文字檔案紀錄訪客人數、姓名與到訪時間的一個範例,重點在於如何用文字檔案達到與資料庫一樣,可以新增刪除資料的目的。也可以藉此先體驗一下通常不透明的資料庫檔案內部發生的事件過程。

網頁設計
請開啟一個ASP.NET空網站,從功能表「網站」→「加入新項目」加入一個 Web Form(Default.aspx),設計網頁如下:

1.第一行是直接輸入的文字加上一個 Label 物件,稍後將用來顯示訪客人數。
2.第二行是提示文字加上一個 TextBox 與 Button 物件,用於輸入訪客姓名。
3.「訪客名稱」應該是一個 Label 物件,稍後用於顯示訪客名稱。
4.接著是提示文字與一個 ListBox物件,用於顯示所有訪客名單,此物件的AutoPostBack屬性必須設為 True
5.「來訪時間」應該是一個 Label 物件,稍後用於顯示被選取的訪客來訪的時間。
6.顯示「刪除選定資料」的是一個 Button物件。
7.「來訪名單下載」是一個 HyperLink(超連結)物件,在此先修改 Text屬性即可。

建立文字資料檔案
1.請從功能表「網站」→「加入新項目」加入一個「文字檔」,更名為 NV.txt 用於紀錄訪客人數,原始資料寫入"0"!

2.繼續加入一個文字檔案,但是請將檔名改為「Data.csv」,此檔案用於紀錄訪客名稱與到訪時間,不需預先加入資料。
副檔名「csv」的預設意義是逗點為欄位分隔字元的文字檔案,一行文字代表一筆資料。如果你安裝了 Excel 軟體,Windows系統會以 Excel 開啟這種檔案,還會自動依照分行與逗點將資料分別寫入不同的資料行與資料格。
3.接著請將網頁上 HyperLink 物件的 NavigateUrl 屬性設定為「Data.csv」檔案,訪客就可以自此連結下載此檔案了!

有關訪客計數器的程式
請雙按網頁設計頁面空白處,切換到程式頁面出現Page_Load副程式框架後寫程式如下:

1.在程式碼頁面最上方匯入 System.IO 命名空間,這裡會提供檔案輸出入程式需要的函式庫。
2.加入 Page.IsPostBack 條件式,所謂 PostBoack是網頁回應的意思,初次進入此網頁時此值是 False,之後使用者每次操作此網頁的物件時(譬如按下Button或重新整理) Page_Load事件都會被觸發,但是 Page.IsPostBack 的值會變成 True。
3.訪客計數器不能因為使用者按下重新整理或Button就增加,因此必須寫在Page.IsPostBack = False的條件式之內,這樣就比較不容易將人數灌水了!
4.訪客人數必須自檔案「NV.txt」讀取,在此使用 File.ReadAllText方法讀取,因為此方法必須指定檔案的磁碟位置,但是我們通常不會知道網站伺服器將自己的網站放到哪一個磁碟,因此要使用 Server.MapPath方法找出檔案的實際磁碟位置。
5.讀取訪客人數之後直接 +1顯示於 Label1,但可以使用 Format方法,讓數字變成類似「000001」這樣的格式。
6.最後使用 File.WriteAllText方法將新的訪客人數寫回檔案,請注意:這個方法是會直接將原來檔案內容覆蓋的!
試試看,此時執行程式就會看到訪客人數的顯示了!

有時候你會看到這樣的視窗:

這是因為你在軟體中開啟了「NV..txt」的檔案,但是我們剛剛寫的程式直接將該檔在「磁碟」裡的內容改寫了,所以提醒你目前軟體視窗顯示的這個檔案內容已經與磁碟檔內容不同了!要不要重新載入呢?通常是要的!

輸入訪客名字的程式
雙按網頁上的 Button1寫程式如下:

1.首先建立一個字串將訪客輸入名稱與目前時間用一個逗點串聯。
2.接著建立一個文字資料寫入物件W,就是定義他是一個可以附加資料(AppendText)到「Data.csv」檔案的物件。
3.寫入資料並關閉W物件,在Label2顯示問候回應訊息。
4.最後是呼叫一個自訂副程序 ListFile在 ListBox1裡面顯示所有歷史訪客的名單,程式碼如下:

1.先清除 ListBox1的顯示內容。
2.使用File.ReadAllLines(讀取所有資料行)這個方法將資料分行讀入字串陣列D。第一資料字串就會變成D(0),依此類推。
3.使用For Each迴圈一一取出D的成員,事實上就是一行一行處理了!與For Next的差別是For Each不必寫序號(如 i=1 To 2)
4.每行資料以逗點切開為C字串陣列,C(0)應該是訪客名稱,C(1)就是到訪時間。
5.將C(0)與C(1)組織成為一個清單項目物件(ListItem) L,加入ListBox1即完成一個項目的新增。
此時執行程式應該在輸入自己姓名後就能看到歷史名單,畫面如下:

你也可以按「來訪名單下載」的連結下載CSV檔,但是有可能出現如下中文字變成亂碼的畫面:

這是因為網頁程式預設都是使用 UTF-8編碼,但是 Excel預設會使用 ANSI編碼開啟csv檔案!如果碰到這種狀況不必慌張,使用記事本程式開啟這個檔,再另存新檔,指定用ANSI編碼即可:

當然如果使用者在網頁上直接開啟此檔時無法避免會看到亂碼,有點傷及專業形象!可以將程式加入以下兩行,並將HyperLink的目標連結到新的Data0.csv即可:

事實上就是改變編碼存成另一個 Data0.csv 而已!寫程式時 Encoding選項沒有ANSI的選項,改用系統預設(Default)即可。

顯示訪客到訪時間
雙按ListBox1物件進入副程序寫程式如下:

這裡只是將選擇項目的值成員,就是到訪時間顯示在Label3而已!

刪除選取資料的程式
雙按Button2寫程式如下:

1.使用Remove方法刪掉清單中選定的項目(SelectedItem)
2.使用For Each迴圈列舉ListBox1之中剩餘的項目
3.將各個項目顯示的Text與Value屬性串成字串,注意應該加上換行字元vbNewLine
4.寫回「Data.csv」檔案(使用覆蓋元內容的方式)
5.為了避免亂碼問題,在此也應該轉存一個 Default 編碼的 Data0.csv 檔案。

執行程式現在應該可以刪除資料了!
至此我們已經可以使用文字檔案完整的操作資料的讀、寫與刪除的動作,甚至可以讓資料分成多個欄位來處理。這已經是一般資料庫的基本功能了,如果你的資料並不龐大,或使用的電腦環境中缺乏資料庫軟體,可以考慮直接用文字檔,這樣「開啟」資料庫檔案來檢視或修改處理就非常容易了!