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

2010-08-28 10:48:27來源:西部e網(wǎng)作者:

簡介
數(shù)據(jù)訪問一直是開發(fā) Web 應(yīng)用程序的一個(gè)關(guān)鍵問題。幾乎每個(gè)商業(yè)應(yīng)用程序都需要數(shù)據(jù)驅(qū)動(dòng)的 Web 頁面。由于數(shù)據(jù)訪問如此普遍,開發(fā)人員不斷地為簡單的數(shù)據(jù)庫任務(wù)重新生成復(fù)雜的代碼就顯得毫無意義了。開發(fā)人員需要從格式各異的不同數(shù)據(jù)源中快速訪問數(shù)據(jù)。幸運(yùn)的是,ASP.NET 2.0 中新增的數(shù)據(jù)訪問控件和 ADO.NET 2.0 解決了這一問題。

對于傳統(tǒng)的 ASP 和 ASP.NET 1.1 應(yīng)用程序而言,開發(fā)人員不得不創(chuàng)建代碼訪問和更新數(shù)據(jù)庫,將檢索到的數(shù)據(jù)轉(zhuǎn)換為瀏覽器識(shí)別的 HTML 格式。盡管 Visual Studio .NET 的向?qū)Э梢詭椭瓿蛇@個(gè)任務(wù),但是要完成諸如分頁和排序這樣的高級(jí)功能,仍需要在后端代碼和前端顯示之間進(jìn)行復(fù)雜的同步。通常,這樣的代碼難以維護(hù)和同步,特別是在數(shù)據(jù)庫發(fā)生更改或需要在頁面上顯示附加數(shù)據(jù)的時(shí)候。此外,作為數(shù)據(jù)存儲(chǔ),XML 需要添加大量混有數(shù)據(jù)訪問邏輯的代碼。

為了提高開發(fā)人員的開發(fā)效率和 Web 應(yīng)用程序的性能,ASP.NET 2.0 通過新增的數(shù)據(jù)控件中封裝的功能,更加靈活地控制數(shù)據(jù),從而減少訪問和顯示數(shù)據(jù)所需的代碼。從傳統(tǒng)的數(shù)據(jù)庫到 XML 數(shù)據(jù)存儲(chǔ),各種各樣的數(shù)據(jù)源都能連接到這些控件。所有數(shù)據(jù)源都以相似的格式進(jìn)行處理,大大地降低了開發(fā)數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用程序的復(fù)雜性。ASP.NET 2.0 需要進(jìn)行廣泛的體系結(jié)構(gòu)改進(jìn),以便從內(nèi)部支持這些功能。新增的數(shù)據(jù)源對象通過業(yè)界認(rèn)可的最佳方法增加了一個(gè)非?煽康幕A(chǔ)結(jié)構(gòu),F(xiàn)在,大多數(shù)復(fù)雜的應(yīng)用程序都可以利用 ASP.NET 2.0 提供的數(shù)據(jù)訪問工具。從體系結(jié)構(gòu)和機(jī)制上限制 ASP.NET 1.x 執(zhí)行的綁定和緩存問題,在 ASP.NET 2.0 中都得以解決了。

如果您是一位 ASP 開發(fā)人員,那么您會(huì)通過這篇白皮書了解到 ASP.NET 2.0 新增的數(shù)據(jù)訪問功能和 ADO.NET 2.0 的數(shù)據(jù)訪問模型。如果您是一位 ASP.NET 1.1 的開發(fā)人員,那么這篇白皮書概括的 ADO.NET 新增的改進(jìn)功能和數(shù)據(jù)訪問模型,以及介紹的如何使用 ASP.NET 2.0 新增的數(shù)據(jù)訪問控件將幫助您減少開發(fā)數(shù)據(jù)驅(qū)動(dòng) Web 應(yīng)用程序時(shí)編寫的代碼數(shù)量。

返回頁首
Web 應(yīng)用程序的數(shù)據(jù)訪問
在 .NET Framework 中,通過 ADO.NET API 執(zhí)行數(shù)據(jù)訪問。API 提供一個(gè)抽象層來封裝和隱藏直接訪問數(shù)據(jù)庫的細(xì)節(jié),這些細(xì)節(jié)有時(shí)是很雜亂的。ASP.NET 2.0 Web 應(yīng)用程序通過提供的一些服務(wù)在 ADO.NET 上生成,這些服務(wù)用于自動(dòng)生成與各種類型數(shù)據(jù)的連接,將用戶控件與數(shù)據(jù)綁定,減少開發(fā)數(shù)據(jù)識(shí)別的 Web 應(yīng)用程序所需的代碼數(shù)量。

數(shù)據(jù)訪問體系結(jié)構(gòu)

對于 .NET Framework 中的 Web 應(yīng)用程序,數(shù)據(jù)訪問依賴于兩個(gè)獨(dú)立的體系結(jié)構(gòu)層。第一層由執(zhí)行數(shù)據(jù)訪問所需的框架組件組成。第二層由為程序員提供數(shù)據(jù)訪問功能的 API 和控件組成。從實(shí)踐的觀點(diǎn)看,只需了解能否為特定數(shù)據(jù)源找到匹配的數(shù)據(jù)提供程序。

數(shù)據(jù)訪問涉及四個(gè)主要的組件:Web 應(yīng)用程序 (ASP.NET)、數(shù)據(jù)層 (ADO.NET)、數(shù)據(jù)提供程序,以及真正的數(shù)據(jù)源。這些組件之間的關(guān)系構(gòu)成了所有數(shù)據(jù)識(shí)別 Web 應(yīng)用程序的基礎(chǔ)結(jié)構(gòu)。


按此在新窗口打開圖片
圖 1. 組件體系結(jié)構(gòu)


數(shù)據(jù)存儲(chǔ)

