日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ASP.NET 2.0數(shù)據(jù)教程之一: 創(chuàng)建一個數(shù)據(jù)訪問層

系統(tǒng) 2338 0

在ASP.NET 2.0中操作數(shù)據(jù)::創(chuàng)建一個數(shù)據(jù)訪問層

原文 | 下載本教程中的編碼例子 | 下載本教程的英文PDF版

導(dǎo)言

作為web開發(fā)人員,我們的生活圍繞著數(shù)據(jù)操作。我們建立數(shù)據(jù)庫來存儲數(shù)據(jù),寫編碼來訪問和修改數(shù)據(jù),設(shè)計網(wǎng)頁來采集和匯總數(shù)據(jù)。本文是研究在ASP.NET 2.0中實現(xiàn)這些常見的數(shù)據(jù)訪問模式之技術(shù)的長篇系列教程的第一篇。我們將從創(chuàng)建一個 軟件框架 開始,這個框架的組成部分包括一個使用強(qiáng)類型的DataSet的數(shù)據(jù)訪問層(DAL),一個實施用戶定義的業(yè)務(wù)規(guī)則的業(yè)務(wù)邏輯層(BLL),以及一個由共享頁面布局的ASP.NET網(wǎng)頁組成的表現(xiàn)層。在打下這個后端的基礎(chǔ)工作之后,我們將開始轉(zhuǎn)向報表,示范如何顯示,匯總,采集,和驗證web 應(yīng)用的數(shù)據(jù)。這些教程旨在簡明扼要,使用了許多屏幕截圖,提供了按步就 班(step-by-step)的指導(dǎo),帶你經(jīng)歷這個開發(fā)過程。每個教程都有C# 版和VB版,并且附有涉及的完整的編碼的下載。(這第一個教程比較長,但以后其他的教程將以更容易消化的篇幅推出。)

在這些教程中,我們將使用置于App_Data 目錄內(nèi)的 微 軟SQL Server 2005 Express版 的Northwind數(shù)據(jù)庫。除了數(shù)據(jù)庫文件外,App_Data目錄還帶有用于創(chuàng)建數(shù)據(jù)庫的SQL腳本,萬一你想使用別的數(shù)據(jù)庫版本的話。如果你愿意的話,你也可以 直接從微軟下載 這些腳本。如果你使用別的SQL Server版本的Northwind數(shù)據(jù)庫的話,你需要更新Web.config文件中的NORTHWNDConnectionString設(shè)置。本教程中的web應(yīng)用是個基于文件系統(tǒng)的網(wǎng)站項目,是使用Visual Studio 2005 專業(yè)版建立起來的。但是,所有的教程都可以在Visual Studio 2005的免費(fèi)版本 Visual Web Developer 中運(yùn)行。

在這個教程里,我們將從頭開始,先創(chuàng)建一個數(shù)據(jù)訪問層(DAL),然后在第二個教程里創(chuàng)建一個業(yè)務(wù)邏輯層(BLL),在第三個教程里設(shè)計頁面布局和導(dǎo)航。以后的教程將建立在這三個教程的基礎(chǔ)之上。在第一個教程里,我們要討論的內(nèi)容多多,所以,請打開Visual Studio,讓我們動起手來!

第一步:創(chuàng)建一個Web項目,配置數(shù)據(jù)庫連接

在我們開始創(chuàng)建數(shù)據(jù)訪問層(DAL)之前,我們首先需要創(chuàng)建一個網(wǎng)站,以及建立一個數(shù)據(jù)庫。我們從創(chuàng)建一個基于文件系統(tǒng)的ASP.NET 網(wǎng)站開始。次序如下,打開文件(File)菜單,選擇新的網(wǎng)站 (New Web Site),系統(tǒng)會顯示一個新網(wǎng)站對話框,選擇ASP.NET網(wǎng)站模板(Web Site template),設(shè)置定 位(Location)列表的選項為文件系統(tǒng)( File System),然后選這一個放置這個網(wǎng)站的文件夾,然后選擇編程語 言為C#。

圖 1: 創(chuàng)建一個基于文件系統(tǒng)的網(wǎng)站

Visual Studio會為你生成一個新的網(wǎng)站,同時生成一個名為 Default.aspx 的網(wǎng)頁,和一 個 App_Data 文件夾。

網(wǎng)站生成之后,下一步是在Visual Studio的服務(wù)器資源管理器(Server Explorer)里為你的數(shù)據(jù)庫添加一個引 用(reference)。把一個數(shù)據(jù)庫添加到服務(wù)器資源管理器之后,你就能在Visual Studio環(huán)境里添加數(shù)據(jù)表,存 儲過程,視圖等等。你也能查看數(shù)據(jù)庫里的數(shù)據(jù),手工或用查詢生成器(Query Builder)的圖形界面建立你自己的查詢語句。此外,當(dāng)我們?yōu)镈AL創(chuàng)建強(qiáng)類型的DataSet時,我們需要把Visual Studio指向作為DataSet數(shù)據(jù)源的目標(biāo)數(shù)據(jù)庫。雖然我們可以在適當(dāng)時候提供所涉及的數(shù)據(jù)庫連接信息,但假如我們預(yù) 先在服務(wù)器資源管理器里注冊這些數(shù)據(jù)庫的話,Visual Studio會自動把這些數(shù)據(jù)庫填充到一個下拉列表中去 。

把Northwind數(shù)據(jù)庫添加到服務(wù)器資源管理器中去的步驟取決于你想使用放置在 App_Data 文件夾 里的SQL Server 2005 Express 版本數(shù)據(jù)庫,還是你想使用已經(jīng)建立好了的SQL Server 2000或2005 數(shù)據(jù)庫服 務(wù)器。

使用置于 App_Data 文件夾中的數(shù)據(jù)庫

如果你沒有可連接的SQL Server 2000 或2005服務(wù)器,或者你就是想避免給數(shù)據(jù)庫服務(wù)器添加數(shù)據(jù)庫,你可以使用SQL Server 2005 Express版的Northwind數(shù)據(jù)庫,該數(shù)據(jù)庫位于下載源碼中的 App_Data 文件夾里( NORTHWND.MDF )。

