ASP.NET2.0資料操作之建立資料訪問層(1)

來源:互聯網
上載者:User
作為web開發人員,我們的生活圍繞著資料操作。我們建立資料庫來儲存資料,寫編碼來訪問和修改資料,設計 網頁來採集和摘要資料。本文是研究在ASP.NET 2.0中實現這些常見的資料訪問模式之技術的長篇系列教程的第一篇。我們將從建立一個 軟體架構開始,這個架構的組成部分包括一個使用強型別的DataSet的資料訪問層(DAL),一個實施使用者定義的商務規則的商務邏輯層(BLL),以及一個由共用頁面配置的ASP.NET網頁組成的表現層。在打下這個後端的基礎工作之後,我們將開始轉向報表,示範如何顯示,匯總,採集,和驗證web 應用的資料。這些教程旨在簡明扼要,使用了許多螢幕,提供了按步就 班(step-by-step)的指導,帶你經曆這個開發過程。每個教程都有C# 版和VB版,並且附有涉及的完整的編碼的 下載。(這第一個教程比較長,但以後其他的教程將以更容易消化的篇幅推出。)

  在這些教程中,我們將使用置於App_Data 目錄內的微 軟SQL Server 2005 Express版的Northwind資料庫。除了資料庫檔案外,App_Data目錄還帶有用於建立資料庫的SQL指令碼,萬一你想使用別的資料庫版本的話。如果你願意的話,你也可以直接從微軟下載這些指令碼。如果你使用別的SQL Server版本的Northwind資料庫的話,你需要更新Web.config檔案中的NORTHWNDConnectionString設定。本教程中的web應用是個基於檔案系統的網站項目,是使用Visual Studio 2005 專業版建立起來的。但是,所有的教程都可以在Visual Studio 2005的免費版本Visual Web Developer中運行。

  在這個教程裡,我們將從頭開始,先建立一個資料訪問層(DAL),然後在第二個教程裡建立一個商務邏輯層(BLL),在第三個教程裡設計頁面配置和導航。以後的教程將建立在這三個教程的基礎之上。在第一個教程裡,我們要討論的內容多多,所以,請開啟Visual Studio,讓我們動起手來!

  第一步:建立一個Web項目,設定資料庫串連

  在我們開始建立資料訪問層(DAL)之前,我們首先需要建立一個網站,以及建立一個資料庫。我們從建立一個基於檔案系統的ASP.NET 網站開始。次序如下,開啟檔案(File)菜單,選擇新的網站 (New Web Site),系統會顯示一個新網站對話方塊,選擇ASP.NET網站模板(Web Site template),設定定 位(Location)列表的選項為檔案系統( File System),然後選這一個放置這個網站的檔案夾,然後選擇編程語 言為C#。


圖 1: 建立一個基於檔案系統的網站

  Visual Studio會為你產生一個新的網站,同時產生一個名為Default.aspx的網頁,和一 個App_Data檔案夾。

  網站產生之後,下一步是在Visual Studio的伺服器資源管理員(Server Explorer)裡為你的資料庫添加一個引 用(reference)。把一個資料庫添加到伺服器總管之後,你就能在Visual Studio環境裡添加資料表,存 儲過程,視圖等等。你也能查看資料庫裡的資料,手工或用查詢產生器(Query Builder)的圖形介面建立你自己的查詢語句。此外,當我們為DAL建立強型別的DataSet時,我們需要把Visual Studio指向作為DataSet資料來源的目標資料庫。雖然我們可以在適當時候提供所昀敳獴搨 ???oЁ涉及的資料庫連接資訊,但假如我們預 先在伺服器總管裡註冊這些資料庫的話,Visual Studio會自動把這些資料庫填充到一個下拉式清單中去 。

  把Northwind資料庫添加到伺服器總管中去的步驟取決於你想使用放置在App_Data檔案夾 裡的SQL Server 2005 Express 版本資料庫,還是你想使用已經建立好了的SQL Server 2000或2005 資料庫服 務器。

  使用置於App_Data檔案夾中的資料庫

  如果你沒有可串連的SQL Server 2000 或2005伺服器,或者你就是想避免給資料庫伺服器添加資料庫,你可以使用SQL Server 2005 Express版的Northwind資料庫,該資料庫位於下載源碼中的App_Data檔案夾裡(NORTHWND.MDF)。

  置於App_Data檔案夾裡的資料庫會被自動添加到伺服器總管中。假設你已經在你的機器上安裝了SQL Server 2005 Express版本,那麼你應該在伺服器總管中看到一個名為NORTHWND.MDF的節點,你可以將這個節點擴充開來,瀏覽其中的資料表,視圖,預存程序等等 (參考圖2)。

  App_Data檔案夾還可以放置微軟的Access.mdb資料庫檔案,跟SQL Server 的數 據庫檔案類似,這些Access檔案會被自動地添加到伺服器總管中。如果你不想用任何SQL Server資料庫,那麼你總歸可以下載微軟Access版本的Northwind 資料庫檔案,然後將其放置於App_Data檔案夾中。但記住,Access資料庫沒有SQL Server那麼多功能,而且它並不是設計來在網站情形下使用的。此外,在後面幾個教程裡將用到Access資料庫不支援的資料庫層次的功能。

  串連到微軟SQL Server 2000或2005資料庫伺服器中的資料庫

  或者,你也可以串連到安裝在資料庫伺服器上的Northwind資料庫。假如資料庫伺服器上尚未安裝Northwind資料庫的話,你首先必須運行本教程下載檔案中的安裝指令碼來把資料庫添加到資料庫伺服器上去,或者你也可以從微軟網站上直接下載SQL Server 2000的Northwind資料庫以及安裝指令碼

  安裝資料庫完畢之後,去Visual Studio中的伺服器總管,在資料連線(Data Connections)節點上按右滑鼠,選擇“添加串連(Add Connection)”。如果你看不到伺服器總管,去菜單“查看(View)”點擊 “伺服器總管”,或者按按鍵組合Ctrl+Alt+S來開啟伺服器總管。這會開啟添加串連的對話方塊,在這上面,你可以設定需要已連線的服務器,認證資訊,以及資料庫名字。在你成功設定資料庫串連資訊,按OK按鈕之後,資料庫就會被添加成資料連線節點之下的一個節點。然後,你就可以擴充資料庫節點來瀏覽資料表,視圖,預存程序等等。