數(shù)據(jù)存儲(chǔ)始于堆棧底部,提供了整個(gè)數(shù)據(jù)訪問體系結(jié)構(gòu)的基礎(chǔ)。通過 ADO.NET 2.0、ASP.NET 2.0 的新增控件,Web 應(yīng)用程序能夠訪問多種數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù),包括關(guān)系數(shù)據(jù)庫、XML 文件、Web 服務(wù)、平面文件,或諸如 Microsoft Excel 這樣的電子數(shù)據(jù)表程序中的數(shù)據(jù)。實(shí)際上,真正的數(shù)據(jù)源與讀取和操作數(shù)據(jù)所使用的機(jī)制關(guān)系不大。 

數(shù)據(jù)提供程序

由于具有提供程序模型,ADO.NET 使用一組類和命令與不同的數(shù)據(jù)源進(jìn)行交互。提供程序通過定義的一組接口和類掛鉤來提供對一個(gè)特定數(shù)據(jù)源的存儲(chǔ)和檢索功能。這種模型的靈活性使開發(fā)人員只需編寫一組數(shù)據(jù)訪問代碼(使用 ADO.NET)就能夠訪問多種類型的數(shù)據(jù)。 

在 ASP.NET 2.0 中,除了基本的數(shù)據(jù)訪問之外,提供程序模型實(shí)際上還用于多種不同的任務(wù)。例如,使用新增的個(gè)性化功能存儲(chǔ)用戶數(shù)據(jù)時(shí)依賴于幾類提供程序。因此,實(shí)際的提供程序結(jié)構(gòu)是功能依賴的。一個(gè)成員提供程序的用途與數(shù)據(jù)訪問提供程序的用途不同。

下表顯示組成 ADO.NET 數(shù)據(jù)提供程序的四個(gè)核心對象:

表 1. 一個(gè) ADO.NET 數(shù)據(jù)提供程序的核心對象 
對象 描述 
Connection
 建立到指定資源的連接
 
Command
 對一個(gè)數(shù)據(jù)源執(zhí)行命令。公開 Parameters,在 Connection 的 Transaction 范圍內(nèi)執(zhí)行。
 
DataReader
 從一個(gè)數(shù)據(jù)源讀取只進(jìn)的只讀數(shù)據(jù)流。
 
DataAdapter
 填充一個(gè) DataSet,解析數(shù)據(jù)源的更新。
 

提供程序模型明確地分離了各種使用用途。ASP.NET 開發(fā)人員能夠集中精力構(gòu)建功能性的、應(yīng)用人類工程學(xué)的用戶界面,而后端開發(fā)人員則能夠通過現(xiàn)有的企業(yè)級(jí)數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)復(fù)雜的集成。使用 ASP.NET 2.0 的提供程序模型開發(fā) Web 應(yīng)用程序是一個(gè)極好的選擇。

ADO.NET API

ADO.NET API 定義的抽象層使所有的數(shù)據(jù)源看起來都是相同的。不論何種數(shù)據(jù)源,提取信息的過程都涉及相同的關(guān)鍵類和步驟。我們將在下一部分詳細(xì)介紹 ADO.NET 的處理過程。

Web 應(yīng)用程序?qū)?BR>
ASP.NET 在棧頂提供一系列控件,這些控件的設(shè)計(jì)意圖是為減少開發(fā)的數(shù)據(jù)訪問代碼數(shù)量。例如,開發(fā)人員能使用數(shù)據(jù)源向?qū)ё詣?dòng)創(chuàng)建和配置一個(gè)數(shù)據(jù)源,使用這個(gè)數(shù)據(jù)源發(fā)布查詢和檢索結(jié)果。此外,不同的控件能夠綁定到一個(gè)數(shù)據(jù)源,因此,控件能夠依據(jù)從數(shù)據(jù)源檢索到的信息,自動(dòng)設(shè)置控件的外觀和內(nèi)容。

這些控件具有各種形狀和大小,包括網(wǎng)格、樹、菜單和列表。數(shù)據(jù)綁定控件通過它的 DataSourceID 屬性連接到一個(gè)數(shù)據(jù)源,此屬性在設(shè)計(jì)時(shí)或運(yùn)行時(shí)聲明。

數(shù)據(jù)源控件通過提供程序(例如 ADO.NET 中的那些提供程序)綁定到下層的數(shù)據(jù)存儲(chǔ)。使用數(shù)據(jù)源控件的好處是能夠在頁面中聲明性地表示出來。此外,能夠直接使用諸如分頁、排序和更新操作等功能,而無需編寫一行代碼。

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

第二個(gè)體系結(jié)構(gòu)層提供使用提供程序、ADO.NET 和 ASP.NET 控件的通用機(jī)制。這個(gè)體系結(jié)構(gòu)涉及一些通用任務(wù)和過程。然而,從開發(fā)人員的視角來看,使用 ASP.NET 2.0 提供的各種數(shù)據(jù)綁定控件和數(shù)據(jù)源控件無需編寫代碼來支持這些過程。

連接和命令

ADO.NET 包含的 .NET Framework 數(shù)據(jù)提供程序用于連接一個(gè)數(shù)據(jù)庫,執(zhí)行命令和檢索結(jié)果。在 ADO.NET 中,使用 Connection 對象連接一個(gè)指定的數(shù)據(jù)源。例如,在 SQL Server 2000 中,能夠使用 SQLConnection 對象連接一個(gè)數(shù)據(jù)庫,如以下代碼所示。

[Visual Basic]
Dim nwindConn As SqlConnection = _
 New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" _
 "Initial Catalog=northwind")
nwindConn.Open()

[C#]
SqlConnection nwindConn = 
 new SqlConnection("Data Source=localhost; Integrated Security=SSPI;"
 "Initial Catalog=northwind");
nwindConn.Open();

連接到數(shù)據(jù)源后,能夠使用 Command 對象執(zhí)行命令和返回結(jié)果。Command 對象通過 Command 的構(gòu)造函數(shù)創(chuàng)建,這個(gè)構(gòu)造函數(shù)接收一個(gè) SQL 語句或 SQL 查詢。一旦創(chuàng)建了 Command,就能使用 CommandText 屬性修改 SQL 語句。

Visual Basic]
Dim catCMD As SqlCommand = _
 New SqlCommand("SELECT CategoryID, CategoryName FROM Categories", 
   nwindConn)

