成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 后端
本文介紹了在asp.net 2.0中如何創(chuàng)建一個(gè)數(shù)據(jù)訪問層(DAL)的第二步。

創(chuàng)建一個(gè)數(shù)據(jù)訪問層

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

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

GetCategories(), 返回所有分類的信息

GetProducts(), 返回所有產(chǎn)品的信息

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

GetProductByProductID(productID), 返回指定產(chǎn)品的信息

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

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

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

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

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

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

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

創(chuàng)建數(shù)據(jù)訪問層:創(chuàng)建強(qiáng)類型的DataSet和Table Adapter

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

給你的項(xiàng)目添加一個(gè)新的DataSet 

圖 4: 給你的項(xiàng)目添加一個(gè)新的DataSet

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

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

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

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

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

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

選擇好數(shù)據(jù)庫(kù)后,按“下一步”按鈕,向?qū)?huì)問你是否想在Web.config文件里存放連接字符串。將連接字符串存放在Web.config文件里,你可以避免把連接字符串硬寫在TableAdapter類的編碼中,如果將來(lái)連接字符串信息改動(dòng)的話,這種做法會(huì)極大地簡(jiǎn)化要做的編碼改動(dòng)。如果你選擇在配置文件存 放連接字符串,連接字符串將被置放于段落中,這個(gè)段落可以被加密來(lái)提高安全,也可以通過IIS 圖形界面管理工具中的新的asp.net 2.0屬性頁(yè)來(lái)修改。當(dāng)然這個(gè)工具更適于管理員。

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

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

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

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

用SQL語(yǔ)句查詢數(shù)據(jù) 

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

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

在文本框里輸入SQL查詢 

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

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

通過查詢編輯器生成查詢 

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

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

只選“生成插入,更新和刪除語(yǔ)句”這個(gè)選項(xiàng) 

圖 10: 只選“生成插入,更新和刪除語(yǔ)句”這個(gè)選項(xiàng)

在核實(shí)高級(jí)選項(xiàng)后,按“下一步(Next)”按鈕轉(zhuǎn)到***一屏。在這里,配置向?qū)?huì)問我們要給TableAdapter選擇添加什么方法。填充數(shù)據(jù)有兩種模式:

填充DataTable – 這個(gè)做法會(huì)生成一個(gè)方法,該方法接受一個(gè)DataTable的參數(shù),基于查詢的結(jié)果填充這個(gè)DataTable。譬如,ADO.NET的DataAdapter類就是在它的Fill()方法中實(shí)現(xiàn)這個(gè)模式的 。

返回DataTable – 這個(gè)做法會(huì)生成一個(gè)方法,該方法會(huì)創(chuàng)建并填充一個(gè)DataTable,然后將 其作為方法的返回值。

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

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

把方法名字從 GetData 改成 GetProducts 

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

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

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

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

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

  1. NorthwindTableAdapters.ProductsTableAdapter   
  2.  
  3. productsAdapter = new   
  4.  
  5. NorthwindTableAdapters.ProductsTableAdapter();  
  6. Northwind.ProductsDataTable products;  
  7.  
  8. products = productsAdapter.GetProducts();  
  9.  
  10. foreach (Northwind.ProductsRow productRow in products)  
  11.     Response.Write("Product: " +   
  12.  
  13. productRow.ProductName + "");  
  14.  

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

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

AllProducts.aspx

asp.net 

  1.  < %@ Page Language="C#"   
  2.  
  3. AutoEventWireup="true" CodeFile="AllProducts.aspx.cs"   
  4.  
  5. Inherits="AllProducts" %>  
  6.  
  7. < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   
  8.  
  9. Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  10.  
  11. < html xmlns="http://www.w3.org/1999/xhtml" >  
  12. < head runat="server">  
  13.     < title>View All Products in a GridViewtitle>  
  14.     < link href="Styles.css"   
  15.  
  16. rel="stylesheet"   
  17.  
  18. type="text/css"   
  19.  
  20. />  
  21. head>  
  22. < body>  
  23.     < form id="form1" runat="server">  
  24.     < div>  
  25.         < h1>  
  26.             All Productsh1>  
  27.         < p>  
  28.             < asp:GridView ID="GridView1" runat="server" 
  29.              CssClass="DataWebControlStyle">  
  30.                < HeaderStyle CssClass="HeaderStyle" />  
  31.                < AlternatingRowStyle CssClass="AlternatingRowStyle" />  
  32.             asp:GridView>  
  33.              p>  
  34.  
  35.     div>  
  36.     form>  
  37. body>  
  38. html>  
  39.  