圖 2: 添加一個到你的資料庫伺服器上的Northwind資料庫的串連

  第二步:建立一個資料訪問層

  與資料打交道時,一種做法是把跟資料相關的邏輯直接放在表現層中(在一個web應用裡,ASP.NET網頁構成了表現層)。其形式一般是在ASP.NET 網頁的編碼部分寫ADO.NET 編碼或者在標識符部 分使用SqlDataSource控制項。在這兩種形式裡,這種做法都把資料訪問邏輯與表現層緊密耦合起來了。但推薦 的做法是,把資料訪問邏輯從表現層分離開來。這個分開的層被稱作是資料訪問層,簡寫為DAL,一般是通過 一個單獨的類庫項目來實現的。這種分層架構的好處在很多文獻裡都有闡述(詳見本教程最後的“附加讀物”裡 的資源),在本系列中我們將採用這種方法。

  跟底層資料來源相關的所有編碼,譬如建立到資料庫的串連,發出SELECT,INSERT ,UPDATE,和DELETE命令等的編碼,都應該放置在DAL中。表現層不應該包含對 這些資料訪問編碼的任何引用,而應該調用DAL中的編碼來作所有的資料訪問請求。資料訪問層包含訪問底層資料庫資料的方法。譬如,Northwind資料庫中,有Products和Categories兩個表,它們記錄了可供銷售的產品以及這些產品 所屬的分類。在我們的DAL中,我們將有下面這樣的方法:

  • GetCategories(), 返回所有分類的資訊
  • GetProducts(), 返回所有產品的資訊
  • GetProductsByCategoryID(categoryID), 返回屬於指定分類的所有產品的信 息
  • GetProductByProductID(productID), 返回指定產品的資訊

  這些方法,被調用後,將串連到資料庫,發出合適的查詢,然後返回結果。我們如何返回這些結果是很重要的 。這些方法可以直接返回資料庫查詢填充的DataSet 或者DataReader ,但理想的辦法是把這些結果以強類 型對象的形式返回。一個強型別的對象,其schema是編譯時間嚴格定義好的,而相比之下,弱類型的對象, 其schema在運行時之前是未知的。

  譬如,DataReader和普通的DataSet是弱類型對象,因為它們的schema是被用來填充它們的資料庫查詢返回的欄位來定義的。要訪問弱類型DataTable中的一個特定欄位,我們需要用這樣的句法:DataTable.Rows[index] ["columnName"]。這個例子中的DataTable的弱類型性質表現在於,我們需要通過一個字串或序號索引來訪問欄位名稱。而在另一個方面,一個強型別的DataTable,它的所有的欄位都是通過屬性的形式來實現的 ,訪問的編碼就會象這樣:DataTable.Rows[index].columnName

  要返回強型別對象,開發人員可以建立自訂業務對象,或者使用強型別的DataSet。開發人員實現的業務對 象類,其屬性往往是對相應的底層資料表的欄位的映射。而一個強型別的DataSet,則是Visual Studio基於數 據庫schema為你產生的一個類,其成員的類型都是由這個schema決定的。強型別的DataSet本身,是由繼承 於ADO.NET中DataSet,DataTable,和DataRow類的子類組成的。除了強型別的DataTable外,強型別的DataSet現在還包括TableAdapter類,這些類包含了填充DataSet中的DataTable和把 DataTable的改動傳回資料庫的各種方法。

  在這些教程的架構裡,我們將使用強型別的DataSet。圖3示範說明了使用強型別的DataSet之應用程式的不 同層間的流程(workflow)。


