簡介:
         ADO.NET是微軟公司開發用來操作資料庫的函式庫,資料庫尤其是網路資料庫的運作機制實在太複雜了,但是基於資料處理的需求、效率以及安全性,變得如此複雜也是不得以的。為了讓應用程式設計者盡量減少花時間在研究資料庫的細節,很多的研究包括ADO.NET都是讓使用資料庫變得比較簡單,事實上本課程前面的單元用過的DataSource物件等等東西都是建構於ADO.NET的程式封裝物件,讓我們不必寫程式就可以用網頁物件與資料庫相連讀寫資料,這是比直接用ADO.NET指令寫程式更省力的方式。其實那些引導我們設定的精靈視窗背後就是幫我們寫出需要的ADO.NET程式,包括資料庫的連結、登入與讀寫功能等等。
        記得嗎?我們曾為了使用帳密登入將資料庫的資料先載入到GridView物件內,再以表格的方式讀取供程式使用。是不是有辦法可以直接讀取資料庫的資料,而不必經過網頁物件?答案是可以的!而且速度會比較快,也節省記憶體,對於目前雲端運算的發展趨勢來說,甚麼東西都需要網路傳遞,智慧型裝置的記憶體也小,CPU等級不能太高,任何節省資源的程式技術都值得好好學習。
        如前所述,本課程不會深入講很多理論,還是以最常用的指令學寫一些程式範例為主。要用ADO.NET操作程式庫基本上需要學的主要幾個程式物件是:
1. Connection物件:用來與資料庫連結與登入
2. Command物件:用來下達SQL指令
3. DataReader物件:用來循序讀取資料庫的資料(一行一行讀取)
4. DataSet物件:就是資料庫檔案讀取到記憶體的一部份,架構也是一個資料庫。
5. DataAdapter物件:用來將資料庫資料讀入DataSet,或寫回資料庫的物件。
      接下來幾個單元就會使用簡單的範例讓大家學習使用這些物件的程式技巧。


讀取一張資料表的某一個欄位資料
        廢話不多說,首先我們來試驗將SQL資料庫資料表中某一個欄位資料讀出來的完整動作。首先請開啟一個ASP.NET空網站,下載之前網站登入機制單元製作的網站目錄(下載網站),將其中的App_Data目錄直接拷貝到新網站目錄,並開啟一個新網頁,用GridView物件將『會員資料』表完整顯示出來,下方加入一個Label與Button物件,網頁執行後會是這個樣子:

我們現在就要寫程式在Button裡面,希望按下按鍵Label會出現指定欄位的資料,應該是密碼"456"。
要做到以上目標的分解動作是:
1.建立與資料庫的連結:Connection
2.建立讀取資料的命令:Command(就是SQL指令)
3.建立讀取資料的讀取器:DataReader
4.用DataReader逐行讀取資料
其中第一件事最麻煩,就是要建立資料連結字串,完整學完所有需要的參數設定方式太抽象耗時,而且老實說每個程式版本都有可能不一樣,所以還是借用了精靈設定,先讓軟體幫我們產生連結字串的樣板,就是連結GridView時會在網站的web.config檔案內產生連結字串(ConnectionString)如下:

我們稍後需要的連結字串以文字模式拷貝如下:
"Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Database.mdf; Integrated Security=True;User Instance=True"
其中Data Source是伺服器名稱,AttachDbFilename是資料檔案名稱,|DataDirectory|是指定的資料庫檔案目錄,在此就是App_Data了!Integrated Security是指登入驗證方式為整合式驗證,其實就是使用你登入Windows系統的身分。User Instance是說使用者可否建立獨立程式執行實體,暫時不必管它。

如果資料庫是Access 2003的格式,副檔名為 *.mdb,然後也是將檔案放在網站的App_Data目錄內,連結字串應該是:
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|檔名.mdb
如果是Access 2007的格式,副檔名為 *.accdb 也是將檔案放在網站的App_Data目錄內,連結字串應該是:
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=|DataDirectory|檔名.accdb

請注意如果不用『|DataDirectory|』的寫法就必須寫實際的磁碟檔案路徑名稱,如:C:\WebSite1\App_Data\檔名.mdb

完整程式碼


首先必須注意的是要匯入 System.Data.SqlClient 命名空間,這是相關物件定義的函示庫。
接著就是建立 Connection物件(資料庫連結字串)與 Command物件(SQL指令),然後讓 SqlDataReader物件執行SQL指令讀取符合條件的資料,每次讀取動作就會讀一行資料,這個物件是無法跳行讀取的。每一行資料的不同欄位則用 Item(?)指定。

讀取所有資料
接著我們試試修改SQL指令為只讀帳號,並將所有帳號寫到一個ListBox裡面。當然要先加一個ListBox物件到網頁裡面,還有另一個Button2按鍵,程式與執行結果如下:


程式碼與Button1大半是一樣的,但是Cmd裡面的SQL只選帳號,所以每一行讀出的資料只有一個欄位,所以加入列表的就是 Item(0)了!還有Dr.Read事實上是一個Function型態的副程式(方法),去資料庫讀資料時如果有讀到會回傳True,迴圈就會繼續讀下一行,如果沒有讀到資料就是資料讀完了,會回傳False,這個特殊的迴圈就會停止。這種寫法就是在不確定資料有幾行時要程式讀到完的寫法,有點特別,但是很常用到。