[C#]
SqlCommand catCMD = 
 new SqlCommand("SELECT CategoryID, CategoryName FROM Categories", 
   nwindConn);

您可將一條命令認(rèn)為是等同于一個(gè)特定的 SQL 調(diào)用,該調(diào)用綁定到一個(gè)特定的數(shù)據(jù)庫。一條命令只能用于 CommandText 字段中定義的特定調(diào)用。

Command 對象提供了一些不同的 Execute 方法來啟動(dòng)存儲(chǔ)過程,執(zhí)行查詢或者執(zhí)行非查詢語句,例如更新或插入: 

1.
 ExecuteReader 方法 — 將數(shù)據(jù)作為一個(gè) DataReader 對象返回。用于任何返回?cái)?shù)據(jù)的 SQL 查詢。 
 
2.
 ExecuteScalar 方法 — 返回單獨(dú)值,例如與特定查詢相匹配的記錄數(shù),或者數(shù)據(jù)庫功能調(diào)用的結(jié)果。 
 
3.
 ExecuteNonQuery 方法 — 執(zhí)行不返回任何行的命令。典型的例子是存儲(chǔ)過程、插入和更新。 
 

當(dāng)然,您需要依據(jù)初始化 Command 對象時(shí)創(chuàng)建的命令來選擇正確的 Execute 方法。

ExecuteReader 方法將任何結(jié)果都返回到 DataReader 對象。DataReader 對象是查詢數(shù)據(jù)庫返回的一個(gè)關(guān)聯(lián)的、只進(jìn)的只讀數(shù)據(jù)流。執(zhí)行查詢時(shí),第一行返回到 DataReader 中。數(shù)據(jù)流保持到數(shù)據(jù)庫的連接,然后返回下一條記錄。DataReader 從數(shù)據(jù)庫中讀取行數(shù)據(jù)時(shí),每行的列值都被讀取和計(jì)算,但是不能被編輯。

DataAdapter 和 DataSet

雖然連接數(shù)據(jù)庫的應(yīng)用程序使用 DataReader 就已足夠,但是,DataReader 不能很好地支持?jǐn)?shù)據(jù)庫訪問的斷開連接模型。而 DataAdapter 和 DataSet 類則滿足了這一需求。

DataSet 是 ADO.NET 斷開連接體系結(jié)構(gòu)中主要的數(shù)據(jù)存儲(chǔ)工具。填充 DataSet 時(shí),并非通過 Connection 對象將 DataSet 直接連接到數(shù)據(jù)庫。您必須創(chuàng)建一個(gè) DataAdapter 來填充 DataSet。DataAdapter 連接數(shù)據(jù)庫,執(zhí)行查詢并填充 DataSet。當(dāng) DataAdapter 調(diào)用 Fill 或 Update 方法時(shí),在后臺(tái)完成所有的數(shù)據(jù)傳輸。每個(gè) .NET Framework 的數(shù)據(jù)提供程序都有一個(gè) DataAdapter 對象。

一個(gè) DataSet 代表一組完整的數(shù)據(jù),包括表格、約束條件和表關(guān)系。DataSet 能夠存儲(chǔ)代碼創(chuàng)建的本地?cái)?shù)據(jù),也能存儲(chǔ)來自多個(gè)數(shù)據(jù)源的數(shù)據(jù),并斷開到數(shù)據(jù)庫的連接。

DataAdapter 能控制與現(xiàn)有數(shù)據(jù)源的交互。DataAdapter 也能將對 DataSet 的變更傳輸回?cái)?shù)據(jù)源中。下列代碼說明使用 DataSet 典型情況。

[Visual Basic]
Dim nwindConn As SqlConnection = _
 New SqlConnection("Data Source=localhost;" & _
 "Integrated_Security=SSPI;Initial Catalog=northwind")

Dim selectCMD As SqlCommand = _
 New SqlCommand("SELECT CustomerID, CompanyName FROM " & _
 "Customers", nwindConn)
selectCMD.CommandTimeout = 30

Dim custDA As SqlDataAdapter= New SqlDataAdapter
custDA.SelectCommand= selectCMD
Dim custDS As DataSet= New DataSet
custDA.Fill(custDS, "Customers")
nwindConn.Close()

[C#]
SqlConnection nwindConn = 
 new SqlConnection("Data Source=localhost;" +
   "IntegratedSecurity=SSPI;Initial Catalog=northwind");
SqlCommand selectCMD = 
 new SqlCommand("SELECT CustomerID, CompanyName FROM Customers",
                      nwindConn);
selectCMD.CommandTimeout = 30;

SqlDataAdaptercustDA = new SqlDataAdapter();
custDA.SelectCommand= selectCMD;
nwindConn.Open();
DataSetcustDS = new DataSet();
custDA.Fill(custDS, "Customers");
nwindConn.Close();

在以上代碼中: 

1.
 創(chuàng)建了一個(gè) SQLConnection 來連接 SQL Server 數(shù)據(jù)庫。 
 
2.
 創(chuàng)建了一個(gè) SQLCommand 來查詢 Customers 表格。 
 
3.
 創(chuàng)建了一個(gè) DataAdapter 來執(zhí)行 SQLCommand 和數(shù)據(jù)操作的連接部分。 
 
4.
 從 DataAdapter 可以創(chuàng)建一個(gè) DataSet。DataSet 是數(shù)據(jù)操作的斷開連接部分,并且能綁定到 ASP.NET 2.0 的各種 Web 控件。 
 

一旦創(chuàng)建了 DataSet,就能夠?qū)⑺壎ǖ饺魏螖?shù)據(jù)識(shí)別的控件,方法是通過控件的 DataSource 屬性和 DataBind() 方法。不幸的是,如果數(shù)據(jù)發(fā)生更改,您不得不再次調(diào)用 DataBind(),將控件重新綁定到數(shù)據(jù)集。因此,ASP.NET 1.x 開發(fā)人員不得不考慮調(diào)用綁定方法的精確時(shí)間和位置。開發(fā)出正確的同步方法和同步事件是相當(dāng)困難的。