置于 App_Data 文件夾里的數(shù)據(jù)庫會被自動添加到服務(wù)器資源管理器中。假設(shè)你已經(jīng)在你的機(jī)器上安裝了SQL Server 2005 Express版本,那么你應(yīng)該在服務(wù)器資源管理器中看到一個名為NORTHWND.MDF的節(jié)點(diǎn),你可以將這個節(jié)點(diǎn)擴(kuò)展開來,瀏覽其中的數(shù)據(jù)表,視圖,存儲過程等等 (參考圖2)。

App_Data 文件夾還可以放置微軟的Access .mdb 數(shù)據(jù)庫文件,跟SQL Server 的數(shù) 據(jù)庫文件類似,這些Access文件會被自動地添加到服務(wù)器資源管理器中。如果你不想用任何SQL Server數(shù)據(jù)庫,那么你總歸可以 下載微軟Access版本的Northwind 數(shù)據(jù)庫文件 ,然后將其放置于 App_Data 文件夾中。但記住,Access數(shù)據(jù)庫沒有SQL Server那么多功能,而且它并不是設(shè)計來在網(wǎng)站情形下使用的。此外,在后面幾個教程里將用到Access數(shù)據(jù)庫不支持的數(shù)據(jù)庫層次的功能。

連接到微軟SQL Server 2000或2005數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)庫

或者,你也可以連接到安裝在數(shù)據(jù)庫服務(wù)器上的Northwind數(shù)據(jù)庫。假如數(shù)據(jù)庫服務(wù)器上尚未安裝Northwind數(shù)據(jù)庫的話,你首先必須運(yùn)行本教程下載文件中的安裝腳本來把數(shù)據(jù)庫添加到數(shù)據(jù)庫服務(wù)器上去,或者你也可以從微軟網(wǎng)站上 直接下載SQL Server 2000的Northwind數(shù)據(jù)庫以及安裝腳本

安裝數(shù)據(jù)庫完畢之后,去Visual Studio中的服務(wù)器資源管理器,在數(shù)據(jù)連接(Data Connections)節(jié)點(diǎn)上按右鼠標(biāo),選擇“添加連接(Add Connection)”。如果你看不到服務(wù)器資源管理器,去菜單“查看(View)”點(diǎn)擊 “服務(wù)器資源管理器”,或者按組合鍵Ctrl+Alt+S來打開服務(wù)器資源管理器。這會打開添加連接的對話框,在這上面,你可以設(shè)置需要連接的服務(wù)器,認(rèn)證信息,以及數(shù)據(jù)庫名字。在你成功配置數(shù)據(jù)庫連接信息,按OK按鈕之后,數(shù)據(jù)庫就會被添加成數(shù)據(jù)連接節(jié)點(diǎn)之下的一個節(jié)點(diǎn)。然后,你就可以擴(kuò)展數(shù)據(jù)庫節(jié)點(diǎn)來瀏覽數(shù)據(jù)表,視圖,存儲過程等等。

圖 2: 添加一個到你的數(shù)據(jù)庫服務(wù)器上的Northwind數(shù)據(jù)庫的連接

第二步:創(chuàng)建一個數(shù)據(jù)訪問層

與數(shù)據(jù)打交道時,一種做法是把跟數(shù)據(jù)相關(guān)的邏輯直接放在表現(xiàn)層中(在一個web應(yīng)用里,ASP.NET網(wǎng)頁構(gòu)成了表現(xiàn)層)。其形式一般是在ASP.NET 網(wǎng)頁的編碼部分寫ADO.NET 編碼或者在標(biāo)識符部 分使用SqlDataSource控件。在這兩種形式里,這種做法都把數(shù)據(jù)訪問邏輯與表現(xiàn)層緊密耦合起來了。但推薦 的做法是,把數(shù)據(jù)訪問邏輯從表現(xiàn)層分離開來。這個分開的層被稱作是數(shù)據(jù)訪問層,簡寫為DAL,一般是通過 一個單獨(dú)的類庫項目來實現(xiàn)的。這種分層框架的好處在很多文獻(xiàn)里都有闡述(詳見本教程最后的“附加讀物”里 的資源),在本系列中我們將采用這種方法。

跟底層數(shù)據(jù)源相關(guān)的所有編碼,譬如建立到數(shù)據(jù)庫的連接,發(fā)出 SELECT INSERT UPDATE ,和 DELETE 命令等的編碼,都應(yīng)該放置在DAL中。表現(xiàn)層不應(yīng)該包含對 這些數(shù)據(jù)訪問編碼的任何引用,而應(yīng)該調(diào)用DAL中的編碼來作所有的數(shù)據(jù)訪問請求。數(shù)據(jù)訪問層包含訪問底層數(shù)據(jù)庫數(shù)據(jù)的方法。譬如,Northwind數(shù)據(jù)庫 中,有 Products Categories 兩個表,它們記錄了可供銷售的產(chǎn)品以及這些產(chǎn)品 所屬的分類。在我們的DAL中,我們將有下面這樣的方法:

  • GetCategories(), 返回所有分類的信息
  • GetProducts() , 返回所有產(chǎn)品的信息
  • GetProductsByCategoryID( categoryID ) , 返回屬于指定分類的所有產(chǎn)品的信 息
  • GetProductByProductID( productID ) , 返回指定產(chǎn)品的信息

這些方法,被調(diào)用后,將連接到數(shù)據(jù)庫,發(fā)出合適的查詢,然后返回結(jié)果。我們?nèi)绾畏祷剡@些結(jié)果是很重要的 。這些方法可以直接返回數(shù)據(jù)庫查詢填充的DataSet 或者DataReader ,但理想的辦法是把這些結(jié)果以 強(qiáng)類 型對象 的形式返回。一個強(qiáng)類型的對象,其schema是編譯時嚴(yán)格定義好的,而相比之下,弱類型的對象, 其schema在運(yùn)行時之前是未知的。

譬如,DataReader和普通的DataSet是弱類型對象,因為它們的schema是被用來填充它們的數(shù)據(jù)庫查詢返回的字段來定義的。要訪問弱類型DataTable中的一個特定字段,我們需要用這樣的句法: DataTable .Rows[ index ] [" columnName "] 。這個例子中的DataTable的弱類型性質(zhì)表現(xiàn)在于,我們需要通過一個字符串或序號索引來訪問字段名稱。而在另一個方面,一個強(qiáng)類型的DataTable,它的所有的字段都是通過屬性的形式來實現(xiàn)的 ,訪問的編碼就會象這樣: DataTable .Rows[ index ]. columnName

