中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識庫 > 在ASP.NET 2.0中操作數(shù)據(jù)之一:創(chuàng)建一個數(shù)據(jù)訪問層

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

熱門標(biāo)簽:遂寧市地圖標(biāo)注app 地圖定位圖標(biāo)標(biāo)注 天心智能電銷機(jī)器人 濮陽外呼電銷系統(tǒng)怎么樣 塔城代理外呼系統(tǒng) 地圖標(biāo)注專業(yè)團(tuán)隊 地圖標(biāo)注的公司有哪些 代理接電話機(jī)器人如何取消 400電話辦理哪家性價比高

導(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)建一個軟件框架開始,這個框架的組成部分包括一個使用強類型的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的免費版本Visual Web Developer中運行。

在這個教程里,我們將從頭開始,先創(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)建強類型的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é)點,你可以將這個節(jié)點擴(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ù)庫的話,你首先必須運行本教程下載文件中的安裝腳本來把數(shù)據(jù)庫添加到數(shù)據(jù)庫服務(wù)器上去,或者你也可以從微軟網(wǎng)站上直接下載SQL Server 2000的Northwind數(shù)據(jù)庫以及安裝腳本。

安裝數(shù)據(jù)庫完畢之后,去Visual Studio中的服務(wù)器資源管理器,在數(shù)據(jù)連接(Data Connections)節(jié)點上按右鼠標(biāo),選擇“添加連接(Add Connection)”。如果你看不到服務(wù)器資源管理器,去菜單“查看(View)”點擊 “服務(wù)器資源管理器”,或者按組合鍵Ctrl+Alt+S來打開服務(wù)器資源管理器。這會打開添加連接的對話框,在這上面,你可以設(shè)置需要連接的服務(wù)器,認(rèn)證信息,以及數(shù)據(jù)庫名字。在你成功配置數(shù)據(jù)庫連接信息,按OK按鈕之后,數(shù)據(jù)庫就會被添加成數(shù)據(jù)連接節(jié)點之下的一個節(jié)點。然后,你就可以擴(kuò)展數(shù)據(jù)庫節(jié)點來瀏覽數(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,一般是通過 一個單獨的類庫項目來實現(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é)果以強類 型對象的形式返回。一個強類型的對象,其schema是編譯時嚴(yán)格定義好的,而相比之下,弱類型的對象, 其schema在運行時之前是未知的。

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

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

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

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

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

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

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

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

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

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

記住,強類型的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ù)器資源管理器里去的話,這時你可以點擊新連接按鈕來添加。

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

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

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

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

在生成查詢之后,在移到下一屏之前,點擊“高級選項(Advanced Options)”按鈕。在網(wǎng)站項目里,在默認(rèn) 情形下,“生成插入,更新,刪除語句”是唯一已被選中的選項。如果你在類庫項目或Windows項目里運行這個 向?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),該方法接受一個強類型的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被添加到強類 型DataSet中

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

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ù)訪問編 碼!

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

AllProducts.aspx:

%@ 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" _fcksavedurl=""Styles.css"" _fcksavedurl=""Styles.css"" _fcksavedurl=""Styles.css"" _fcksavedurl=""Styles.css"" _fcksavedurl=""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:

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模式的方法(GetX方法),讓我們來用GetProductsByCategoryID這個名字。

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

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

圖18: 通過分類來查詢產(chǎ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)的

Beverages.aspx:

%ASP.NET %@ 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" _fcksavedurl=""Styles.css"" _fcksavedurl=""Styles.css"" _fcksavedurl=""Styles.css"" _fcksavedurl=""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:

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() 方法,可以傳入一個強類型 的DataSet,或者一個強類型的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è)計器里點擊TableAdapter,然后在屬性窗口查看和改 動InsertCommand,UpdateCommand, 和DeleteCommand屬性。(確 認(rèn)你選擇了TableAdapter,并且ProductsTableAdapter對象是屬性窗口中下拉框里被選中的項)

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

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

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

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

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)品:

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()方法有時 候會感覺有點不方便,特別是當(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方法:

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)而會更新強類型的DataTable來包括這些新的字段。

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

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個新字段

花點時間把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)的表。一個強類型的DataSet可以包含多個相關(guān)的DataTable。因此,為了完 成我們的DAL,我們需要為這些我們將來要用到的數(shù)據(jù)表添加相應(yīng)的DataTable。步驟如下,打開 DataSet設(shè)計 器,在設(shè)計器上按右鼠標(biāo),選擇“添加/TableAdapter”。這會生成一個新的DataTable和TableAdapter,然后我 們早先討論過的配置向?qū)敢阃瓿膳渲谩?/p>

花上幾分鐘,創(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.CategoryID) 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
WHERE ProductID = @ProductID

CategoriesTableAdapter GetCategories

SELECT CategoryID, CategoryName, Description
FROM Categories
GetCategoryByCategoryID

SELECT CategoryID, CategoryName, Description
FROM Categories
WHERE CategoryID = @CategoryID

SuppliersTableAdapter GetSuppliers

SELECT SupplierID, CompanyName, Address, City,
Country, Phone
FROM Suppliers
GetSuppliersByCountry

SELECT SupplierID, CompanyName, Address,
City, Country, Phone
FROM Suppliers
WHERE Country = @Country
GetSupplierBySupplierID

SELECT SupplierID, CompanyName, Address,
City, Country, Phone
FROM Suppliers
WHERE SupplierID = @SupplierID

EmployeesTableAdapter GetEmployees

SELECT EmployeeID, LastName, FirstName,
Title, HireDate, ReportsTo, Country
FROM Employees
GetEmployeesByManager

SELECT EmployeeID, LastName, FirstName,
Title, HireDate, ReportsTo, Country
FROM Employees
WHERE ReportsTo = @ManagerID
GetEmployeeByEmployeeID

SELECT EmployeeID, LastName, FirstName,
Title, HireDate, ReportsTo, Country
FROM Employees
WHERE EmployeeID = @EmployeeID

圖31:添加了四個TableAdapter后的DataSet設(shè)計器

給DAL添加定制編碼

添加到強類型DataSet中的TableAdapter和DataTable是在一個XML Schema定義文 件(Northwind.xsd)中定義的。你可以在解決方案資源管理器里在Northwind.xsd 文件上按右鼠標(biāo),選擇“查看編碼(View Code)”,打開這個Schema文件來查看其中內(nèi)容。

圖32:Northwinds強類型DataSet的XML Schema定義文件