由于存在數(shù)據(jù)源的概念,ASP.NET 2.0 極大地簡化了創(chuàng)建、綁定 DataSet 以及保持?jǐn)?shù)據(jù)同步的全部過程。

ASP.NET 2.0

ASP.NET 2.0 從幾個(gè)方面極大地改進(jìn)了基本模型。最突出的一方面是,通過 DataSource 隱藏了創(chuàng)建 SQLCommand、生成 DataAdapter 和填充 DataSet 的過程,或者由數(shù)據(jù)綁定向?qū)ё詣?dòng)配置這個(gè)過程。

Configure DataSource Wizard 生成的代碼能夠連接數(shù)據(jù)源(數(shù)據(jù)庫、平面文件、XML、對象),創(chuàng)建查詢,并允許開發(fā)人員以簡單的幾個(gè)步驟指定參數(shù)。

一旦創(chuàng)建了數(shù)據(jù)源,下一步就是將數(shù)據(jù)源連接到一個(gè)控件。這里的“連接”就是所謂的數(shù)據(jù)綁定。從數(shù)據(jù)源提取的值能夠連接到控件屬性或作為表格、列表或網(wǎng)格中的值使用,這些操作都無需編寫任何代碼。

返回頁首
ASP.NET 數(shù)據(jù)控件
ASP.NET 1.1 是為使用 ADO.NET API 和簡化數(shù)據(jù)訪問而設(shè)計(jì)的。ADO.NET 2.0 通過新增的一組控件和向?qū)нM(jìn)一步簡化了數(shù)據(jù)訪問過程和編寫代碼的數(shù)量,這些控件和向?qū)轻槍?shù)據(jù)識(shí)別的應(yīng)用程序,為提高開發(fā)速度和簡化開發(fā)過程而設(shè)計(jì)的。

DataSource 控件

新的 ASP.NET 2.0 數(shù)據(jù)訪問系統(tǒng)的核心是 DataSource 控件。一個(gè) DataSource 控件代表一個(gè)備份數(shù)據(jù)存儲(chǔ)(數(shù)據(jù)庫、對象、xml、消息隊(duì)列等),能夠在 Web 頁面上聲明性地表示出來。頁面并不顯示 DataSource,但是它確實(shí)可以為任何數(shù)據(jù)綁定的 UI 控件提供數(shù)據(jù)訪問。為了支持 DataSource 并使用自動(dòng)數(shù)據(jù)綁定,利用一個(gè)事件模型以便在更改數(shù)據(jù)時(shí)通知控件,各種 UI 控件都進(jìn)行了重新設(shè)計(jì)。此外,數(shù)據(jù)源還提供了包括排序、分頁、更新、刪除和插入在內(nèi)的功能,執(zhí)行這些功能無需任何附加代碼。

最終,所有 DataSource 控件公開一個(gè)公共接口,因此,數(shù)據(jù)綁定控件無需了解連接細(xì)節(jié)(即連接到一個(gè)數(shù)據(jù)庫還是一個(gè) XML 文件)。每個(gè) DataSource 還公開了特定于數(shù)據(jù)源的屬性,因而對開發(fā)人員而言更為直觀。例如,SqlDataSource 公開了 ConnectionString 和 SelectCommand 屬性,而 XMLDataSource 則公開了定義源文件和任何架構(gòu)的屬性。在底層,所有數(shù)據(jù)源都創(chuàng)建特定于提供程序的基礎(chǔ) ADO.NET 對象,該對象是檢索數(shù)據(jù)所需的。

創(chuàng)建一個(gè) DataSource

在ASP.NET 2.0 中,DataSource 的子類是新增的數(shù)據(jù)控件中功能最強(qiáng)大的。它們提供了到數(shù)據(jù)庫、XML 文件或其他數(shù)據(jù)源的聲明性配置連接。使用控件從數(shù)據(jù)源檢索和更新數(shù)據(jù)無需添加任何自定義代碼。Configure DataSource Wizards 的圖形化界面允許程序員定義相應(yīng)的細(xì)節(jié)來配置數(shù)據(jù)源,幾個(gè)簡單的步驟就可以完成。ASP.NET 2.0 自動(dòng)生成代碼來連接資源,如果合適,創(chuàng)建基于參數(shù)的查詢。自動(dòng)生成的代碼結(jié)果存儲(chǔ)在一個(gè) .ASPX 文件中。例如,在 .ASPX 文件中存儲(chǔ)的 SQLDataSource 代碼包含連接字符串的屬性和 SQL 語句的屬性。

<asp:sqldatasource
  id="SqlDataSource1"
  runat="server"
  selectcommand="select customerid, companyname from customers"
  providername="System.Data.OleDb" 
     connectionstring="Provider=SQLOLEDB.1;Integrated Security=SSPI; 
     Initial Catalog=Northwind; Data Source=localhost; 
     Auto Translate=True; Use Encryption for Data=False>
</asp:sqldatasource>

當(dāng)然,開發(fā)人員能夠根據(jù)需要修改這些代碼。例如,可以將提供程序名移動(dòng)到 web.config 文件或其他中心位置。

數(shù)據(jù)源類型

ASP.NET 2.0 提供了幾個(gè)獨(dú)特的數(shù)據(jù)源對象,用于為數(shù)據(jù)綁定控件構(gòu)造一個(gè)公共接口框架。數(shù)據(jù)源的對象用于操作不同的基礎(chǔ)結(jié)構(gòu)(從數(shù)據(jù)庫、內(nèi)存中的對象到 XML 文件),為控件提供抽象數(shù)據(jù)操作功能。