要返回強(qiáng)類型對象,開發(fā)人員可以創(chuàng)建自定義業(yè)務(wù)對象,或者使用強(qiáng)類型的DataSet。開發(fā)人員實現(xiàn)的業(yè)務(wù)對 象類,其屬性往往是對相應(yīng)的底層數(shù)據(jù)表的字段的映射。而一個強(qiáng)類型的DataSet,則是Visual Studio基于數(shù) 據(jù)庫schema為你生成的一個類,其成員的類型都是由這個schema決定的。強(qiáng)類型的DataSet本身,是由繼承 于ADO.NET中DataSet,DataTable,和DataRow類的子類組成的。除了強(qiáng)類型的DataTable外,強(qiáng)類型的DataSet現(xiàn)在還包括TableAdapter類,這些類包含了填充DataSet中的DataTable和把 DataTable的改動傳回數(shù)據(jù)庫的各種方法。

注意: 想了解使用強(qiáng)類型DataSet比之業(yè)務(wù)對象的優(yōu)缺點(diǎn)的更多信息,請參考 設(shè) 計數(shù)據(jù)層組件以及在層間傳輸數(shù)據(jù) 一文。

在這些教程的架構(gòu)里,我們將使用強(qiáng)類型的DataSet。圖3示范說明了使用強(qiáng)類型的DataSet之應(yīng)用程序的不 同層間的流程(workflow)。

圖 3: 把所有的數(shù)據(jù)訪問編碼委托給DAL

創(chuàng)建強(qiáng)類型的DataSet和Table Adapter

我們開始創(chuàng)建我們的DAL,先給我們的項目添加一個強(qiáng)類型的DataSet。做法如下,在解決方案管理器里的項目 節(jié)點(diǎn)上按右鼠標(biāo),選擇“添加新項(Add a New Item)”。在模板列單里選擇DataSet,將其命名 為 Northwind.xsd

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

在點(diǎn)擊“添加(Add)”按鈕后,Visual Studio會問我們是否將DataSet添加到App_Code文件夾中,選擇“Yes” 。然后Visual Studio會顯示強(qiáng)類型的DataSet的設(shè)計器,同時會啟動TableAdapter配置向?qū)В试S你給你的強(qiáng) 類型DataSet添加第一個TableAdapter。

強(qiáng)類型的DataSet 起了強(qiáng)類型對象的集合的作用,它由強(qiáng)類型DataTable實例組成,每個強(qiáng)類型DataTable又進(jìn) 而由強(qiáng)類型的DataRow實例組成。我們將為這個教程系列要用到的每個數(shù)據(jù)表建立一個對應(yīng)的強(qiáng)類型DataTable 。讓我們開始吧,先為 Products 表建立一個DataTable。

記住,強(qiáng)類型的DataTable并不包括如何訪問對應(yīng)底層的數(shù)據(jù)表的任何信息。要獲取用來填充DataTable的數(shù)據(jù) ,我們使用TableAdapter類,它提供了數(shù)據(jù)訪問層的功能。對于我們的 Products DataTable, 相應(yīng)的TableAdapter 類將包 括 GetProducts() GetProductByCategoryID( categoryID ) 等方法,而我 們將在表現(xiàn)層調(diào)用這些方法。DataTable的作用是在分層間傳輸數(shù)據(jù)。

TableAdapter配置向?qū)紫纫氵x擇使用哪個數(shù)據(jù)庫。下拉框里列出了服務(wù)器資源管理器內(nèi)的那些數(shù)據(jù)庫。如 果你預(yù)先沒有把Northwind數(shù)據(jù)庫添加到服務(wù)器資源管理器里去的話,這時你可以點(diǎn)擊新連接按鈕來添加。

圖 5: 在下拉框里選擇Northwind數(shù)據(jù)庫

選擇好數(shù)據(jù)庫后,按“下一步”按鈕,向?qū)柲闶欠裣朐? Web.config 文件里存放連接字符串。 將連接字符串存放在 Web.config 文件里,你可以避免把連接字符串硬寫在TableAdapter類的編 碼中,如果將來連接字符串信息改動的話,這種做法會極大地簡化要做的編碼改動。如果你選擇在配置文件存 放連接字符串,連接字符串將被置放于 <connectionStrings> 段落中,這個段落可以被 加密 來提高安全,也可以通過IIS 圖形界面管理工具中的新的ASP.NET 2.0屬性頁來修改。當(dāng)然這個工具更適于管理員。

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

接下來,我們需要定義第一個強(qiáng)類型的DataTable的schema,同時為用來填充強(qiáng)類型DataSet的TableAdapter類 提供第一個方法。這兩步可以通過建立一個返回對應(yīng)于DataTable的數(shù)據(jù)表的字段的查詢同時完成。在向?qū)У?最后,我們將為這個查詢對應(yīng)的方法命名。完成后,這個方法可以在表現(xiàn)層調(diào)用,它會執(zhí)行設(shè)置好的查詢,進(jìn) 而填充一個強(qiáng)類型的DataTable。

開始定義SQL查詢之前,我們必須首先選擇我們想要TableAdapter執(zhí)行查詢的方式。我們可以直接用ad-hoc的SQL語句,或建立一個新的存儲過程,或使用現(xiàn)存的存儲過程。在這些教程里,我們將使用ad-hoc的SQL語句。請參考 Brian Noyes 的文章 “使用Visual Studio 2005 DataSet 設(shè)計器創(chuàng)建數(shù)據(jù)訪問層” 中使用存儲過程的例子。

圖 7: 用SQL語句查詢數(shù)據(jù)

至此,我們可以手工輸入SQL查詢。當(dāng)生成TableAdapter的第一個方法時,你一般想要讓你的查詢返回那些需 要在對應(yīng)的DataTable中存放的字段。我們可以建立一個從 Products 表里返回所有字段,所有數(shù) 據(jù)行的查詢來達(dá)到我們的目的:

圖 8: 在文本框里輸入SQL查詢

或者,我們可以使用查詢生成器(Query Builder),用圖形界面來構(gòu)造查詢,如圖9所示。

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

在生成查詢之后,在移到下一屏之前,點(diǎn)擊“高級選項(Advanced Options)”按鈕。在網(wǎng)站項目里,在默認(rèn) 情形下,“生成插入,更新,刪除語句”是唯一已被選中的選項。如果你在類庫項目或Windows項目里運(yùn)行這個 向?qū)У脑挘安捎脙?yōu)化的并發(fā)控制(optimistic concurrency)”選項也會被選中。現(xiàn)在先別選“采用優(yōu)化的并發(fā) 控制”這個選項。在以后的教程里我們會詳細(xì)討論優(yōu)化的并發(fā)控制。

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

在核實高級選項后,按“下一步(Next)”按鈕轉(zhuǎn)到最后一屏。在這里,配置向?qū)栁覀円oTableAdapter選擇添加什么方法。填充數(shù)據(jù)有兩種模式:

  • 填充DataTable – 這個做法會生成一個方法,該方法接受一個DataTable的參數(shù),基于查詢的結(jié)果 填充這個DataTable。譬如,ADO.NET的DataAdapter類就是在它的 Fill() 方法中實現(xiàn)這個模式的 。
  • 返回DataTable – 這個做法會生成一個方法,該方法會創(chuàng)建并填充一個DataTable,然后將 其作為方法的返回值。

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

這最后一個復(fù)選框,“生成DB直接方法(GenerateDBDirectMethods)”,如果選了的話,會為TableAdapter自動生 成 Insert() Update() ,和 Delete() 方法。如果你不選這個選項 的話,所有的更新都需要通過TableAdapter唯一的 Update() 方法來實現(xiàn),該方法接受一個強(qiáng)類型的DataSet,或者一個DataTable,或者單個DataRow,或者一個DataRow數(shù)組。(假如你 在圖9所示的高級屬性里把“生成添加,更新和刪除語句”的選項去掉的話,這個復(fù)選框是不起作用的)。讓我們 保留這個復(fù)選框的選項。

圖 11: 把方法名字從 GetData 改成 GetProducts

按“完成”按鈕結(jié)束向?qū)АT谙驅(qū)шP(guān)閉后,我們回到DataSet設(shè)計器中,它會顯示我們剛創(chuàng)建的DataTable。你可 以看到 Products DataTable的字段列單( ProductID , ProductName 等),還有 ProductsTableAdapter Fill() GetProducts() 方法 。

圖 12: Products DataTable和 ProductsTableAdapter 被添加到強(qiáng)類 型DataSet中

至此,我們生成了含有單一DataTable類( Northwind.Products )的強(qiáng)類型DataSet以及一個含 有 GetProducts() 方法的強(qiáng)類 型DataAdapter類( NorthwindTableAdapters.ProductsTableAdapter )。通過這些對象可以用下 列編碼來獲取所有產(chǎn)品的列單:

C#
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
            
              NorthwindTableAdapters.ProductsTableAdapter 

productsAdapter = 
              
                new
              
               

NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;