這個schema信息在設(shè)計時編譯之后會被翻譯成C#或Visual Basic 編碼,或者如果有必要的話,會在運行時 翻譯,然后你就能在調(diào)試器里單步遍歷執(zhí)行。想查看這些自動生成的編碼的話,在類視圖里,展 開TableAdapter 類或者強類型的DataSet 類。如果在屏幕上看不到類視圖的話,在“查看”(View)菜單里選擇“ 類視圖”,或者按鍵組合Ctrl+Shift+C。在類視圖里,你能看到強類型的DataSet類和TableAdapter類的屬性,方法和事件。想看某個特定的方法的編碼話,在類視圖雙擊對應(yīng)方法的名字或者在方法上按右鼠標(biāo),選 擇“移至定義區(qū)(Go To Definition)”。

圖33:在類視圖里選擇“移至定義區(qū)(Go To Definition)”,查看自動生成的編碼

雖然自動生成的編碼省時省力,但這樣的編碼往往是非常通用化的(generic),為滿足一個應(yīng)用程序特有的需 求需要做些定制。但擴(kuò)展自動生成的編碼的風(fēng)險在于,如果生成這些編碼的工具決定該是重新生成這些編碼的 時候了,則會把你定制的編碼沖掉。使用.NET 2.0中的一個新的部分(partial)類的概念,很容易將一個類的 定義分寫在幾個文件里。這允許我們給自動生成的類添加我們自己的方法,屬性,和事件,而不用擔(dān)心Visual Studio會沖掉我們的定制編碼。

為示范如何定制DAL起見,讓我們來給SuppliersRow 添加一個GetProducts()方法。這 個SuppliersRow類代表了Suppliers表的個別記錄,每個供應(yīng)商(supplier)可以 提供0個到多個產(chǎn)品,所以GetProducts()將返回指定的供應(yīng)商的這些產(chǎn)品。做法如 下,在App_Code文件夾里添加一個新的類文件,將其命名為SuppliersRow.cs, 然后在其中添加下列編碼:

using System;
using System.Data;
using NorthwindTableAdapters;
public partial class Northwind
{
 public partial class SuppliersRow
 {
 public Northwind.ProductsDataTable GetProducts()
 {
  ProductsTableAdapter productsAdapter =new ProductsTableAdapter();
  returnproductsAdapter.GetProductsBySupplierID(this.SupplierID);
 }
 }
}

這個部分(partial)類指示編譯器在編譯Northwind.SuppliersRow類時,應(yīng)該包含我們剛定義的這個GetProducts()方法。如果你編譯你的項目,然后返回類視圖,你就會看到GetProducts()已被列為Northwind.SuppliersRow的一個方法。

圖34: GetProducts()方法成為Northwind.SuppliersRow類的一部分

GetProducts()方法現(xiàn)在就能用來枚舉一個指定供應(yīng)商的產(chǎn)品列單,如下列編碼所示:

NorthwindTableAdapters.SuppliersTableAdapter suppliersAdapter = new NorthwindTableAdapters.SuppliersTableAdapter();

// Get all of the suppliers
Northwind.SuppliersDataTable suppliers =suppliersAdapter.GetSuppliers();

// Enumerate the suppliers
foreach (Northwind.SuppliersRow supplier in suppliers)
{
 Response.Write("Supplier: " + supplier.CompanyName);
 Response.Write("ul>");

 // List the products for this supplier
 Northwind.ProductsDataTable products = supplier.GetProducts();
 foreach (Northwind.ProductsRow product in products)
 Response.Write("li>" + product.ProductName + "/li>");

 Response.Write("/ul>p>nbsp;/p>");
}

:數(shù)據(jù)也可以在任何一種ASP.NET的Web控件中顯示。下面這個網(wǎng)頁 使用了含有2個字段的GridView 控件:

一個BoundField用以顯示每個供應(yīng)商的名字, 另一個TemplateField,包含了一個BulletedList控件,用來綁定針對每個供應(yīng)商調(diào)用 的GetProducts()方法返回的結(jié)果

我們將在以后的教程里討論怎樣來顯示這樣的主/從(master-detail)報表。在這里,這個例子的目的是用 來示范如何使用添加到Northwind.SuppliersRow類中的自定義的方法的。

SuppliersAndProducts.aspx

%@ Page Language="C#" AutoEventWireup="true" CodeFile="SuppliersAndProducts.aspx.cs" Inherits="SuppliersAndProducts" %>

!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" _fcksavedurl=""Styles.css"" _fcksavedurl=""Styles.css"" rel="stylesheet" type="text/css" />
/head>
body>
 form id="form1" runat="server">
 div>
 h1>
  Suppliers and Their Products/h1>
 p>
  asp:GridView ID="GridView1" runat="server"
  AutoGenerateColumns="False"
  CssClass="DataWebControlStyle">
  HeaderStyle CssClass="HeaderStyle" />
  AlternatingRowStyle CssClass="AlternatingRowStyle" />
  Columns>
   asp:BoundField DataField="CompanyName"
   HeaderText="Supplier" />
   asp:TemplateField HeaderText="Products">
   ItemTemplate>
    asp:BulletedList ID="BulletedList1"
    runat="server" DataSource="%#
  ((Northwind.SuppliersRow)((System.Data.DataRowView)
  Container.DataItem).Row).GetProducts() %>"
     DataTextField="ProductName">
    /asp:BulletedList>
   /ItemTemplate>
   /asp:TemplateField>
  /Columns>
  /asp:GridView>
  nbsp;/p>

 /div>
 /form>
/body>
/html>
SuppliersAndProducts.aspx.cs
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 SuppliersAndProducts : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
 SuppliersTableAdapter suppliersAdapter = new SuppliersTableAdapter();
 GridView1.DataSource = suppliersAdapter.GetSuppliers();
 GridView1.DataBind();
 }
}

圖 35: 供應(yīng)商的公司名字列在左欄,他們的產(chǎn)品列在右欄

總結(jié)

構(gòu)造web應(yīng)用時,創(chuàng)建DAL應(yīng)該是你最先做的步驟之一,應(yīng)該在你開始創(chuàng)建表現(xiàn)層之前進(jìn)行。使用Visual Studio的話,創(chuàng)建基于強類型DataSet的DAL是個可以不寫一行編碼,在10到15分鐘內(nèi)就可完成的任務(wù)。以后的 教程將建立在這個DAL基礎(chǔ)之上。在下一個教程里,我們將定義一堆業(yè)務(wù)規(guī)則,然后看一下如何在一個分開的 業(yè)務(wù)邏輯層里實現(xiàn)這些規(guī)則。