返回頁首
AccessDataSource
如果在應(yīng)用程序中使用 Microsoft Access 數(shù)據(jù)庫,則能夠通過 System.Web.UI.WebControls.AccessDataSource 執(zhí)行插入、更新和刪除數(shù)據(jù)的操作。Access 數(shù)據(jù)庫是提供基本關(guān)系存儲(chǔ)的最小數(shù)據(jù)庫。因?yàn)槭褂闷饋砑群唵斡址奖,所以許多小型的 Web 站點(diǎn)通過 Access 形成數(shù)據(jù)存儲(chǔ)層。雖然 Access 不提供像 SQL Server 這樣的關(guān)系數(shù)據(jù)庫的所有功能,但是其簡單性和易用性使 Access 非常適合應(yīng)用于原型開發(fā)和快速應(yīng)用程序開發(fā) (RAD)。

返回頁首
SqlDataSource
為了提供一個(gè)更加健壯的數(shù)據(jù)庫,綜合利用 Microsoft SQL Server 提供的廣泛功能,ASP.NET 2.0 提供了 SQLDataSource。SQLDataSource 的配置比 AccessDataSource 的更為復(fù)雜,SQLDataSource 用于企業(yè)級(jí)應(yīng)用程序,這些應(yīng)用程序需要一個(gè)真正的數(shù)據(jù)庫管理系統(tǒng) (DBMS) 所擁有的功能。

返回頁首
ObjectDataSource
System.Web.UI.WebControls.ObjectDataSource 用于實(shí)現(xiàn)一個(gè)數(shù)據(jù)訪問層,從而提供更好的封裝和抽象。ObjectDataSource 控件支持綁定到一個(gè)特定的數(shù)據(jù)層,而非綁定到一個(gè)數(shù)據(jù)庫,其綁定方式與使用其他控件綁定數(shù)據(jù)庫的方式相同。ObjectDataSource 控件能夠綁定到任何一個(gè)方法,該方法返回一個(gè) DataSet 對象或 IEnumerable 對象(例如,一個(gè) DataReader 或類集合)。

<asp:objectdatasource 
     id="ObjectDataSource" 
     runat="server" 
     typename="DAL.Customers" 
     selectmethod="GetOrders"> 
</asp:objectdatasource>

ObjectDataSource 控件使用 Web 服務(wù)代理的方式與使用數(shù)據(jù)訪問層的方式完全相同。換句話說,ObjectDataSource 處理設(shè)計(jì)正確的 Web 服務(wù)與處理一個(gè)關(guān)系數(shù)據(jù)庫的方式相同。

返回頁首
DataSetDataSource
System.Web.UI.WebControls.DataSetDataSource 控件允許使用 XML 列表數(shù)據(jù)。列表數(shù)據(jù)以行和列排列。

<?xml version="1.0"?>
<collection>
  <book>
    <title>cosmos</title>
    <author>carl sagan</author>
    <publisher>ballantine books</publisher>
  </book>
  <book>
    <title>catwings</title>
    <author>ursula k. le guin</author>
    <publisher>scholastic</publisher>
  </book>
</collection>
 

要使用數(shù)據(jù),只需設(shè)置 DataFile 屬性,使其指向 XML 文件。

<asp:datasetdatasource id="Datasetdatasource1" runat="server"
                       datafile="collection.xml" />

數(shù)據(jù)源能夠連接到任何列表控件,例如 DataGrid。

XmlDataSource
XML 數(shù)據(jù)通常用于表示半結(jié)構(gòu)化或?qū)哟位瘮?shù)據(jù)。使用 XML 文檔作為數(shù)據(jù)源,可以從其他資源(例如,其他公司或現(xiàn)有應(yīng)用程序)接收 XML 文檔,并將 XML 數(shù)據(jù)格式化,以便與應(yīng)用程序兼容。

要配置一個(gè) System.Web.UI.WebControls.XmlDataSource,必須指定 XML 文件的路徑,如果 XML 需要傳輸數(shù)據(jù),則還需指定 XSLT 樣式表路徑或 XPath 查詢路徑(可選)。

<asp:XmlDataSource
    ID="XmlDataSource1"
    Runat="server"
    DataFile="~/xml/fruits.xml">
</asp:XmlDataSource>

XMLDataSource 特別適用于擁有層次結(jié)構(gòu)的控件,例如,樹視圖或數(shù)據(jù)列表。

<asp:TreeView
    ID="TreeView1"
    Runat="server"
    DataSourceID="XmlDataSource1"
    ShowLines="True">
</asp:TreeView>

以上兩個(gè)列表說明了如何聲明性地配置一個(gè) XmlDataSource 和一個(gè) TreeView 控件,使之呈現(xiàn)如圖 2 所示的 XML 層次結(jié)構(gòu)。


按此在新窗口打開圖片
圖 2. TreeView 控件


TreeView 控件自動(dòng)生成標(biāo)記來創(chuàng)建一個(gè)用戶界面,支持用戶單擊父實(shí)體時(shí)展開節(jié)點(diǎn)。TreeView 控件通過 XMLDataSource 綁定到 fruits.xml 文件。

SiteMapDataSource
System.Web.UI.WebControls.SiteMapDataSource 控件能夠在邏輯上(而非物理上)實(shí)現(xiàn) Web 站點(diǎn)的導(dǎo)航。通過生成一個(gè)邏輯結(jié)構(gòu),導(dǎo)航不受文件物理地址變動(dòng)的影響。即使頁面物理位置改變,您也不必更改應(yīng)用程序的導(dǎo)航結(jié)構(gòu)。

要使用 SiteMapDataSource,第一步是創(chuàng)建一個(gè) XML 文件來映射 SiteMapNode 元素的層次結(jié)構(gòu),從而指定站點(diǎn)的導(dǎo)航結(jié)構(gòu)。您可以將 XML 文件保存為 app.sitemap。