products = productsAdapter.GetProducts();


              
                foreach
              
               (Northwind.ProductsRow productRow 
              
                in
              
               products)
    Response.Write("
              
                Product: 
              
              " + 

productRow.ProductName + "
              
                <br />
              
              ");

            

這段編碼不要求我們寫一行的跟數(shù)據(jù)訪問有關(guān)的編碼。我們不需要生成任何ADO.NET類的實例,我們不需要 指明任何連接字符串,任何SQL查詢語句,或者任何存儲過程。TableAdapter為我們提供了底層的數(shù)據(jù)訪問編 碼!

這個例子里的每個對象都是強(qiáng)類型的,允許Visual Studio提供IntelliSense幫助以及編譯時類型檢查。最棒 的是,從TableAdapter 返回的DataTable可以直接綁定到ASP.NET數(shù)據(jù)Web 控件上去,這樣的控件包 括GridView,DetailsView,DropDownList,CheckBoxList,以及另外幾個控件。下面這個例子示范只要 在 Page_Load 事件處理函數(shù)里添加短短的三行編碼就能將從 GetProducts() 方法返 回的DataTable綁定到一個GridView上去。

AllProducts.aspx

ASP.NET
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
              
                8
              
              
                9
              
              
                10
              
              
                11
              
              
                12
              
              
                13
              
              
                14
              
              
                15
              
              
                16
              
              
                17
              
              
                18
              
              
                19
              
              
                20
              
              
                21
              
              
                22
              
              
                23
              
              
                24
              
              
                25
              
              
                26
              
            
              
                <%@ Page Language="C#" 

AutoEventWireup="true" CodeFile="AllProducts.aspx.cs" 

Inherits="AllProducts" %>
              
              
                <
              
              !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 

Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
              
                >
              
              
                <
              
              
                html
              
              
                xmlns
              
              =
              
                "http://www.w3.org/1999/xhtml"
              
              
                >
              
              
                <
              
              
                head
              
              
                runat
              
              =
              
                "server"
              
              
                >
              
              
                <
              
              
                title
              
              
                >
              
              View All Products in a GridView
              
                </
              
              
                title
              
              
                >
              
              
                <
              
              
                link
              
              
                href
              
              =
              
                "Styles.css"
              
              
                rel
              
              =
              
                "stylesheet"
              
              
                type
              
              =
              
                "text/css"
              
              
                />
              
              
                </
              
              
                head
              
              
                >
              
              
                <
              
              
                body
              
              
                >
              
              
                <
              
              
                form
              
              
                id
              
              =
              
                "form1"
              
              
                runat
              
              =
              
                "server"
              
              
                >
              
              
                <
              
              
                div
              
              
                >
              
              
                <
              
              
                h1
              
              
                >
              
              
            All Products
              
                </
              
              
                h1
              
              
                >
              
              
                <
              
              
                p
              
              
                >
              
              
                <
              
              
                asp
              
              :
              
                GridView
              
              
                ID
              
              =
              
                "GridView1"
              
              
                runat
              
              =
              
                "server"
              
              
                CssClass
              
              =
              
                "DataWebControlStyle"
              
              
                >
              
              
                <
              
              
                HeaderStyle
              
              
                CssClass
              
              =
              
                "HeaderStyle"
              
              
                />
              
              
                <
              
              
                AlternatingRowStyle
              
              
                CssClass
              
              =
              
                "AlternatingRowStyle"
              
              
                />
              
              
                </
              
              
                asp
              
              :
              
                GridView
              
              
                >
              
              
            &nbsp;
              
                </
              
              
                p
              
              
                >
              
              
                </
              
              
                div
              
              
                >
              
              
                </
              
              
                form
              
              
                >
              
              
                </
              
              
                body
              
              
                >
              
              
                </
              
              
                html
              
              
                >
              
            

AllProducts.aspx.cs

C#
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
              
                8
              
              
                9
              
              
                10
              
              
                11
              
              
                12
              
              
                13
              
              
                14
              
              
                15
              
              
                16
              
              
                17
              
              
                18
              
              
                19
              
              
                20
              
              
                21
              
              
                22
              
            
              
                using
              
               System;

              
                using
              
               System.Data;

              
                using
              
               System.Configuration;

              
                using
              
               System.Collections;

              
                using
              
               System.Web;

              
                using
              
               System.Web.Security;

              
                using
              
               System.Web.UI;

              
                using
              
               System.Web.UI.WebControls;

              
                using
              
               System.Web.UI.WebControls.WebParts;

              
                using
              
               System.Web.UI.HtmlControls;

              
                using
              
               NorthwindTableAdapters;


              
                public
              
               partial 
              
                class
              
               

AllProducts : System.Web.UI.Page
{
    
              
                protected
              
              
                void
              
               

Page_Load(
              
                object
              
               sender, EventArgs e)
    {
        ProductsTableAdapter productsAdapter = 
              
                new
              
              
         ProductsTableAdapter();
        GridView1.DataSource = productsAdapter.GetProducts();
        GridView1.DataBind();
    }
}

            

圖 13: 顯示在GridView里的產(chǎn)品列單

這個例子要求我們在ASP.NET網(wǎng)頁的Page_Load事件處理函數(shù)里,寫三行編碼。在以后的教程里,我們將討 論使用ObjectDataSource,用聲明的方式來從DAL中獲取數(shù)據(jù)。用ObjectDataSource的話,我們一行編碼都不 用寫,而且還能得到分頁和排序支持呢!

第三步:給數(shù)據(jù)訪問層添加參數(shù)化的方法

至此,ProductsTableAdapter只有一個方法, GetProducts() ,它返回數(shù)據(jù)庫里的所有產(chǎn)品。能夠操作所有的產(chǎn)品當(dāng)然有用,但很多時候我們想要獲取關(guān)于一個指定產(chǎn)品的信息,或者屬于某個特 定分類的所有產(chǎn)品。要想給我們的數(shù)據(jù)訪問層添加這樣的功能,我們可以給TableAdapter添加參數(shù)化的方法。

讓我們來添加一個 GetProductsByCategoryID( categoryID ) 方法。為給DAL添加新的 方法,讓我們回到DataSet設(shè)計器,在 ProductsTableAdapter 上按右鼠標(biāo),然后選擇“添加查 詢(Add Query)”。

圖 14: 在TableAdapter上按右鼠標(biāo),選擇“添加查詢”

向?qū)紫葧栁覀兪欠褚ㄟ^一個ad-hoc SQL語句還是生成一個新存儲過程或者使用現(xiàn)有存儲過程來訪問 數(shù)據(jù)庫。讓我們還是選擇使用SQL 語句。接著,向?qū)栁覀兪褂檬裁搭愋偷腟QL查詢。因為我們想返回屬于 指定分類的所有產(chǎn)品,我們需要寫一個返回數(shù)據(jù)行的 SELECT 語句。

圖 15: 選擇生成一個返回數(shù)據(jù)行的 SELECT 語句

下一步是定義用于訪問數(shù)據(jù)的SQL查詢語句。因為我們只想返回屬于指定分類的那些產(chǎn)品,我重 用 GetProducts() 里的 SELECT 語句,但添加了一個 WHERE 子 句: WHERE CategoryID = @CategoryID 。其中的 @CategoryID 參數(shù) 向TableAdapter配置向?qū)П硎疚覀冋谏傻姆椒▽⑿枰粋€對應(yīng)類(即,可為null-nullable的整數(shù))的輸入 參數(shù)。

圖 16: 輸入一個只返回指定分類的產(chǎn)品的查詢

在最后一步,我們可以選擇使用何種數(shù)據(jù)訪問模式,還可以定制生成的方法的名字。對應(yīng)于Fill 模式,讓我們把名字改成 FillByCategoryID ,對返回DataTable模式的方法( Get X 方法),讓我們來用 GetProductsByCategoryID 這個名字。

圖 17: 為TableAdapter的方法選擇名字

在結(jié)束向?qū)Ш螅珼ataSet設(shè)計器包含了這些新的TableAdapter的方法。

圖18: 通過分類來查詢產(chǎn)品

花點(diǎn)時間用同樣的手法添加一個 GetProductByProductID( productID ) 方法。

這些參數(shù)化的查詢可以在DataSet設(shè)計器里直接測試。在TableAdapter中的方法上按右鼠標(biāo),然后選擇“預(yù) 覽數(shù)據(jù)(Preview Data)”。接著,輸入對應(yīng)參數(shù)的值,然后按“預(yù)覽(Preview)”。

圖19: 屬于飲料(Beverages)類的那些產(chǎn)品列單

通過我們的DAL中的 GetProductsByCategoryID( categoryID ) 方法,我們就能設(shè)計一 個ASP.NET網(wǎng)頁來顯示屬于指定分類的那些產(chǎn)品。下面這個例子顯示了屬于Beverages(飲 料)類( CategoryID =1)的所有產(chǎn)品。

Beverages.aspx

ASP.NET
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
              
                8
              
              
                9
              
              
                10
              
              
                11
              
              
                12
              
              
                13
              
              
                14
              
              
                15
              
              
                16
              
              
                17
              
              
                18
              
              
                19
              
              
                20
              
              
                21
              
              
                22
              
              
                23
              
              
                24
              
            
              
                <%@ Page Language="C#" 