圖 3: 把所有的資料訪問編碼委託給DAL

  建立強型別的DataSet和Table Adapter

  我們開始建立我們的DAL,先給我們的項目添加一個強型別的DataSet。做法如下,在昀敳獴搨 ???oЁ解決方案管理器裡的項目 節點上按右滑鼠,選擇“添加新項(Add a New Item)”。在模板列單裡選擇DataSet,將其命名 為Northwind.xsd。


圖 4: 給你的項目添加一個新的DataSet

  在點擊“添加(Add)”按鈕後,Visual Studio會問我們是否將DataSet添加到App_Code檔案夾中,選擇“Yes” 。然後Visual Studio會顯示強型別的DataSet的設計器,同時會啟動TableAdapter設定精靈,允許你給你的強 類型DataSet添加第一個TableAdapter。

  強型別的DataSet 起了強型別對象的集合的作用,它由強型別DataTable執行個體組成,每個強型別DataTable又進 而由強型別的DataRow執行個體組成。我們將為這個教程系列要用到的每個資料表建立一個對應的強型別DataTable 。讓我們開始吧,先為Products表建立一個DataTable。

  記住,強型別的DataTable並不包括如何訪問對應底層的資料表的任何資訊。要擷取用來填充DataTable的資料 ,我們使用TableAdapter類,它提供了資料訪問層的功能。對於我們的Products DataTable, 相應的TableAdapter 類將包 括GetProducts()和GetProductByCategoryID(categoryID)等方法,而我 們將在表現層調用這些方法。DataTable的作用是在分層間傳輸資料。

  TableAdapter設定精靈首先要你選擇使用哪個資料庫。下拉框裡列出了伺服器總管內的那些資料庫。如 果你預先沒有把Northwind資料庫添加到伺服器總管裡去的話,這時你可以點擊新連線按鍵來添加。


圖 5: 在下拉框裡選擇Northwind資料庫

  選擇好資料庫後,按“下一步”按鈕,嚮導會問你是否想在Web.config檔案裡存放連接字串。 將連接字串存放在Web.config檔案裡,你可以避免把連接字串硬寫在TableAdapter類的編 碼中,如果將來連接字串資訊改動的話,這種做法會極大地簡化要做的編碼改動。如果你選擇在設定檔存 放連接字串,連接字串將被置放於<connectionStrings>段落中,這個段落可以被加密來提高安全,也可以通過IIS 圖形介面管理工具中的新的ASP.NET 2.0屬性頁面來修改。當然這個工具更適於管理員。


圖6: 在Web.config中存放連接字串

  接下來,我們需要定義第一個強型別的DataTable的schema,同時為用來填充強型別DataSet的TableAdapter類 提供第一個方法。這兩步可以通過建立一個返回對應於DataTable的資料表的欄位的查詢同時完成。在嚮導的 最後,我們將為這個查詢對應的方法命名。完成後,這個方法可以在表現層調用,它會執行設定好的查詢,進 而填充一個強型別的DataTable。

  開始定義SQL查詢之前,我們必須首先選擇我們想要TableAdapter執行查詢的方式。我們可以直接用ad-hoc的SQL語句,或建立一個新的預存程序,或使用現存的預存程序。在這些教程裡,我們將使用ad-hoc的SQL語句。


圖 7: 用SQL語句查詢資料

  至此,我們可以手工輸入SQL查詢。當產生TableAdapter的第一個方法時,你一般想要讓你的查詢返回那些需 要在對應的DataTable中存放的欄位。我們可以建立一個從Products表裡返回所有欄位,所有數 據行的查詢來達到我們的目的:


圖 8: 在文字框裡輸入SQL查詢

  或者,我們可以使用查詢產生器(Query Builder),用圖形介面來構造查詢,9所示。


圖 9: 通過查詢編輯器產生查詢

  在產生查詢之後,在移到下一屏之前,點擊“進階選項(Advanced Options)”按鈕。在網站項目裡,在預設 情形下,“產生插入,更新,刪除語句”是唯一已被選中的選項。如果你在類庫項目或Windows項目裡運行這個 嚮導的話,“採用最佳化的並發控制(optimistic concurrency)”選項也會被選中。現在先別選“採用最佳化的並發 控制”這個選項。在以後的教程裡我們會詳細討論最佳化的並發控制。


圖 10: 只選“產生插入,更新和刪除語句”這個選項

  在核實進階選項後,按“下一步(Next)”按鈕轉到最後一屏。在這裡,設定精靈會問我們要給TableAdapter選擇添加什麼方法。填充資料有兩種模式:

  • 填充DataTable – 這個做法會產生一個方法,該方法接受一個DataTable的參數,基於查詢的結果 填充這個DataTable。譬如,ADO.NET的DataAdapter類就是在它的Fill()方法中實現這個模式的 。
  • 返回DataTable – 這個做法會產生一個方法,該方法會建立並填充一個DataTable,然後將 其作為方法的傳回值。

  你可以讓TableAdapter實現其中一個模式或者同時實現兩個模式。你也可以重新命名這裡提供的這些方法。讓 我們對兩個複選框的選項不做改動,雖然我們在這些教程裡只需要使用後面這個模式。同時,讓我們把那個很 一般性的GetData方法名改成GetProducts。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.