當(dāng)您在應(yīng)用程序中使用 SiteMapDataSource 時(shí),它將查找指定的 app.sitemap 文件。然后,SiteMapDataSource 連接到導(dǎo)航控件,實(shí)現(xiàn)邏輯導(dǎo)航。


按此在新窗口打開圖片
圖 3. Home-> Articles-> Article 2 頁面的詳細(xì)路經(jīng)跟蹤


數(shù)據(jù)綁定

一旦創(chuàng)建了一個(gè)數(shù)據(jù)源,接下來是將數(shù)據(jù)源連接到一個(gè)控件。這里的“連接”就是所謂的數(shù)據(jù)綁定。ASP.NET v1.x 提供了一些數(shù)據(jù)綁定控件,例如 DataGrid、DataList 和 DropDownList 等。ASP.NET 2.0 對改進(jìn)數(shù)據(jù)綁定控件的概念作出了幾個(gè)重要的創(chuàng)新: 

1.
 現(xiàn)在,當(dāng)數(shù)據(jù)綁定控件綁定到一個(gè)數(shù)據(jù)源控件(通過 DataSourceID 屬性)時(shí),能夠自動(dòng)綁定本身。這使頁面開發(fā)人員無需了解頁面的生存周期,并且不必在此時(shí)顯式調(diào)用 DataBind()。數(shù)據(jù)綁定控件能夠自動(dòng)完成這些工作,甚至能偵聽數(shù)據(jù)源的更改事件。 
 
2.
 ASP.NET 2.0 引入了新的數(shù)據(jù)綁定控件,這些控件能自動(dòng)使用數(shù)據(jù)源的功能,例如排序、分頁、更新、插入和刪除。 
 

在 ASP.NET v1.x 中,頁面開發(fā)人員需要手動(dòng)處理數(shù)據(jù)綁定控件事件,編寫代碼來執(zhí)行這些操作。而在 ASP.NET 2.0 中,數(shù)據(jù)綁定控件直接使用數(shù)據(jù)源的功能。當(dāng)然,頁面開發(fā)人員仍能處理適當(dāng)?shù)氖录宰远x這些操作的處理;例如,驗(yàn)證輸入。

ASP.NET 2.0 支持多種不同控件豐富的數(shù)據(jù)綁定。例如,能夠?qū)⒁粋(gè) XML 數(shù)據(jù)源綁定到 <ASP:DropDownList>、<ASP:DataList>、<ASP: GridView> 以及許多其他的數(shù)據(jù)控件。

ASP.NET 2.0 中的數(shù)據(jù)綁定

傳統(tǒng)的應(yīng)用程序需要編寫代碼來綁定數(shù)據(jù)。例如,要在傳統(tǒng)的 ASP 中填充下拉列表,或?qū)撁嬷械闹颠M(jìn)行硬編碼(如下所示),或編寫代碼來連接數(shù)據(jù)庫,檢索數(shù)據(jù),再填充下拉列表。如果手動(dòng)填充下拉列表,則每次更新數(shù)據(jù)時(shí),必須更改代碼(手動(dòng))。

<select size="1" name="dropdown_menu">
  <option value="1" >test_data1</option>
  <option value="2">test_data2</option>
  <option value="3">test_data3</option>
  <option value="4">test_data4</option>
</select>

如果通過訪問數(shù)據(jù)庫表的方式填充列表,則不僅需要編寫代碼來檢索信息,而且每次加載頁面時(shí),應(yīng)用程序都需要訪問數(shù)據(jù)庫,或在應(yīng)用程序級(jí)或會(huì)話級(jí)緩存信息。

另一方面,ASP.NET 1.1 允許將控件綁定到數(shù)據(jù)庫表和 XML 文檔。但是,在 ASP.NET 1.1 中,如果要綁定到一個(gè) XML 數(shù)據(jù)源,需要將 XML 轉(zhuǎn)換為 DataSet(本文前面作過概述)。一旦獲得轉(zhuǎn)換后的 DataSet,只要將 DataSet 綁定到控件上即可。

//C# code
listbox.DataSource= dataset.Tables[0];
listbox.DataTextField = "Name";
listbox.DataValueField = "ID";
listbox.DataBind()

//VB Code
listbox.DataSource= dataset.Tables(0)
listbox.DataTextField = "Name"
listbox.DataValueField = "ID"
listbox.DataBind()

但是,每此更新 XML 數(shù)據(jù)源,必須重新將控件綁定到一個(gè)新的 DataSet,這是因?yàn)?nbsp;DataSet 不能動(dòng)態(tài)地連接到源文件。

在 ASP.NET 2.0 中綁定控件

ASP.NET 2.0 允許將下拉列表綁定到 XML 數(shù)據(jù)源或數(shù)據(jù)庫,而無需編寫任何代碼。如果更新基礎(chǔ)數(shù)據(jù),它能夠確保緩存值自動(dòng)刷新。

要綁定控件,首先需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)源?梢允謩(dòng)編寫數(shù)據(jù)源定義代碼,或使用 Configure Data Source Wizard。


按此在新窗口打開圖片

按此在新窗口打開圖片
XMLDataSource 配置向?qū)г?nbsp;Web.config 文件中生成了下面的代碼。

<asp:xmldatasource id="XmlDataSource1" 
  datafile="msdn.xml" 
  xpath="rss/channel/item" 
  runat="server" 
/>
 

一旦建立了數(shù)據(jù)源,就能夠?qū)?shù)據(jù)綁定到控件。下列代碼顯示如何將 XML 數(shù)據(jù)源綁定到下拉列表控件。

<asp:dropdownlist id="DropDownList1" runat="server" 
datatextfield="state" datasourceid="XMLDataSource1" 
autopostback="true" />

請注意,ASP.NET 1.x 和 ASP.NET 2.0 中數(shù)據(jù)綁定的主要區(qū)別在于提供程序模型是否自動(dòng)同步發(fā)生了更改的數(shù)據(jù)。換句話說,由于在數(shù)據(jù)源中置入了一個(gè)事件模型,如果修改支持?jǐn)?shù)據(jù)源的數(shù)據(jù),則自動(dòng)更新綁定控件。