AutoEventWireup="true" CodeFile="Beverages.aspx.cs" 

Inherits="Beverages" %>
              
              
                <
              
              !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 

Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
              
                >
              
              
                <
              
              
                html
              
              
                xmlns
              
              =
              
                "http://www.w3.org/1999/xhtml"
              
              
                >
              
              
                <
              
              
                head
              
              
                runat
              
              =
              
                "server"
              
              
                >
              
              
                <
              
              
                title
              
              
                >
              
              Untitled Page
              
                </
              
              
                title
              
              
                >
              
              
                <
              
              
                link
              
              
                href
              
              =
              
                "Styles.css"
              
              
                rel
              
              =
              
                "stylesheet"
              
              
                type
              
              =
              
                "text/css"
              
              
                />
              
              
                </
              
              
                head
              
              
                >
              
              
                <
              
              
                body
              
              
                >
              
              
                <
              
              
                form
              
              
                id
              
              =
              
                "form1"
              
              
                runat
              
              =
              
                "server"
              
              
                >
              
              
                <
              
              
                div
              
              
                >
              
              
                <
              
              
                h1
              
              
                >
              
              Beverages
              
                </
              
              
                h1
              
              
                >
              
              
                <
              
              
                p
              
              
                >
              
              
                <
              
              
                asp
              
              :
              
                GridView
              
              
                ID
              
              =
              
                "GridView1"
              
              
                runat
              
              =
              
                "server"
              
              
                CssClass
              
              =
              
                "DataWebControlStyle"
              
              
                >
              
              
                <
              
              
                HeaderStyle
              
              
                CssClass
              
              =
              
                "HeaderStyle"
              
              
                />
              
              
                <
              
              
                AlternatingRowStyle
              
              
                CssClass
              
              =
              
                "AlternatingRowStyle"
              
              
                />
              
              
                </
              
              
                asp
              
              :
              
                GridView
              
              
                >
              
              
            &nbsp;
              
                </
              
              
                p
              
              
                >
              
              
                </
              
              
                div
              
              
                >
              
              
                </
              
              
                form
              
              
                >
              
              
                </
              
              
                body
              
              
                >
              
              
                </
              
              
                html
              
              
                >
              
            

Beverages.aspx.cs

C#
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
              
                8
              
              
                9
              
              
                10
              
              
                11
              
              
                12
              
              
                13
              
              
                14
              
              
                15
              
              
                16
              
              
                17
              
              
                18
              
              
                19
              
              
                20
              
              
                21
              
              
                22
              
              
                23
              
            
              
                using
              
               System;

              
                using
              
               System.Data;

              
                using
              
               System.Configuration;

              
                using
              
               System.Collections;

              
                using
              
               System.Web;

              
                using
              
               System.Web.Security;

              
                using
              
               System.Web.UI;

              
                using
              
               System.Web.UI.WebControls;

              
                using
              
               System.Web.UI.WebControls.WebParts;

              
                using
              
               System.Web.UI.HtmlControls;

              
                using
              
               NorthwindTableAdapters;


              
                public
              
               partial 
              
                class
              
               

Beverages : System.Web.UI.Page
{
    
              
                protected
              
              
                void
              
               

Page_Load(
              
                object
              
               sender, EventArgs e)
    {
        ProductsTableAdapter productsAdapter = 
              
                new
              
              
         ProductsTableAdapter();
        GridView1.DataSource =
          productsAdapter.GetProductsByCategoryID(1);
        GridView1.DataBind();
    }
}

            

圖 20: 屬于Beverages(飲料)類的所有產(chǎn)品顯示

第四步:插入,更新和刪除數(shù)據(jù)

常用的插入,更新和刪除數(shù)據(jù)的模式有兩種。第一種模式,我稱之為DB直接模式,涉及的方法被調(diào)用時,會向數(shù)據(jù)庫里發(fā)出一個 INSERT , 或 UPDATE ,或 DELETE 命令,這個命令只對單個數(shù)據(jù)庫記錄做操作。象這樣的方法一般接受一系列對應(yīng)于插入,更新或刪除的值的標(biāo)量參數(shù)(譬如整數(shù),字符串,布爾值,日期時間等)。譬如,用這個模式來操作 Products 表的話,刪除方法會接受一個整數(shù)參數(shù),代表所需要刪除的記錄的ProductID,而插入方法則會接受一個對應(yīng)于 ProductName 的字符串,對應(yīng) 于 UnitPrice 的decimal值,對應(yīng)于 UnitsOnStock 的整數(shù)等等。

圖 21: 每個插入,更新,和刪除請求都被立刻發(fā)送到數(shù)據(jù)庫

另外一個模式,我稱之為批更新模式,可以在一個方法調(diào)用里更新整個DataSet,或者整個DataTable,或 者一個DataRow集合。在這個模式里,開發(fā)人員在一個DataTable中刪除,插入,修改DataRow,然后把這 些DataRow或整個DataTable傳給一個更新方法。然后這個方法會輪循傳入的DataRow們,通過DataRow的 RowState屬 性 屬性來決定這些DataRow是否被改動過,或是新記錄,或是被刪除的記錄,然后為每個記錄發(fā)出合適的 數(shù)據(jù)庫命令。

圖 22: 在Update 方法調(diào)用之后,所有的變動都與數(shù)據(jù)庫同步了

在默認(rèn)情形下,TableAdapter采用批更新模式,但也支持DB直接模式。因為我們在創(chuàng)建我們的TableAdapter時的高級選項中選擇了“生成插入,更新,和刪除語句” 這個選項, ProductsTableAdapter 包含了一個 Update() 方法,該方法實現(xiàn)了批 更新模式。具體地說,TableAdapter包含了一個 Update() 方法,可以傳入一個強(qiáng)類型 的DataSet,或者一個強(qiáng)類型的DataTable,或者一個和多個DataRow。假如你在一開始創(chuàng)建TableAdapter時的選項中沒有清除“生成DB直接方法(GenerateDBDirectMethods)”復(fù)選框的話,DB直接模 式也會通過 Insert() Update() Delete() 方法來實現(xiàn)。