祝編程快樂!

作者簡介

Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創(chuàng)始人,自1998年以來一直應(yīng)用 微軟Web技術(shù)。Scott是個獨立的技術(shù)咨詢顧問,培訓(xùn)師,作家,最近完成了將由Sams出版社出版的新作,24小時內(nèi)精通ASP.NET 2.0。他的聯(lián)系電郵為mitchell@4guysfromrolla.com,也可以通過他的博客http://ScottOnWriting.NET與他聯(lián)系。

您可能感興趣的文章:
  • 在ASP.NET 2.0中操作數(shù)據(jù)之二:創(chuàng)建一個業(yè)務(wù)邏輯層
  • 在ASP.NET 2.0中操作數(shù)據(jù)之三:創(chuàng)建母版頁和站點導(dǎo)航
  • 在ASP.NET 2.0中操作數(shù)據(jù)之四:使用ObjectDataSource展現(xiàn)數(shù)據(jù)
  • 在ASP.NET 2.0中操作數(shù)據(jù)之五:聲明參數(shù)
  • 在ASP.NET 2.0中操作數(shù)據(jù)之六:編程設(shè)置ObjectDataSource的參數(shù)值
  • ASP.NET 2.0中的數(shù)據(jù)操作之七:使用DropDownList過濾的主/從報表
  • ASP.NET 2.0中的數(shù)據(jù)操作之八:使用兩個DropDownList過濾的主/從報表
  • ASP.NET 2.0中的數(shù)據(jù)操作之九:跨頁面的主/從報表
  • 在ASP.NET 2.0中操作數(shù)據(jù)之十:使用 GridView和DetailView實現(xiàn)的主/從報表
  • [翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程

標(biāo)簽:婁底 麗江 吉林 宜春 本溪 河南 汕頭 重慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在ASP.NET 2.0中操作數(shù)據(jù)之一:創(chuàng)建一個數(shù)據(jù)訪問層》,本文關(guān)鍵詞  在,ASP.NET,2.0,中,操作,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數(shù)據(jù)之一:創(chuàng)建一個數(shù)據(jù)訪問層》相關(guān)的同類信息!
  • 本頁收集關(guān)于在ASP.NET 2.0中操作數(shù)據(jù)之一:創(chuàng)建一個數(shù)據(jù)訪問層的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 淄博晟峰机械有限公司| 包头吉宇钢铁有限公司| 济南博威液压机械有限公司| 广州市荣艺食品机械有限公司| 大连典石精密机械有限公司| 常州捷佳创精密机械有限公司| 山东威达机械有限公司| 河南省矿山起重机制造有限公司| 安丘博阳机械制造有限公司| 广州博创机械有限公司| 昆山贝奇精密机械有限公司| 北京大森长空包装机械有限公司 | 重庆太强机械有限公司| 洛阳中收机械装备有限公司| 东方传动机械有限公司| 南通苏诺特包装机械有限公司| 宜兴市华鼎机械有限公司| 泉州精镁机械有限公司| 苏州市大华精密机械有限公司| 恒瑞机械制造有限公司| 河北清大环保机械有限公司| 徐州明文机械有限公司| 江苏登福机械有限公司| 江阴乐帕克智能机械有限公司 | 宁波达峰机械有限公司| 佛山市宝陶机械设备有限公司 | 单县江华机械有限公司| 浙江坤鸿机械设备有限公司| 广州坚诺机械设备有限公司| 温州科迪机械有限公司| 兰溪永丰机械有限公司| 济南捷迈数控机械有限公司| 黄山三佳谊华精密机械有限公司 | 萧山天成机械有限公司| 常州市良久机械制造有限公司 | 上海唐迪机械制造有限公司| 河北澳森钢铁有限公司| 山鑫矿山机械有限公司| 海德机械设备有限公司| 嘉兴赛诺机械有限公司| 江苏方邦机械有限公司| 杭州双林机械有限公司| 陕西重型机械制造有限公司| 温州锐光机械有限公司| 宁波隆源精密机械有限公司| 江苏舜天机械进出口有限公司 | 高博起重设备有限公司| 桂林正东机械制造有限公司| 兰州兴元钢铁有限公司| 温州力冠机械有限公司| 河北圣禹水工机械有限公司| 邢台远大机械制造有限公司| 兰州华诚石化机械制造有限公司| 扬州华粮机械有限公司| 江苏千里机械有限公司| 江苏维达机械有限公司| 天津德尚机械有限公司| 大丰 机械有限公司| 山东硕诚机械有限公司| 浙江开诚机械有限公司| 重庆海松机械有限公司| 青岛鲁奥机械有限公司| 重庆恒科机械制造有限公司| 江苏化工机械有限公司| 东莞市印刷机械有限公司| 重庆志成机械有限公司| 市瑞港机械有限公司| 蓬莱禄昊化工机械有限公司| 东莞市雅康精密机械有限公司| 天翔机械制造有限公司| 山东鲁一机械有限公司| 北京洛克机械有限公司| 浙江荣升机械有限公司| 江苏骏马压路机械有限公司| 瑞安市创博机械有限公司| 南通佳宝机械有限公司| 安印刷机械有限公司| 泰兴机械制造有限公司| 金沙机械制造有限公司| 东莞安默琳机械制造技术有限公司| 唐山盛财钢铁有限公司| 杭州杭顺机械有限公司| 亿煤机械装备制造有限公司 | 江苏食品机械有限公司| 青岛洪珠农业机械有限公司| 张家港市鑫港机械有限公司| 中山 机械有限公司| 苏州明基自动化机械设备有限公司| 东莞%机械制造有限公司| 江苏医疗机械有限公司| 太仓悦凯精密机械有限公司| 温州华珍机械有限公司| 江苏汤姆包装机械有限公司| 河北机械制造有限公司| 淄博中升机械有限公司| 佛山松川机械设备有限公司| 常州好迪机械有限公司| 余姚 机械 有限公司| 湖南机械设备有限公司| 河南工程机械有限公司| 溧阳机械制造有限公司| 辽宁亿丰钢铁有限公司| 四川晶工机械有限公司| 济宁工程机械有限公司| 哈尔滨机械设备有限公司| 陕西 机械设备有限公司| 沧州华众煤矿机械有限公司| 佛山市奥索包装机械有限公司 | 江苏华光双顺机械制造有限公司| 青岛博朗特机械设备有限公司| 河南豫弘重型机械有限公司 | 山东巨力机械有限公司| 丰润区钢铁有限公司| 温州市鹿城江心服装机械有限公司| 诸城科翔机械有限公司| 贵州力顺机械有限公司| 德昌誉机械制造有限公司| 曲阜机械设备有限公司| 东风悦达起亚汽车有限公司| 佛山市万为包装机械有限公司 | 山东西王钢铁有限公司| 招远矿山机械有限公司| 苏州拓博机械有限公司| 人科机械设备有限公司| 河北食品机械有限公司| 新金山钢铁有限公司| 诸城市万兴机械有限公司| 晋城福盛钢铁有限公司| 机械设备有限公司招聘| 绍兴越发机械有限公司| 四平现代钢铁有限公司| 泰州机械 有限公司| 四川腾中重工机械有限公司 | 上海徽机械有限公司| 上海昊宇机械有限公司| 张家港市贝尔机械有限公司| 武汉东泰盛机械有限公司| 成都杰瑞达工程机械有限公司| 苏州一工机械有限公司| 东莞市鸿企机械有限公司| 河南卫华重型机械有限公司| 张家港市港丰机械有限公司| 宁海奇精机械有限公司| 昆山万利机械有限公司| 起航中文小说有限公司| 珠海市广浩捷精密机械有限公司 | 江苏金荣机械有限公司| 上海中远海运重工有限公司| 南通福斯特机械制造有限公司| 苏州市联佳精密机械有限公司| 济南北斗星机械设备有限公司| 成都固特机械有限公司| 江苏福克斯机械有限公司| 鑫华机械制造有限公司| 温岭华驰机械有限公司| 常州纺织机械有限公司| 无锡秉杰机械有限公司| 江苏双友重型机械有限公司| 烨隆精密机械有限公司| 苏州通润机械铸造有限公司| 河南黄河防爆起重机有限公司| 浙江中禾机械有限公司| 河北华昌机械设备有限公司 | 山东起重设备有限公司| 河南江瀚机械制造有限公司| 扬州恒润海洋重工有限公司| 潍坊宇航机械有限公司| 上海斯特克沃森重工设备有限公司 | 东莞%机械制造有限公司| 山东华准机械有限公司| 武汉中粮机械有限公司| 辽阳筑路机械有限公司| 上海中吉机械制造有限公司| 合肥华运机械有限公司| 江苏盐城机械有限公司| 昆山美和机械有限公司| 中欣机械厦门有限公司| 上海昱钢包装机械有限公司| 工程机械配件有限公司| 厦门工业机械有限公司| 上海贯博起重设备有限公司| 沈阳矿山机械有限公司| 杭州华兴机械有限公司| 新源重工机械有限公司| 百事德机械江苏有限公司| 上海环野机械有限公司| 江苏新益机械有限公司| 浙江自力机械有限公司| 人科机械设备有限公司| 大连连美机械有限公司| 四川诚德机械有限公司| 大连卓远重工有限公司| 杭州永创机械有限公司| 江苏舜工机械有限公司| 江苏天宇机械有限公司| 江苏冠宇机械设备制造有限公司 | 廊坊百冠包装机械有限公司| 华群数控机械有限公司| 汕头 机械有限公司招聘| 中信重工开诚智能装备有限公司| 京华机械设备有限公司| 常州宏机械有限公司| 常熟 机械 有限公司| 济南 机械有限公司| 济南 升降机械有限公司| 苏州三维精密机械有限公司| 山西中升钢铁有限公司| 上海佳成服装机械有限公司| 潍坊机械制造有限公司| 科达机械制造有限公司| 沧州华众煤矿机械有限公司| 江苏中饮机械有限公司| 武汉钢铁有限公司疫情| 浙江海蜜机械有限公司| 浙江自力机械有限公司| 雅康精密机械有限公司| 漳州三宝钢铁有限公司| 临工工程机械有限公司| 青岛木工机械有限公司| 广东南牧机械设备有限公司| 新科起重机有限公司| 招商局重工深圳有限公司| 常州市日中精密机械有限公司| 浩强精密机械有限公司| 昆明旭邦机械有限公司| 东莞达机械有限公司| 深圳市德润机械有限公司| 浙江宇丰机械有限公司| 山西海威钢铁有限公司| 南京包装机械有限公司| 青州市远航机械设备有限公司| 广州机械配件有限公司| 新乡市辰威机械有限公司| 中施机械设备有限公司| 广州包装机械有限公司| 河南飞马起重机械有限公司| 泰安古河机械有限公司| 百事德机械江苏有限公司| 南京竣业过程机械设备有限公司| 徐州随车起重机有限公司 | 新疆八一钢铁有限公司| 天津钢铁贸易有限公司| 苏州旭展机械有限公司| 广州 机械 有限公司| 淮安华辉机械设备有限公司| 苏州凯尔博精密机械有限公司| 重庆舰帏机械有限公司| 江苏科威机械有限公司| 宁波钛龙机械有限公司| 山东鲁丽钢铁有限公司| 上海盾克机械有限公司| 大连华锐重工有限公司| 苏州松发机械有限公司| 厦门机械工业有限公司| 江阴祥乐机械有限公司| 徐州 机械有限公司| 无锡秉杰机械有限公司| 青岛日佳机械有限公司| 龙川航辉钢铁有限公司| 苏州工业园区机械有限公司| 浙江天泰机械有限公司| 沂南中天机械有限公司| 临工工程机械有限公司| 宁波力盟机械有限公司| 湖北天腾重型机械制造有限公司| 烟台金元矿业机械有限公司| 东阳机械制造有限公司| 广州众起办公用品有限公司 | 食品包装机械有限公司| 永盛达机械有限公司| 深圳市稻田包装机械有限公司 | 金田豪迈木业机械有限公司| 佛山市强源钢铁有限公司| 沧州昌鸿磨浆机械有限公司| 唐山神州机械有限公司| 玉环博行机械有限公司| 厦门黎明机械有限公司| 上海集美食品机械有限公司| 嘉兴 机械有限公司| 飞迈烟台机械有限公司| 山东德丰重工有限公司| 浙江濠泰机械有限公司| 杭州纳源传动机械有限公司 | 南安市机械有限公司| 广东省建筑工程机械施工有限公司| 江苏羚羊机械有限公司| 亿德隆机械有限公司| 杭州东田机械有限公司| 上海岭申机械有限公司| 昆山乙盛机械工业有限公司电话| 机械进出口有限公司招聘| 上海鸿尔机械有限公司| 沈阳斗山工程机械有限公司| 辽宁三君机械有限公司| 大连吉利机械配件有限公司| 东莞%机械制造有限公司| 威海新元化工机械有限公司| 江苏中圣机械制造有限公司| 无锡三麦机械有限公司| 江南机械制造有限公司| 北京京西重工有限公司| 上海盟申机械设备有限公司| 大连 机械制造有限公司| 宝鸡忠诚制药机械有限公司| 苏州星光精密机械有限公司| 海益机械配件有限公司| 宁波兴波机械有限公司| 德清恒丰机械有限公司| 常熟机械制造有限公司| 上海金相机械有限公司| 威海威力起重有限公司| 泰富重工制造有限公司| 石家庄钢铁有限公司| 佛山市海裕机械有限公司| 上海太腾机械设备有限公司| 上海 机械有限公司| 苏州海盛精密机械有限公司怎么样| 马鞍山 机械制造有限公司| 青岛精密机械有限公司| 湖北机械制造有限公司| 老挝第一钢铁有限公司| 闽源钢铁有限公司停产| 上海科纳机械有限公司| 新兴移山天津重工有限公司| 唐山亚捷机械有限公司| 沈阳重工食品有限公司| 山东莱德机械有限公司| 深圳市塑胶机械有限公司| 张家港市鑫港机械有限公司| 佛山市 重工有限公司| 浙江铖虹机械有限公司| 温州海翔机械有限公司| 唐山瑞兴钢铁有限公司| 浙江华邦机械有限公司| 深圳恒盛力包装机械有限公司| 江阴市联拓重工机械有限公司| 青岛山森机械有限公司| 北京城建重工有限公司| 唐山国丰钢铁有限公司| 无锡中机械有限公司| 辛集澳森钢铁有限公司| 三门峡化工机械有限公司| 瑞安市机械制造有限公司| 厦门 机械设备有限公司| 陕西通运机械有限公司| 浙江恒通机械有限公司| 江苏恒悦机械有限公司| 鞍山机械制造有限公司| 青岛华磊塑料机械有限公司| 青岛辉腾机械有限公司| 广州市赛思达机械设备有限公司| 青岛昊宇重工有限公司| 上海昶旭包装机械有限公司| 陀曼精密机械有限公司| 郑州液压机械有限公司| 富江机械制造有限公司| 亿德隆机械有限公司| 天津同盈钢铁有限公司| 杭州传动机械有限公司| 浙江双子机械制造有限公司| 靖江机械制造有限公司| 爱科农业机械有限公司| 江西九江萍钢钢铁有限公司| 上海贝得尔石化机械设备有限公司| 江西神起信息技术有限公司| 保定兴旺机械有限公司| 汉智数控机械有限公司| 武汉臻尚机械设备有限公司| 中煤盘江重工有限公司| 河北奥宇钢铁有限公司| 安徽好运机械有限公司| 沈阳友维机械有限公司| 嵊州市龙威机械制造有限公司| 山东天瑞重工有限公司| 嘉诚机械制造有限公司| 济南圣元机械工程有限公司 | 上海 精密机械有限公司| 滕州三合机械有限公司| 重庆川普机械有限公司| 靖江 机械有限公司| 均强机械苏州有限公司| 玉环中本机械有限公司| 博路威机械江苏有限公司| 合肥逸飞包装机械有限公司| 南海区机械设备有限公司| 上海集美食品机械有限公司 | 东莞机械设备制造有限公司| 上海宝丰机械制造有限公司| 兰州联合重工有限公司| 江苏谷登工程机械装备有限公司 | 江阴市永昌药化机械有限公司| 安徽富鑫钢铁有限公司| 江苏登福机械有限公司| 东莞 精密机械有限公司| 广东新船重工有限公司| 济南齐力升降机械有限公司| 中山精密机械有限公司| 浙江临海机械有限公司| 南丰 机械有限公司| 广州永晋机械有限公司| 东莞兆泰机械设备有限公司| 万则盛机械有限公司| 辛集澳森钢铁有限公司| 苏州博杰思达机械有限公司| 宁波市机械有限公司| 徐州东南钢铁工业有限公司| 张家港市贝尔机械有限公司| 山东山推工程机械结构件有限公司| 浙江向隆机械有限公司| 上海力克机械有限公司| 大禾众邦机械有限公司| 苏州华致鑫精密机械有限公司| 青岛正机械有限公司| 青岛金福鑫塑料机械有限公司| 日晗精密机械有限公司| 成都松茂工程机械有限公司| 机械有限公司起名大全| 许昌 机械有限公司| 江阴机械制造有限公司| 福州展志钢铁有限公司| 温州国伟印刷机械有限公司| 上海高敦精密机械有限公司| 山东正丰钢铁有限公司| 河南省机械有限公司| 江源机械制造有限公司| 河北永洋钢铁有限公司| 广州盛广誉机械设备有限公司 | 济南 建筑机械有限公司| 河北曙光机械有限公司| 天津同力重工有限公司| 山西兴宝钢铁有限公司| 四川晶工机械有限公司| 上海中吉机械制造有限公司| 如皋市联创捏合机械有限公司| 杭州亿安机械设备有限公司| 常州华威起重工具有限公司| 燕拓航(北京)真空机械有限公司| 佳友精密机械有限公司| 瑞达机械制造有限公司| 合肥中辰轻工机械有限公司| 中船华南船舶机械有限公司| 苏州铭峰精密机械有限公司| 成都工程机械有限公司| 宁波博信机械制造有限公司 | 上海合劲传动机械有限公司| 广东力丰机械制造有限公司| 广东机械制造有限公司| 青岛圣诺机械有限公司| 无锡海龙机械有限公司| 无锡名震机械制造有限公司 | 青州东威机械有限公司| 西子重工机械有限公司| 科雄精密机械有限公司| 上海拓稳机械有限公司| 浙江吉隆机械有限公司| 东莞市利瀚机械有限公司| 汇大机械制造有限公司| 沧州铁狮磨浆机械有限公司| 上海捷赛机械有限公司| 无锡杨佳机械有限公司| 重庆江增机械有限公司| 江苏清淮机械有限公司| 唐山新宝泰钢铁有限公司| 上海国翔包装机械制造有限公司 | 佛山市劲雄机械有限公司| 汉中燕航精工机械有限公司| 苏州星光精密机械有限公司| 友嘉精密机械有限公司| 福建铁拓机械有限公司| 东莞机械设备有限公司| 威海机械制造有限公司| 河南正亚机械设备制造有限公司| 江苏爱斯特机械有限公司怎么样 | 旭能机械制造有限公司| 重庆太强机械有限公司| 上海德耐尔压缩机械有限公司| 青岛吉瑞特机械制造有限公司| 江门广力机械有限公司| 上海剑豪传动机械有限公司| 华东油压机械制造有限公司| 东芝机械上海有限公司| 重庆九源机械有限公司| 鑫磊机械制造有限公司| 山东银鹰炊事机械有限公司| 中山机械制造有限公司| 建筑装饰有限公司起名| 郑州水工机械有限公司招聘| 东莞大同机械有限公司| 宁波将军机械有限公司| 杭州一鼎传动机械有限公司| 郑州重型机械有限公司| 宁波液压机械有限公司| 淄博宙灿机械有限公司| 张家口煤矿机械制造有限公司 | 新乡市豫新起重机械有限公司| 青岛慧洋梳理机械有限公司| 湖北江重机械制造有限公司| 武汉格瑞拓机械有限公司| 广州市力进食品机械有限公司 | 湖州卓信机械有限公司| 贵州红林机械有限公司| 邢台机械轧辊有限公司| 诸城市铭威食品机械有限公司| 东莞高盟机械有限公司| 莱州日进机械有限公司| 力升机械有限公司.| 无锡佳特机械有限公司| 温州华推机械有限公司| 陕西重型机械制造有限公司| 鞍山机械制造有限公司| 上海沛愉机械制造有限公司| 江苏雨花钢铁有限公司| 富阳 机械有限公司| 苏州鹏丰机械元件有限公司| 上海紫光机械有限公司| 阳宏机械制造有限公司| 无锡科创机械设计制造有限公司 | 深圳恒盛力包装机械有限公司| 郑州富民机械有限公司| 肥城云宇机械有限公司| 浙江嘉益机械有限公司| 辽宁富一机械有限公司| 佛山市炬盈包装机械有限公司| 山东云光钢铁有限公司| 温州市润新机械制造有限公司| 陕西 机械 有限公司| 荆州祥达机械制造有限公司| 龙工江西机械有限公司| 张家港市港丰机械有限公司| 兖州丰业机械有限公司| 广州永胜钢铁制品有限公司| 机械(常州)有限公司| 湖南民和重工机械有限公司| 浙江豪盛印刷机械有限公司| 云南科玛机械设备有限公司| 德蒙压缩机械有限公司| 常州包装机械有限公司| 申耀机械工业有限公司| 苏州欧鼎机械有限公司| 三一工程机械有限公司| 上海乾享机械设备有限公司| 大连盘起工业有限公司| 安徽宇华机械制造有限公司| 河北裕华钢铁有限公司| 厦门群鑫机械工业有限公司| 佛山市松川包装机械有限公司| 福建泉成机械有限公司| 辽宁 机械制造有限公司| 东莞元渝机械有限公司| 上海铁美机械有限公司| 东莞市浈颖机械设备有限公司 | 东莞机械制造有限公司| 昆山烽禾升精密机械有限公司| 山东铭德机械有限公司| 四川盛和机械设备有限公司| 江苏中热机械设备有限公司| 上海昱钢包装机械有限公司| 大连铸鸿机械有限公司| 济南启正机械工业有限公司| 成都瑞迪机械实业有限公司| 辽宁中冶石化机械有限公司| 温州润新机械制造有限公司| 佛山精诚机械有限公司| 深圳塑胶机械有限公司| 山东元裕机械有限公司| 昌乐 机械 有限公司| 瑞安正博机械有限公司| 江苏柳工机械有限公司| 北京京民兴机械设备有限公司| 浙江临海机械有限公司| 南京东部精密机械有限公司| 海宁纺织机械有限公司| 江苏汉庭机械制造有限公司| 广东富华重工制造有限公司| 烟台博迈机械有限公司| 东莞 机械有限公司| 重庆九源机械有限公司| 浙江美华包装机械有限公司| 安徽机械制造有限公司| 昆玉钢铁有限公司招聘| 临沂工程机械有限公司| 广州金宗机械有限公司| 南京重霸起重设备有限公司| 新乡市大汉振动机械有限公司| 上海信烨精密机械有限公司| 河北输送机械有限公司| 白鸽食品机械有限公司| 江门市科杰机械自动化有限公司 | 成都万欣邦达机械制造有限公司| 桂林恒达矿山机械有限公司| 吉林牧神机械有限公司| 德实机械平湖有限公司| 武汉食品机械有限公司| 大洋食品机械有限公司| 常州艾隆精密机械有限公司| 博阳机械制造有限公司| 福宁船舶重工有限公司| 华西钢铁有限公司电话| 杭州千和精密机械有限公司| 湖州卓信机械有限公司| 焦作巨航粮油机械有限公司| 海德机械设备有限公司| 嘉诚机械制造有限公司| 杭州龙云水利机械制造有限公司| 浙江双鸟机械有限公司| 宁波五峰机械有限公司| 溧阳三元钢铁有限公司| 唐山泰钢钢铁有限公司| 青岛迪凯机械设备有限公司| 北海船舶重工有限公司| 宁波必沃纺织机械有限公司| 浙江万能弹簧机械有限公司| 重庆维庆液压机械有限公司| 合肥 机械有限公司| 苏州昶智精密机械有限公司| 陆丰机械郑州有限公司| 江阴市联拓重工机械有限公司| 台州 机械有限公司| 三联传动机械有限公司| 上海承企机械有限公司| 重庆春仁机械有限公司| 山东机械 有限公司| 上海丁博重工机械有限公司| 广东鸿业机械有限公司| 翼虎动力机械有限公司| 昆山来运机械设备有限公司| 环保设备机械有限公司| 广州市力进食品机械有限公司| 中核华兴机械化工程有限公司| 土平机械江苏有限公司| 合肥机械制造有限公司| 鸿江机械制造有限公司| 东莞市正一轴承机械有限公司| 济南华飞数控机械有限公司| 慈溪市宏晟机械设备有限公司| 湖南威士重工机械有限公司| 重型工程机械有限公司| 江苏金韦尔机械有限公司| 杭州金丰机械有限公司| 华威焊割机械有限公司| 上海龙应机械制造有限公司 | 沈阳华扬机械有限公司| 厦门升正机械有限公司| 天津华悦包装机械有限公司| 郑州市同鼎机械设备有限公司| 山东正丰钢铁有限公司| 济宁 机械有限公司| 威士重工机械有限公司| 南京机械电子有限公司| 常州金源机械设备有限公司| 徐州工程机械有限公司| 浙江瑞安机械有限公司| 和本精密机械有限公司| 南京科倍隆机械有限公司| 湖南五丰机械有限公司| 仕诚塑料机械有限公司| 无锡工源机械有限公司| 迅得机械东莞有限公司| 广州华臻机械设备有限公司| 洛阳中冶重工机械有限公司| 嘉兴市宏丰机械有限公司| 山西太行钢铁有限公司| 南通盛仕达精密机械有限公司| 延边金科食品机械有限公司| 开封市茂盛粮食机械有限公司 | 常州起重机械有限公司| 玉环机械制造有限公司| 杭州沃沃机械有限公司| 山东钢铁日照钢铁有限公司| 无锡力马化工机械有限公司| 长葛机械制造有限公司| 无锡市锡恒机械有限公司| 中远海运重工有限公司| 浙江制药机械有限公司| 厦门机械工业有限公司| 星 精密机械有限公司| 北京机械租赁有限公司| 元机械制造有限公司| 厦门市机械有限公司| 郑州年旭机械有限公司| 上海炬钢机械制造有限公司| 苏州同鑫鸿精密机械有限公司| 洛阳中收机械装备有限公司招聘| 上海乔麦包装机械有限公司| 韶关核力重工机械有限公司| 如皋市联创捏合机械有限公司| 上海山启机械制造有限公司| 浙江顶峰机械有限公司| 苏州盛友机械有限公司| 温州天富机械有限公司| 浙江瑞大机械有限公司| 江阴 起重机械有限公司| 常州 机械有限公司| 合肥光裕机械有限公司| 上海杰伟机械制造有限公司| 长沙天映机械有限公司| 浩强精密机械有限公司| 中山力劲机械有限公司| 牛力机械制造有限公司| 上海成套机械有限公司| 四川瑞迪佳源机械有限公司| 中阳钢铁有限公司招聘| 机械有限公司怎么注册| 宁波北仑机械有限公司| 江苏海特尔机械有限公司| 浙江国机械有限公司| 内蒙古机械有限公司| 大连滨海起重机吊具有限公司| 宝鸡万工机械制造有限公司| 海星机械制造有限公司| 宁波迪奥机械有限公司| 吴江精密机械有限公司| 青州市远航机械设备有限公司| 安徽省中冶重工机械有限公司| 江苏科力机械有限公司| 山东岳峰起重机械有限公司| 江阴纺织机械有限公司| 中实洛阳重型机械有限公司实习报告| 黄石华旦机械制造有限公司| 东方液压机械有限公司| 湖北粮食机械有限公司| 江苏爱斯特机械有限公司怎么样| 台州市四海机械有限公司| 山东德工机械有限公司| 金华机械 有限公司| 湖南金峰机械有限公司| 德昌誉机械制造有限公司| 青岛中华宇塑料机械有限公司| 建湖县液压机械有限公司| 金沙机械制造有限公司| 苏州昌瑞机械有限公司| 上海华迪机械有限公司| 上海 包装机械有限公司| 浙江全兴机械制造有限公司| 浙江引春机械有限公司| 青州包装机械有限公司| 常州泽威输送机械有限公司| 江苏同力机械有限公司| 山东工大机械有限公司| 河南云天起重机械有限公司| 南京德丰机械有限公司| 上海威士机械有限公司| 史陶比尔精密机械电子有限公司 | 浙江保龙机械有限公司| 龙岩市机械有限公司| 青岛慧洋梳理机械有限公司| 浙江汉克机械有限公司| 诚鑫诚机械有限公司| 佛山星光传动机械有限公司| 日照瑞荣机械有限公司| 甘肃机械化建设工程有限公司| 长春协展机械工业有限公司| 杭州博阳机械有限公司| 唐山正丰钢铁有限公司| 滦南华瑞钢铁有限公司| 浙江上洋机械有限公司| 扬州扬宝机械有限公司| 石嘴山钢铁有限公司| 河南省起重机械有限公司| 焦作 机械 有限公司| 浙江勇力机械有限公司| 上海玖钲机械设备有限公司| 苏州阔泽精密机械有限公司| 山东英胜机械有限公司| 玉环万全机械有限公司| 邢台机械制造有限公司| 汉虹精密机械有限公司| 常州龙鹏机械有限公司| 沧州机械制造有限公司| 上海嘉倍德塑胶机械有限公司| 浙江胜祥机械有限公司| 泰瑞机械有限公司待遇| 广州国伟机械有限公司| 南京化工机械有限公司| 济南大鹏机械设备有限公司| 徐州徐工基础工程机械有限公司| 上海西马特制药机械有限公司| 恩比尔(厦门)机械制造有限公司| 江苏隆达机械设备有限公司| 明辉机械设备制造有限公司| 张家港市机械制造有限公司| 上海国青机械有限公司| 新乡矿山起重机有限公司| 宁波震德机械制造有限公司| 安特苏州精密机械有限公司| 江苏巨风机械制造有限公司| 江苏江成机械有限公司| 自动化机械有限公司| 东莞市巨冈机械工业有限公司| 沃德精密机械有限公司| 诸城市宏宇轻机机械有限公司| 上海起重机械有限公司| 恒利达机械有限公司| 宁波威恩精密机械有限公司 | 杭州定江机械有限公司| 郑州重型机械有限公司| 浙江昌亨机械有限公司| 杭州驰耐传动机械有限公司| 上海伍行机械设备有限公司 | 上海浩勇精密机械有限公司 | 上海本优机械有限公司| 广州大圆机械设备有限公司| 济南钢铁 有限公司| 山东白龙机械有限公司| 沈阳六合机械有限公司| 浙江邦泰机械有限公司| 东莞市泽源机械有限公司 | 江苏鑫林钢铁有限公司| 广州 机械有限公司| 上海博强机械有限公司| 河北水利机械有限公司| 浙江人和机械有限公司| 湖南中旺工程机械设备有限公司| 绍兴金江机械有限公司| 郑州米格机械有限公司| 重庆江峰机械有限公司| 南通奥普机械工程有限公司| 浙江亿鹏机械有限公司| 成都成邦探矿机械设备有限公司| 鑫达机械设备有限公司| 广州东昇机械有限公司| 苏州三维精密机械有限公司| 湖南机械设备有限公司| 河北天择重型机械有限公司| 苏州市大华精密机械有限公司| 汤阴升达机械有限公司| 杭州嘉诚机械有限公司| 江阴华东机械有限公司| 宁波梦神床垫机械有限公司 | 沧州铁狮磨浆机械有限公司| 重庆华渝重工机电有限公司| 中山机械制造有限公司| 济南焊达机械有限公司| 温州镇田机械有限公司| 德耐尔压缩机械有限公司| 南通苏诺特包装机械有限公司 | 华东油压机械制造有限公司| 佛山隆机械有限公司| 山西中宇钢铁有限公司| 合肥中通抛光机械有限公司| 山东泰峰起重设备制造有限公司| 山东重型机械有限公司| 浙江金驰机械有限公司| 工程机械有限公司经营范围 | 北京机械施工有限公司| 台州市四海机械有限公司| 深圳市兴合发齿轮机械有限公司| 安阳永兴钢铁有限公司| 锦州俏牌机械有限公司| 河南三兄重工有限公司| 大连东拓工程机械制造有限公司| 武汉贝瑞克机械制造有限公司| 浙江荣亿精密机械有限公司| 重庆箭驰机械有限公司| 河南东盈机械设备有限公司| 上海新麦机械设备制造有限公司| 绵阳机械制造有限公司| 欧诺机械 有限公司| 南京星德机械有限公司| 云南机械设备有限公司| 盐城机械设备有限公司| 浙江康思特动力机械有限公司| 浙江立洋机械有限公司| 上海捷赛机械有限公司| 上海容安木工机械设备有限公司| 安徽远鸿机械有限公司| 瑞安 包装机械有限公司| 河北敬业钢铁有限公司| 大连升隆机械有限公司| 江阴凯澄起重机械有限公司| 标特福精密机械电子有限公司| 洛阳机械设备有限公司| 重庆爱扬机械有限公司| 青岛鲁奥机械有限公司| 上海远跃制药机械有限公司| 温州正钻机械有限公司| 河南泰兴粮油机械设备有限公司 | 温州华推机械有限公司| 合肥食品机械有限公司| 山西海威钢铁有限公司| 郑州长宏机械制造有限公司 | 深圳市丹耐斯机械有限公司| 南京东部精密机械有限公司| 昆山尚亦精密机械有限公司| 武安市裕华钢铁有限公司| 温州市机械有限公司| 上海诚淘机械有限公司| 山东力强机械有限公司| 上海科瑞机械有限公司| 永华机械有限公司招聘| 无锡东元精密机械有限公司| 安微博达重工有限公司| 比力特机械有限公司| 随州市恒大机械铸造有限公司| 兰州 机械 有限公司| 长春 机械 有限公司| 中核华兴达丰工程机械有限公司| 温州 机械有限公司| 重庆宏塑机械有限公司| 工程有限公司起名大全| 山东骏腾起重设备有限公司| 郑州市长城重工机械有限公司| 宝鸡忠诚制药机械有限公司| 唐山佳鑫机械配件有限公司| 潍坊凯隆机械有限公司| 张家港和和机械有限公司| 河南黎明路桥重工有限公司| 江苏宏光钢铁有限公司| 联德精密机械有限公司| 徐州机械设备有限公司| 张市机械机械有限公司| 郑州华郑机械有限公司| 江西鑫通机械有限公司| 丽驰精密机械有限公司| 莱州弘宇机械有限公司| 河南起重机器有限公司| 昆山 机械设备有限公司| 吉首市中诚制药机械有限公司| 北京盛美食品机械有限公司 | 上海众和包装机械有限公司 | 衡阳纺织机械有限公司| 永洋钢铁有限公司电话| 武汉四方圆机械设备有限公司| 青州市拓新机械设备有限公司| 上海路桥机械有限公司| 泉州金鹰机械有限公司| 宁波北仑机械有限公司| 江苏鸿泰钢铁有限公司| 厦门机械设备有限公司| 深圳龙润彩印机械设备有限公司| 佛山市劲雄机械有限公司| 山东永弘机械有限公司| 保东农业机械有限公司| 山东岳峰起重机械有限公司| 上海洗涤机械有限公司| 威海卓远机械有限公司| 海门亿峰机械有限公司| 河南红星矿山机械有限公司| 大唐机械制造有限公司| 江西鑫通机械制造有限公司| 葛洲坝机械船舶有限公司| 广州 机械有限公司| 青州市国发包装机械有限公司| 成都市机械有限公司| 烟台精密机械有限公司| 江苏凯凯机械有限公司| 永红铸造机械有限公司| 德州联合石油机械有限公司| 石家庄三一众力工程机械有限公司| 济南弘川包装机械有限公司| 南通龙威机械有限公司| 三一众力机械有限公司| 抚顺机械设备制造有限公司| 淄博协丰机械有限公司| 重庆地泽机械有限公司| 平湖成功机械有限公司| 宁波机械制造有限公司| 广州市机械设备有限公司| 杭州海铭钢铁有限公司| 徐州永欣重工有限公司| 廊坊机械制造有限公司| 上海创灵包装机械制造有限公司| 广州易鸿机械有限公司| 河北航天振邦精密机械有限公司| 河南启瀚机械设备有限公司| 德耐尔压缩机械有限公司| 广州铸星机械有限公司| 郑州重工机械有限公司| 杭州雅顿过滤机械有限公司| 浙江长泰机械有限公司| 济宁山矿机械有限公司| 河南共威机械设备有限公司| 江苏百德机械有限公司| 浙江印刷机械有限公司| 温州市日力轻工机械有限公司| 江阴宗承钢铁有限公司| 东莞智荣机械有限公司| 苏州斗山工程机械有限公司| 天津金岸重工有限公司| 志庆机械设备有限公司| 斗山机械工程有限公司| 河南省起重机械有限公司| 佛山 机械有限公司| 杭州青达机械有限公司| 青岛精密机械有限公司| 小松山东工程机械有限公司| 上海机械装备有限公司| 亨内基机械上海有限公司| 鑫盛机械制造有限公司| 圣博液压机械有限公司| 汕头机械设备有限公司| 沈阳友维机械有限公司| 三菱重工空调有限公司| 上海山美重型矿山机械有限公司 | 宏鑫机械设备有限公司| 西安柳工机械有限公司| 中兴机械制造有限公司| 江苏方邦机械有限公司| 辽宁三君工程机械有限公司|