AllProducts.aspx.cs

  1. using System;  
  2. using System.Data;  
  3. using System.Configuration;  
  4. using System.Collections;  
  5. using System.Web;  
  6. using System.Web.Security;  
  7. using System.Web.UI;  
  8. using System.Web.UI.WebControls;  
  9. using System.Web.UI.WebControls.WebParts;  
  10. using System.Web.UI.HtmlControls;  
  11. using NorthwindTableAdapters;  
  12.  
  13. public partial class   
  14.  
  15. AllProducts : System.Web.UI.Page  
  16. {  
  17.     protected void   
  18.  
  19. Page_Load(object sender, EventArgs e)  
  20.     {  
  21.         ProductsTableAdapter productsAdapter = new 
  22.          ProductsTableAdapter();  
  23.         GridView1.DataSource = productsAdapter.GetProducts();  
  24.         GridView1.DataBind();  
  25.     }  
  26. }  
  27.  

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

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

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

【編輯推薦】

  1. 如何在IIS6.0中部署asp.net mvc程序
  2. 用Winform傻瓜式搭建asp.net mvc框架
  3. ASP.NET Session失效的編程思路
  4. ASP.NET Session 狀態(tài)的存儲(chǔ)
  5. 了解ASP.NET Web應(yīng)用程序模型

 

責(zé)任編輯:book05 來(lái)源: 博客堂
相關(guān)推薦

2009-07-24 14:15:51

數(shù)據(jù)訪問層

2009-07-24 12:41:21

BLL類

2009-07-24 16:37:04

創(chuàng)建母版頁(yè)asp.net 2.0

2009-08-19 10:54:42

ASP.NET數(shù)據(jù)訪問

2009-07-24 13:45:28

添加參數(shù)化

2009-07-27 16:09:05

GridView顯示數(shù)

2009-07-24 17:15:52

SiteMapData

2009-07-27 09:35:57

業(yè)務(wù)邏輯層

2009-07-24 13:07:59

BLL類

2009-08-04 10:17:55

ASP.NET SqlASP.NET數(shù)據(jù)訪問

2009-07-24 17:08:31

添加站點(diǎn)地圖asp.net

2009-07-27 03:21:00

breadcrumb導(dǎo)

2009-07-27 16:22:54

GridView選擇行

2009-07-27 09:01:44

ObjectDataS

2009-07-20 17:12:17

ASP.NET訪問數(shù)據(jù)

2009-07-27 09:28:55

TableAdapte

2009-07-23 14:43:24

數(shù)據(jù)源控件ASP.NET 2.0

2009-07-27 09:39:04

SelectMetho

2009-07-28 14:06:28

ASP.NET 2.0

2009-07-22 17:21:27

ASP.NET 2.0
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 在线电影日韩 | 国产一区二区久久 | 天天操夜夜骑 | 国产精品久久久久一区二区三区 | 国产精品日韩欧美一区二区三区 | a成人| 国产精品视频网站 | 伊人久久综合 | 欧美精品一区二区三区在线 | 欧美精品福利视频 | 亚洲国产激情 | 国产九一精品 | 成人福利影院 | 日韩高清中文字幕 | 久久久久亚洲精品 | 国产精品久久九九 | 国产乱码精品一区二区三区五月婷 | av黄色免费 | 精品一区二区视频 | 国产乱码精品1区2区3区 | 国产精品视频在 | 91亚洲欧美| 中文字幕乱码视频32 | 国产乱码精品1区2区3区 | 欧美一级二级在线观看 | 国产精品波多野结衣 | 亚洲国产精品一区二区久久 | 日韩国产精品一区二区三区 | 国产精彩视频 | 麻豆av在线免费观看 | 亚洲视频在线播放 | 黑人性hd | 久久久久久久久国产精品 | 久久国产成人 | 亚洲自拍一区在线观看 | 日韩欧美在线视频 | 午夜小影院 | 日本午夜一区二区三区 | 国产精品久久久乱弄 | 人人做人人澡人人爽欧美 | 日韩欧美在线视频 |