數(shù)據(jù)綁定控件

ASP.NET 2.0 引入了幾個(gè)用于顯示數(shù)據(jù)的新控件。這些新控件提供了一些比 ASP.NET 1.1 的 DataGrid 控件更優(yōu)越的增強(qiáng)功能。

GridView 控件

ASP.NET 1.1 的 DataGrid 控件功能強(qiáng)大,使用靈活,允許顯示結(jié)構(gòu)化數(shù)據(jù),無需編寫大量代碼。但是,如果要操作 DataGrid 的內(nèi)容(例如,編輯或?qū)Ψ祷匦羞M(jìn)行排序),需要編寫適量的代碼,自定義控件并提供這些行為。

GridView 與 DataGrid 控件相似;但是,您也能夠通過向?qū)б徊讲铰暶餍缘嘏渲每丶,啟用像編輯和顯示多頁行數(shù)據(jù)這樣的通用任務(wù)。

配置 GridView
為了說明實(shí)現(xiàn)上述功能多么輕松,請思考這個(gè)例子:根據(jù)下拉列表的選擇項(xiàng)顯示查詢結(jié)果。只需將 GridView 控件拖放到頁面上,配置控件以根據(jù)下拉列表的選擇項(xiàng)自動(dòng)顯示結(jié)果。 


按此在新窗口打開圖片
圖 5. 將 GridView 綁定到 DropDown 列表


要配置 GridView 控件,您必須通過 Configure Data Source Wizard 將它綁定到數(shù)據(jù)源。圖 6 還顯示 DataGrid 對象提供的 Enable Paging、Enable Sorting 和 Enable Selection 選項(xiàng)。

在 Configure Data Source 窗口中,選擇適當(dāng)?shù)谋砀瘢缓筮x擇所需的元素。窗口底部顯示自動(dòng)生成的 SQL 查詢語句。


按此在新窗口打開圖片
圖 6. 編輯 SQL 數(shù)據(jù)源


下一步,單擊 WHERE 按鈕,配置 GridView 中顯示的記錄的條件;在下面的窗口中選擇 patientID 列,設(shè)置操作符和源選項(xiàng)。當(dāng)源選項(xiàng)設(shè)置為 Control 時(shí),當(dāng)前頁面中的所有控件將自動(dòng)填充到 Parameter 屬性的 Control ID 字段中。從列表中選擇想要連接的控件。配置好參數(shù)和默認(rèn)值(如果需要)后,單擊 Add 按鈕,再單擊 OK 按鈕進(jìn)行確認(rèn)。


按此在新窗口打開圖片
圖 7. 查詢編輯器對話框


生成的 select 語句可通過 Configure DataSource 窗口查看。

在 ASP 和 ASP.NET 應(yīng)用程序中,必須編寫代碼完成所有這些過程,還要編寫 HTML 代碼來顯示格式化的結(jié)果。新的 GridView 控件生成了以下結(jié)果,沒有附加任何代碼(請注意,Edit 和 Delete 鏈接是自動(dòng)可見的,并注意生成的 SQL):


按此在新窗口打開圖片
圖 8. 綁定到下拉列表的 GridView 控件顯示的結(jié)果


DetailsView 控件

DetailsView 控件與 GridView 控件相似,它使用完全相同的安裝機(jī)制。GridView 控件在一頁顯示多條記錄,而 DetailsView 控件一次只顯示一條記錄。


按此在新窗口打開圖片
圖 9. 在 DetailsView 控件中顯示一條記錄


因此,DetailsView 控件與 GridView 控件形成了很好的互補(bǔ)。將 DetailsView 連接到 GridView 可以更好地控制更新個(gè)別項(xiàng)目或插入新項(xiàng)目的方式和時(shí)機(jī)。

FormView 控件

使用上述配置步驟,我們還能夠?yàn)?nbsp;ASP.NET 的開發(fā)配置另一個(gè)新控件 — FormView 控件。FormView 控件支持非常靈活的 UI 布局。下面的示例顯示使用 FormView 控件查看單個(gè)數(shù)據(jù)庫記錄。


按此在新窗口打開圖片
圖 10. FormView ItemTemplate 輸出


像 ItemTemplate 和 EditItemTemplate 這樣不同的模板用于查看和修改數(shù)據(jù)庫記錄,無需任何自定義代碼。


按此在新窗口打開圖片
圖 11. FormView EditTemplate 輸出


新增的 ASP.NET 2.0 數(shù)據(jù)功能
除了前面章節(jié)介紹的新控件,ASP.NET 2.0 還提供幾個(gè)與數(shù)據(jù)訪問有關(guān)的新功能,這些功能有助于提高數(shù)據(jù)驅(qū)動(dòng)應(yīng)用程序的性能和安全性。

性能

Web 應(yīng)用程序的性能通?梢酝ㄟ^兩種機(jī)制來改進(jìn)。首先,Web 應(yīng)用程序?qū)幽軌蚓彺姹M可能多的數(shù)據(jù),減少了不必要的數(shù)據(jù)層調(diào)用。其次,Web 應(yīng)用程序可以減少調(diào)用數(shù)據(jù)層的次數(shù)和大小。

數(shù)據(jù)源緩存

SQLDataSource 和 ObjectDataSource 支持?jǐn)?shù)據(jù)層緩存。通過設(shè)置數(shù)據(jù)源對象的一些屬性,程序員不用開發(fā)任何自定義代碼,即可使用緩存 api。數(shù)據(jù)源對象將自動(dòng)管理底層存儲(chǔ)機(jī)制的一致性。

SQL 緩存依賴關(guān)系

