使用 DataSet 建立一個三層式架構的資料存取網頁

在上文中作者示範了一個使用 VS2008, 利用 DataSet/ObjectDataSource 以建立 3-tier 的資料存取網頁。重點在於作者是使用螢幕錄影的方式進行教學的, 十分清楚易懂。在微軟又發表一大堆新技術的今天(像 LINQ、Entity Framework 等), 我們仍能看到使用傳統 ADO.NET 方式來存取資料的教學, 這已經愈來愈不容易了...

 

請先參考這個網址: http://blog.dmbcllc.com/2008/02/29/datasets-objectdatasource-and-3-tier-aspnet/

在上文中作者示範了一個使用 VS2008, 利用 DataSet/ObjectDataSource 以建立 3-tier 的資料存取網頁。重點在於作者是使用螢幕錄影的方式進行教學的, 十分清楚易懂。在微軟又發表一大堆新技術的今天(像 LINQ、Entity Framework 等), 我們仍能看到使用傳統 ADO.NET 方式來存取資料的教學, 這已經愈來愈不容易了。雖然作者講的是英文, 但是透過畫面的操作, 就算英文程度再爛的人, 也應該能夠清楚明白其重點。

基本上操作的步驟大致如下:

1. 在 App_Code 之下建立一個 DataSet 檔案 (你不一定要建立在 App_Code 裡面; 你可以在 App_Code 之下再建立子目錄), 例如 ~/App_Code/Products/ProductDataSet.xsd

2. 從 Server Explorer (伺服器總管)中把一個資料表直接拉到這個 DataSet 畫面上, VS 會幫你自動做好其它的事情。不過這不代表你不能額外做一些改變; 比方說, 你可以在該資料表表頭處按下滑鼠右鍵, 再選 Add... Query, 你就可以自行建立一個指令, 例如一個稱為 QueryData(@PID) 的指令, 其 SQL 指令為 SELECT * FROM dbo.tbl WHERE (PID= @PID)

請注意, 如果你這個新的 Query 的 Query Type 不是 "SELECT which returns rows" 的話, 它可能不能當做網頁控制項的 Data Source

3. 接著, 建立一個類別 (建議你把這個程式放在和上面那個 DataSet 檔案相同的子目錄下), 在內容中撰寫程式如下:

private ProductDataSetTableAdapter.tblTableAdapter adptr = new ProductDataSet.tblTableAdapter ();

public DataTable getData()
{
            return (DataTable) adptr.GetData();
}

4. 現在我們可以在網頁上建立 ObjectDataSource 物件以供 Container 物件 (例如 GridView) 使用了。請先建立一個新的 ObjectDataSource 物件, 在選擇其 DataSource 時, 將 Show only data components 取消勾選, 然後從清單裡面挑選上述類別中的 getData() 方法即可

我想, 你應該也可以注意到, 我們在第四個步驟中, 如果你不選擇自訂類別中的 getData() 方法, 你其實也可以從 DataSet 選擇原來的 GetData() 方法, 其結果也相同。然而, 如果你這麼做的話, 我們在第三步驟中所建立的商業邏輯層 (Business Logic Layer, BLL) 其實也可以捨棄了。那麼, 為什麼我們還要那麼麻煩的建立商業邏輯層呢?

在商業邏輯層中, 因為我們可以加上各種程式碼來進行更進階的應用和判斷, 而且可以跟資料存取層 (Data Access Layer, DAL) 更明確的切開, 所以這是一個比較正規的三層式架構。當然, 不管是不是三層式架構, 只要能達成目的, 沒有人說一定要非要使用三層式架構不可; 見仁見智吧。

不過我個人比較喜歡本文描述的這種做法。使用 DataSet, 其實只是幫你把底層的資料存取動作自動產生並且包起來而已, 如果你要自己寫程式來做這一段, 也沒有問題。不過如果透過 BLL + DL, 這其實比較趨近於物件導向中的資訊封裝的概念, 也更方便未來的修改, 更可以因為把物件包裝成類別, 未來可以再寫其它類別來繼承, 可以說是一舉多得的。


Dev 2Share @ 點部落