這兩種數(shù)據(jù)修改模式都使用 了TableAdapter的 InsertCommand UpdateCommand , 和 DeleteCommand 屬性來向數(shù)據(jù)庫發(fā)出對應(yīng) 的 INSERT UPDATE DELETE 命令。你可以在DataSet設(shè)計器里點(diǎn)擊TableAdapter,然后在屬性窗口查看和改 動 InsertCommand UpdateCommand , 和 DeleteCommand 屬性。(確 認(rèn)你選擇了TableAdapter,并且 ProductsTableAdapter 對象是屬性窗口中下拉框里被選中的項)

圖23: TableAdapter包含 InsertCommand UpdateCommand , 和 DeleteCommand 等屬性

想查看或改動這些數(shù)據(jù)庫命令的屬性的話,點(diǎn)擊 CommandText 子屬性,這會啟動對應(yīng)的查詢 生成器。

圖 24: 在查詢生成器里配置插入,更新,刪除語句

下面的編碼例子示范了如何使用批更新模式來把沒被終止的,且?guī)齑娴扔诨蛏儆?5個單元的產(chǎn)品的價格加 倍:

C#
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
              
                8
              
              
                9
              
              
                10
              
              
                11
              
              
                12
              
            
              NorthwindTableAdapters.ProductsTableAdapter 

productsAdapter =
  
              
                new
              
               NorthwindTableAdapters.ProductsTableAdapter();


              
                // For each product, double its price if it is not discontinued 

and
              
              
                // there are 25 items in stock or less
              
              
Northwind.ProductsDataTable products = productsAdapter.GetProducts();

              
                foreach
              
               (Northwind.ProductsRow product 
              
                in
              
               products)
   
              
                if
              
               (!product.Discontinued && product.UnitsInStock 

<= 25)
      product.UnitPrice *= 2;


              
                // Update the products
              
              
productsAdapter.Update(products);

            

下面的編碼示范如何使用DB直接模式刪除一個產(chǎn)品,更新一個產(chǎn)品,然后添加一個新的產(chǎn)品:

C#
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
              
                8
              
              
                9
              
              
                10
              
              
                11
              
              
                12
              
            
              NorthwindTableAdapters.ProductsTableAdapter 

productsAdapter = 
              
                new
              
               

NorthwindTableAdapters.ProductsTableAdapter();


              
                // Delete the product with ProductID 3
              
              
productsAdapter.Delete(3);


              
                // Update Chai (ProductID of 1), setting the UnitsOnOrder to 

15
              
              
productsAdapter.Update("
              
                Chai
              
              ", 1, 1, "
              
                10 boxes x 20 bags
              
              ",
  18.0m, 39, 15, 10, 
              
                false
              
              , 1);


              
                // Add a new product
              
              
productsAdapter.Insert("
              
                New Product
              
              ", 1, 1,
  "
              
                12 tins per carton
              
              ", 14.95m, 15, 0, 10, 
              
                false
              
              );

            

創(chuàng)建自定義的插入,更新,刪除方法

用DB直接法生成的 Insert() , Update() ,和 Delete() 方法有時 候會感覺有點(diǎn)不方便,特別是當(dāng)數(shù)據(jù)表有許多字段的時候。看一下前面這個編碼例子,沒有IntelliSense的幫 助的話,不是很清楚 Products 表的哪個字段對 應(yīng) Update() Insert() 方法中的哪個輸入?yún)?shù)。有時候我們只要更新一到二個字 段或者需要一個自定義的 Insert() 方法,這個方法需要返回剛插入的記錄 的 IDENTITY (自增)的字段值。

要創(chuàng)建這樣的自定義方法,回到DataSet設(shè)計器。在TableAdapter上按右鼠標(biāo),選擇“添加查詢”,然后回 到TableAdapter配置向?qū)АT诘诙辽希覀兛梢灾该饕傻牟樵兊念愋汀W屛覀兩梢粋€添加新 的product(產(chǎn)品)記錄,然后返回新添加記錄的 ProductID 值的方法。因此,選擇生成一個插 入( INSERT )型查詢。

圖25: 創(chuàng)建一個給 Products 表添加新記錄的方法

下一個屏顯示 InsertCommand CommandText 屬性。在查詢語句后面,增添一 個 SELECT SCOPE_IDENTITY() 的查詢,這查詢將返回當(dāng)前同一個操作范圍內(nèi)插 入 IDENTITY 字段的最后那個identity 值。(詳見 技術(shù)文檔 中關(guān) 于 SCOPE_IDENTITY() 的內(nèi)容以及為什么你應(yīng)該 使用SCOPE_IDENTITY()而不是 @@IDENTITY )。確認(rèn)在添加 SELECT 語句前,你在 INSERT 語句后面添一個分號 。

圖26: 增添查詢返回 SCOPE_IDENTITY()

最后,把這個新方法命名為 InsertProduct

圖 27:放方法名字設(shè)成 InsertProduct

當(dāng)你返回DataSet設(shè)計器時,你將看到 ProductsTableAdapter 多了一個新的方 法, InsertProduct 。如果對應(yīng) Products 表的每個字段,這個新的方法沒有對應(yīng)的參數(shù)的話,非常可能的原因是,你忘了給 INSERT 語句的結(jié)尾添加一個分號(semi-colon)。重新配 置 InsertProduct 方法,確認(rèn)在 INSERT SELECT 語句間有個分號。

在默認(rèn)情形下,插入方法調(diào)用的是非查詢(non-query)方法,意即,他們只返回受影響的記錄數(shù)。但是,我們想要讓 InsertProduct 方法返回一個查詢返回的值,而不是受影響的記錄數(shù)。這可以把 InsertProduct 方法的 ExecuteMode 屬性改 成 Scalar (標(biāo)量)來實現(xiàn)。

圖 28:把 ExecuteMode 屬性改成 Scalar

下面的編碼示范如何使用這個新的 InsertProduct 方法:

C#
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
            
              NorthwindTableAdapters.ProductsTableAdapter 

productsAdapter = 
              
                new
              
               

NorthwindTableAdapters.ProductsTableAdapter();


              
                // Add a new product
              
              
                int
              
               new_productID = 

Convert.ToInt32(productsAdapter.InsertProduct("
              
                New 

Product
              
              ", 1, 1, "
              
                12 tins per carton
              
              ", 

14.95m, 10, 0, 10, 
              
                false
              
              ));


              
                // On second thought, delete the product
              
              
productsAdapter.Delete(new_productID);

            

第五步:完成數(shù)據(jù)訪問層

注意, ProductsTableAdapters 類從 Products 表中返回的 是 CategoryID SupplierID 的值,但并不包括 Categories 表 的 CategoryName 字段和 Suppliers 表的 CompanyName 字段,盡管當(dāng) 我們顯示產(chǎn)品信息時,這些很可能是我們想要顯示的字段。我們可以擴(kuò)充TableAdapter的起始方 法 GetProducts() 來包含 CategoryName CompanyName 字段的值, 這方法進(jìn)而會更新強(qiáng)類型的DataTable來包括這些新的字段。

但這會造成一個問題,因為TableAdapter的插入,更新,刪除數(shù)據(jù)的方法是基于這個起始方法的,幸運(yùn)的是, 自動生成的插入,更新,刪除方法并不會受 SELECT 子句中的子查詢的影響。如果我們注意把 對 Categories Suppliers 的查詢添加成子查詢,而不是用 JOIN 語 句的話,我們可以避免重做這些修改數(shù)據(jù)的方法。在 ProductsTableAdapter 中的 GetProducts() 方法上按右鼠標(biāo),選擇“配置”,然后,把 SELECT 子句改成:

SQL
              
                1
              
              
                2
              
              
                3
              
              
                4
              
              
                5
              
              
                6
              
              
                7
              
            
              
                SELECT
              
                   ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
(
              
                SELECT
              
               CategoryName 
              
                FROM
              
               Categories

              
                WHERE
              
               Categories.CategoryID = Products.CategoryID) 
              
                as
              
               CategoryName,
(
              
                SELECT
              
               CompanyName 
              
                FROM
              
               Suppliers

              
                WHERE
              
               Suppliers.SupplierID = Products.SupplierID) 
              
                as
              
               SupplierName

              
                FROM
              
                       Products

            

圖29: 更新 GetProducts() 方法的 SELECT 語句

在更新 GetProducts() 方法使用這個新查詢語句之后,對應(yīng)的DataTable將包含2個新字段, CategoryName SupplierName

圖30: Products DataTable多了2個新字段

花點(diǎn)時間把 GetProductsByCategoryID( categoryID ) 方法中的 SELECT 子句也更新一下。

如果你使用 JOIN 句法更新 GetProducts() 中的 SELECT 語句的話 ,DataSet設(shè)計器不能使用DB直接模式自動生成插入,更新,以及刪除數(shù)據(jù)庫記錄的方法。你必須手工生成這 些方法,就象本教程早先時候我們對 InsertProduct 方法的做法一樣。此外,你必須手工提供 InsertCommand UpdateCommand DeleteCommand 屬性值,假如你 想使用批更新模式的話。

添加其他的TableAdapter

到目前為止,我們只討論了針對單個數(shù)據(jù)表的單個TableAdapter。但是,Northwind數(shù)據(jù)庫里含有我們需要在 我們的web應(yīng)用中使用的幾個相關(guān)的表。一個強(qiáng)類型的DataSet可以包含多個相關(guān)的DataTable。因此,為了完 成我們的DAL,我們需要為這些我們將來要用到的數(shù)據(jù)表添加相應(yīng)的DataTable。步驟如下,打開 DataSet設(shè)計 器,在設(shè)計器上按右鼠標(biāo),選擇“添加/TableAdapter”。這會生成一個新的DataTable和TableAdapter,然后我 們早先討論過的配置向?qū)敢阃瓿膳渲谩?

花上幾分鐘,創(chuàng)建對應(yīng)于下列查詢的TableAdapter及其方法。注意, ProductsTableAdapter 的查詢中包含了用以獲取每個產(chǎn)品的分類和供應(yīng)商名字的子查詢。另外,如果你是隨著教程在做的話,你已經(jīng)添加過 ProductsTableAdapter 類 的 GetProducts() GetProductsByCategoryID( categoryID ) 方法了。

  • ProductsTableAdapter
    • GetProducts :

      SELECT ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued
      , (SELECT CategoryName FROM
      Categories WHERE Categories.CategoryID =
      Products.ProductID) as CategoryName, (SELECT CompanyName
      FROM Suppliers WHERE Suppliers.SupplierID =
      Products.SupplierID) as SupplierName
      FROM Products

    • GetProductsByCategoryID :

      SELECT ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued
      , (SELECT CategoryName FROM
      Categories WHERE Categories.CategoryID =
      Products.ProductID) as CategoryName,
      (SELECT CompanyName FROM Suppliers WHERE
      Suppliers.SupplierID = Products.SupplierID) as SupplierName
      FROM Products
      WHERE CategoryID = @CategoryID

    • GetProductsBySupplierID

      SELECT ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued
      ,
      (SELECT CategoryName FROM Categories WHERE
      Categories.CategoryID = Products.ProductID)
      as CategoryName, (SELECT CompanyName FROM Suppliers
      WHERE Suppliers.SupplierID = Products.SupplierID)
      as SupplierName
      FROM Products
      WHERE SupplierID = @SupplierID
    • GetProductByProductID

      SELECT ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued
      , (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID =
      Products.ProductID) as CategoryName,
      (SELECT CompanyName FROM Suppliers
      WHERE Suppliers.SupplierID = Products.SupplierID)
      as SupplierName
      FROM Products

ASP.NET 2.0數(shù)據(jù)教程之一: 創(chuàng)建一個數(shù)據(jù)訪問層


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 新津县| 临桂县| 武威市| 奉节县| 东城区| 宜兰县| 许昌县| 湘阴县| 光泽县| 浙江省| 河曲县| 湾仔区| 辉南县| 腾冲县| 云浮市| 屯留县| 兴文县| 木兰县| 富平县| 锡林浩特市| 平安县| 军事| 郴州市| 陆丰市| 乃东县| 吉木萨尔县| 杭州市| 绩溪县| 衡阳县| 江门市| 丹棱县| 桂林市| 松溪县| 邵武市| 和顺县| 丹凤县| 东阿县| 顺平县| 无为县| 沙田区| 监利县|