對大多數(shù)數(shù)據(jù)驅(qū)動(dòng)的 Web 站點(diǎn)來說,緩存數(shù)據(jù)是復(fù)雜的任務(wù)。Web 站點(diǎn)需要使用緩存來提高性能,但是更新數(shù)據(jù)的需求也很迫切。ASP.NET 1.x 能將頁面緩存一段時(shí)間,并通過輸入?yún)?shù)(QUERYSTRING 或 POST 參數(shù))進(jìn)行組織。

<%@ outputcache duration="3600" varybyparam="ProdID" %> 

以上代碼根據(jù)變量 ProdID (產(chǎn)品 id)在內(nèi)存中緩存頁面一小時(shí)。

如果在應(yīng)用程序的其他地方更新了下層數(shù)據(jù),緩存數(shù)據(jù)將出現(xiàn)問題。例如,考慮將一個(gè)產(chǎn)品目錄頁面通過產(chǎn)品 ID 進(jìn)行緩存。如果從一個(gè)管理站點(diǎn)更新產(chǎn)品信息(例如,可用數(shù)量或價(jià)格),過期數(shù)據(jù)仍保留在緩存中,并顯示給客戶。在 ASP.NET 1.x 中,必須等待緩存失效,或使用 Response.RemoveOutputCacheItem 強(qiáng)制緩存失效。

ASP.NET 2.0 通過實(shí)現(xiàn)表格級(jí) SQL 通知來支持?jǐn)?shù)據(jù)庫緩存依賴關(guān)系。更改數(shù)據(jù)時(shí),一個(gè)表格級(jí)依賴關(guān)系通知頁面。下面的代碼將產(chǎn)品頁面緩存了一小時(shí),但是向數(shù)據(jù)庫表添加了一個(gè)依賴關(guān)系。

<%@ outputcache duration="3600" varybyparam="ProdID" 
sqldependency="MyDatabase:Products" %>

向 Products 表格添加新的 SQLDependency 屬性后,不論表格發(fā)生任何更改,緩存過的頁面都將失效。SQLDependency 屬性必須引用在 web.config 文件中配置的 Microsoft SQL Server DataSource。DataSource 標(biāo)識(shí)了使依賴關(guān)系通知有效的數(shù)據(jù)庫連接和參數(shù)。

自定義 SQL 依賴關(guān)系

雖然默認(rèn)情況下 SQLDependency 類只支持 Microsoft SQL Server,但是您能夠通過 machine.config 和 web.config 文件替代和重新配置類。這個(gè)功能允許您創(chuàng)建自定義的 SQLDependency 類,為任何 DataSource(包括 Oracle、Sybase 或其他任何數(shù)據(jù)庫)提供相似的功能。

數(shù)據(jù)源緩存

在 ASP.NET 2.0 中,緩存數(shù)據(jù)的另一個(gè)方法是使用直接置入數(shù)據(jù)源的緩存機(jī)制。例如,SQLDataSource 和 ObjectDataSource 類都支持通過 EnableCaching 屬性直接緩存。只需將該屬性設(shè)置為 true,數(shù)據(jù)源將自動(dòng)緩存從數(shù)據(jù)存儲(chǔ)提取的數(shù)據(jù)。緩存將根據(jù) CacheDuration 屬性設(shè)定的時(shí)間或通過類似于頁面級(jí)指令的 SQLCacheDependency 失效。由于在數(shù)據(jù)源控件中置入了這些功能,無需編寫任何代碼,您就能快速、輕松地實(shí)現(xiàn)緩存。

改進(jìn)的 DataSet 遠(yuǎn)程處理支持

對 ASP.NET 1.1 最多的抱怨是:由于通常要將 DataSet 序列化為 XML,因此通過 .NET 遠(yuǎn)程處理發(fā)送 DataSet 比發(fā)送其他序列化二進(jìn)制表示形式慢。ASP.NET 2.0 將 DataSet 作為二進(jìn)制序列化表示形式進(jìn)行傳輸,以幫助減少 DataSet 的傳輸大小和傳遞信息所需的傳輸時(shí)間。

安全性

ASP.NET 2.0 提供的一項(xiàng)服務(wù)能夠加密配置文件的任何部分。通過加密,您能夠更安全地存儲(chǔ)應(yīng)用程序內(nèi)的信息。例如,可以加密 Web.config 文件的 ConnectionString 部分來保護(hù)所有的敏感信息。配置加密允許您安全地存儲(chǔ)像連接字符串這樣的信息。

加密配置信息時(shí),您可以使用政府標(biāo)準(zhǔn)加密算法,例如三重 DES。因?yàn)榧用軘?shù)據(jù)存儲(chǔ)在配置文件中,所以應(yīng)用程序不依賴于注冊表。

小結(jié)
ASP.NET 2.0 致力于幫助您靈活地控制數(shù)據(jù),通過在新增的數(shù)據(jù)控件中封裝功能,減少訪問數(shù)據(jù)和顯示數(shù)據(jù)所需的代碼數(shù)量。新的數(shù)據(jù)訪問模型和控件減少的數(shù)據(jù)訪問代碼多達(dá) 70%,F(xiàn)在,傳統(tǒng)的 ASP 或 ASP.NET 1.1 應(yīng)用程序中需要手動(dòng)設(shè)計(jì)的許多功能都已內(nèi)置到新的數(shù)據(jù)控件中了。數(shù)據(jù)訪問的新體系結(jié)構(gòu)也是可擴(kuò)展的,是為訪問多種不同的數(shù)據(jù)源數(shù)據(jù)而設(shè)計(jì)的,這些數(shù)據(jù)源包括數(shù)據(jù)庫、XML 文件、平面文件、數(shù)據(jù)流等等。作為一名企業(yè)級(jí)開發(fā)人員,您能夠利用新的體系結(jié)構(gòu)連接任何后端數(shù)據(jù)源,而仍然使用一個(gè)簡單的前端接口。

相關(guān)書籍

• A First Look at ASP.NET V. 2.0
 
• ASP.NET 2.0 Revealed
關(guān)鍵詞:ASP.NET

贊助商鏈接: