ADO.NET 概述
ADO.NET 提供對(duì) Microsoft SQL Server 等數(shù)據(jù)源以及通過 OLE DB 和 XML 公開的數(shù)據(jù)源的一致訪問。數(shù)據(jù)共享使用者應(yīng)用程序可以使用 ADO.NET 來連接到這些數(shù)據(jù)源,并檢索、操作和更新數(shù)據(jù)。
ADO.NET 有效地從數(shù)據(jù)操作中將數(shù)據(jù)訪問分解為多個(gè)可以單獨(dú)使用或一前一后使用的不連續(xù)組件。ADO.NET 包含用于連接到數(shù)據(jù)庫(kù)、執(zhí)行命令和檢索結(jié)果的 .NET 數(shù)據(jù)提供程序。您可以直接處理檢索到的結(jié)果,或?qū)⑵浞湃?ADO.NET DataSet 對(duì)象,以便與來自多個(gè)源的數(shù)據(jù)或在層之間進(jìn)行遠(yuǎn)程處理的數(shù)據(jù)組合在一起,以特殊方式向用戶公開。ADO.NET DataSet 對(duì)象也可以獨(dú)立于 .NET 數(shù)據(jù)提供程序使用,以管理應(yīng)用程序本地的數(shù)據(jù)或源自 XML 的數(shù)據(jù)。
ADO.NET 結(jié)構(gòu)
以前,數(shù)據(jù)處理主要依賴于基于連接的雙層模型。當(dāng)數(shù)據(jù)處理越來越多地使用多層結(jié)構(gòu)時(shí),程序員正在向斷開方式轉(zhuǎn)換,以便為他們的應(yīng)用程序提供更佳的可縮放性。
ADO.NET 借用 XML 的力量來提供對(duì)數(shù)據(jù)的斷開式訪問。ADO.NET 的設(shè)計(jì)與 .NET 框架中 XML 類的設(shè)計(jì)是并進(jìn)的——它們都是同一個(gè)結(jié)構(gòu)的組件。
ADO.NET 和 .NET 框架中的 XML 類集中于 DataSet 對(duì)象。無(wú)論 DataSet 是文件還是 XML 流,它都可以使用來自 XML 源的數(shù)據(jù)來進(jìn)行填充。無(wú)論 DataSet 中數(shù)據(jù)的數(shù)據(jù)源是什么,DataSet 都可以寫為符合 WWW 聯(lián)合會(huì) (W3C) 的 XML,并且將其架構(gòu)包含為 XML 架構(gòu)定義語(yǔ)言 (XSD) 架構(gòu)。由于 DataSet 固有的序列化格式為 XML,它是在層間移動(dòng)數(shù)據(jù)的優(yōu)良媒介,這使 DataSet 成為以遠(yuǎn)程方式向 XML Web services 發(fā)送數(shù)據(jù)和架構(gòu)上下文以及從 XML Web services 接收數(shù)據(jù)和架構(gòu)上下文的最佳選擇。
設(shè)計(jì) ADO.NET 組件的目的是為了從數(shù)據(jù)操作中分解出數(shù)據(jù)訪問。完成此任務(wù)的是 ADO.NET 的兩個(gè)核心組件:DataSet 和 .NET 數(shù)據(jù)提供程序,后者是一組包括 Connection、Command、DataReader 和 DataAdapter 對(duì)象在內(nèi)的組件。
ADO.NET DataSet 是 ADO.NET 的斷開式結(jié)構(gòu)的核心組件。DataSet 的設(shè)計(jì)目的很明確:為了實(shí)現(xiàn)獨(dú)立于任何數(shù)據(jù)源的數(shù)據(jù)訪問。因此,它可以用于多種不同的數(shù)據(jù)源,用于 XML 數(shù)據(jù),或用于管理應(yīng)用程序本地的數(shù)據(jù)。DataSet 包含一個(gè)或多個(gè) DataTable 對(duì)象的集合,這些對(duì)象由數(shù)據(jù)行和數(shù)據(jù)列以及主鍵、外鍵、約束和有關(guān) DataTable 對(duì)象中數(shù)據(jù)的關(guān)系信息組成。
ADO.NET 結(jié)構(gòu)的另一個(gè)核心元素是 .NET 數(shù)據(jù)提供程序,其組件的設(shè)計(jì)目的相當(dāng)明確:為了實(shí)現(xiàn)數(shù)據(jù)操作和對(duì)數(shù)據(jù)的快速、只進(jìn)、只讀訪問。Connection 對(duì)象提供與數(shù)據(jù)源的連接。Command 對(duì)象使您能夠訪問用于返回?cái)?shù)據(jù)、修改數(shù)據(jù)、運(yùn)行存儲(chǔ)過程以及發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫(kù)命令。DataReader 從數(shù)據(jù)源中提供高性能的數(shù)據(jù)流。最后,DataAdapter 提供連接 DataSet 對(duì)象和數(shù)據(jù)源的橋梁。DataAdapter 使用 Command 對(duì)象在數(shù)據(jù)源中執(zhí)行 SQL 命令,以便將數(shù)據(jù)加載到 DataSet 中,并使對(duì) DataSet 中數(shù)據(jù)的更改與數(shù)據(jù)源保持一致。
可以為任何數(shù)據(jù)源編寫 .NET 數(shù)據(jù)提供程序。.NET 框架附帶了兩個(gè) .NET 數(shù)據(jù)提供程序:SQL Server .NET 數(shù)據(jù)提供程序和 OLE DB .NET 數(shù)據(jù)提供程序。
下圖闡釋了 ADO.NET 結(jié)構(gòu)的組件。
ADO.NET DataSet
DataSet 對(duì)象是支持 ADO.NET 的斷開式、分布式數(shù)據(jù)方案的核心對(duì)象。DataSet 是數(shù)據(jù)的內(nèi)存駐留表示形式,無(wú)論數(shù)據(jù)源是什么,它都會(huì)提供一致的關(guān)系編程模型。它可以用于多個(gè)不同的數(shù)據(jù)源,用于 XML 數(shù)據(jù),或用于管理應(yīng)用程序本地的數(shù)據(jù)。DataSet 表示包括相關(guān)表、約束和表間關(guān)系在內(nèi)的整個(gè)數(shù)據(jù)集。
下圖將顯示 DataSet 對(duì)象模型。
DataSet 中的方法和對(duì)象與關(guān)系數(shù)據(jù)庫(kù)模型中的方法和對(duì)象一致。
DataSet 也可以按 XML 的形式來保持和重新加載其內(nèi)容,并按 XML 架構(gòu)定義語(yǔ)言 (XSD) 架構(gòu)的形式來保持和重新加載其架構(gòu)。
使用 ADO.NET 提供的通用接口,您可以編寫一組在使用任何 .NET 數(shù)據(jù)提供程序時(shí)都將運(yùn)行的代碼。
當(dāng)編寫將用于多個(gè) .NET 數(shù)據(jù)提供程序的代碼時(shí),請(qǐng)?zhí)貏e注意所使用的任何提供程序特定的語(yǔ)法。例如,根據(jù)您所訪問的數(shù)據(jù)源,SQL 語(yǔ)法將有所不同。當(dāng)更改為一個(gè)不同的 .NET 數(shù)據(jù)提供程序時(shí),如果將 SQL 命令隔離為字符串常數(shù),則將使代碼更易于維護(hù)。
另外,務(wù)必要保持在代碼中創(chuàng)建參數(shù)的順序。對(duì)于 SQL Server .NET 數(shù)據(jù)提供程序,參數(shù)使用名稱來標(biāo)識(shí),因此參數(shù)順序并不重要。但是,OLE DB .NET 數(shù)據(jù)提供程序會(huì)按照參數(shù)添加到參數(shù)集合中的順序來分配參數(shù)值。因此,最好始終保持參數(shù)在代碼中的順序。
下面是C#的示例代碼:
[C#]
// You can use either:
// IDbConnection myConn = new SqlConnection();
// or:
// IDbConnection myConn = new OleDbConnection();
IDbCommand myCommand = myConn.CreateCommand();
myCommand.CommandText = "SELECT * FROM Customers";
IDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
Console.WriteLine("{0}\t{1}", myReader.GetString(0), myReader.GetString(1));
創(chuàng)建和使用 DataSet
ADO.NET DataSet 是數(shù)據(jù)的一種內(nèi)存駐留表示形式,無(wú)論它包含的數(shù)據(jù)來自什么數(shù)據(jù)源,它都會(huì)提供一致的關(guān)系編程模型。一個(gè) DataSet 表示整個(gè)數(shù)據(jù)集,其中包含對(duì)數(shù)據(jù)進(jìn)行包含、排序和約束的表以及表間的關(guān)系。
使用 DataSet 的方法有若干種,這些方法可以單獨(dú)應(yīng)用,也可以結(jié)合應(yīng)用。您可以:
在 DataSet 中以編程方式創(chuàng)建 DataTables、DataRelations 和 Constraints 并使用數(shù)據(jù)填充這些表。
通過 DataAdapter 用現(xiàn)有關(guān)系數(shù)據(jù)源中的數(shù)據(jù)表填充 DataSet。
創(chuàng)建 DataSet
可以通過調(diào)用 DataSet 構(gòu)造函數(shù)來創(chuàng)建 DataSet 的實(shí)例。請(qǐng)指定一個(gè)可選名稱參數(shù)。如果沒有為 DataSet 指定名稱,則該名稱會(huì)設(shè)置為“NewDataSet”。
也可以基于現(xiàn)有的 DataSet 來創(chuàng)建新的 DataSet。新的 DataSet 可以是:現(xiàn)有 DataSet 的原樣副本;DataSet 的復(fù)本,它復(fù)制關(guān)系結(jié)構(gòu)(即架構(gòu))但不包含現(xiàn)有 DataSet 中的任何數(shù)據(jù);或 DataSet 的子集,它僅包含現(xiàn)有 DataSet 中已使用 GetChanges 方法修改的行。
以下代碼示例演示如何構(gòu)造 DataSet 的實(shí)例。
[C#]
DataSet custDS = new DataSet("CustomerOrders");
向 DataSet 添加 DataTable
ADO.NET 使您能夠創(chuàng)建 DataTable 對(duì)象并將其添加到現(xiàn)有 DataSet 中??梢允褂靡砑拥?DataTable 的 Columns 集合中的 DataColumn 對(duì)象的 PrimaryKey 和 Unique 屬性來設(shè)置 DataTable 的約束信息。
以下示例構(gòu)造一個(gè) DataSet,將一個(gè)新的 DataTable 對(duì)象添加到該 DataSet 中,然后將三個(gè) DataColumn 對(duì)象添加到該表中。最后,該代碼將一個(gè)列設(shè)置為主鍵列。
[C#]
DataSet custDS = new DataSet("CustomerOrders");
DataTable ordersTable = custDS.Tables.Add("Orders");
DataColumn pkCol = ordersTable.Columns.Add("OrderID", typeof(Int32));
ordersTable.Columns.Add("OrderQuantity", typeof(Int32));
ordersTable.Columns.Add("CompanyName", typeof(string));
ordersTable.PrimaryKey = new DataColumn[] {pkCol};
創(chuàng)建和使用數(shù)據(jù)表
DataSet 由表、關(guān)系和約束的集合組成。在 ADO.NET 中,DataTable 對(duì)象用于表示 DataSet 中的表。DataTable 表示一個(gè)內(nèi)存內(nèi)關(guān)系數(shù)據(jù)的表;數(shù)據(jù)對(duì)于它駐留于其中的基于 .NET 的應(yīng)用程序來說是本地?cái)?shù)據(jù),但可從數(shù)據(jù)源(例如,使用 DataAdapter 的 Microsoft® SQL Server)中導(dǎo)入。
DataTable 類是“.NET 框架類庫(kù)”中 System.Data 命名空間的成員。您可以獨(dú)立創(chuàng)建和使用 DataTable,或者可以將其用作 DataSet 的成員,而且 DataTable 對(duì)象也可以與其他 .NET 框架對(duì)象(包括 DataView)一起使用。您可以通過 DataSet 對(duì)象的 Tables 屬性來訪問 DataSet 中表的集合。
表的架構(gòu)或結(jié)構(gòu)由列和約束表示。使用 DataColumn 對(duì)象以及 ForeignKeyConstraint 和 UniqueConstraint 對(duì)象定義 DataTable 的架構(gòu)。表中的列可以映射到數(shù)據(jù)源中的列、包含從表達(dá)式計(jì)算所得的值、自動(dòng)遞增它們的值,或包含主鍵值。
除架構(gòu)以外,DataTable 還必須具有行,在其中包含數(shù)據(jù)并對(duì)數(shù)據(jù)排序。DataRow 類表示表中包含的實(shí)際數(shù)據(jù)。DataRow 及其屬性和方法用于檢索、計(jì)算和操作表中的數(shù)據(jù)。在訪問和更改行中的數(shù)據(jù)時(shí),DataRow 對(duì)象會(huì)維護(hù)其當(dāng)前狀態(tài)和原始狀態(tài)。
您可以使用表中的一個(gè)或多個(gè)相關(guān)的列來創(chuàng)建表與表之間的父子關(guān)系。DataTable 對(duì)象之間的關(guān)系可使用 DataRelation 來創(chuàng)建。然后,DataRelation 對(duì)象可用于返回某特定行的相關(guān)子行或父行。
創(chuàng)建數(shù)據(jù)表
DataTable 表示一個(gè)內(nèi)存內(nèi)關(guān)系數(shù)據(jù)的表,可以獨(dú)立創(chuàng)建和使用,也可以由其他 .NET 框架對(duì)象使用,最常見的情況是作為 DataSet 的成員使用。
DataTable 對(duì)象可通過使用 DataTable 構(gòu)造函數(shù)來創(chuàng)建,或者可通過將構(gòu)造函數(shù)參數(shù)傳遞到 DataSet 的 Tables 屬性的 Add 方法(它是一個(gè) DataTableCollection)來創(chuàng)建。
DataTable 對(duì)象可通過使用 DataAdapter 對(duì)象的 Fill 方法或 FillSchema 方法在 DataSet 內(nèi)創(chuàng)建,或者可使用 DataSet 的 ReadXml、ReadXmlSchema 或 InferXmlSchema 方法從預(yù)定義的或推斷的 XML 架構(gòu)中創(chuàng)建。請(qǐng)注意,將 DataTable 添加為一個(gè) DataSet 的 Tables 集合的成員后,不能再將其添至任何其他 DataSet 的表的集合。
最初創(chuàng)建 DataTable 時(shí),它是沒有架構(gòu)(結(jié)構(gòu))的。要定義表的架構(gòu),必須創(chuàng)建 DataColumn 對(duì)象并將其添至表的 Columns 集合。您也可以為表定義主鍵列,而且可以創(chuàng)建 Constraint 對(duì)象并將其添至表的 Constraints 集合。在為 DataTable 定義了架構(gòu)之后,可通過將 DataRow 對(duì)象添至表的 Rows 集合來將數(shù)據(jù)行添加到表。
創(chuàng)建 DataTable 時(shí),不需要為 TableName 屬性提供值,您可以在其他時(shí)間指定屬性,或者將其保留為空。但是,在將沒有 TableName 值的表添至 DataSet 時(shí),該表就會(huì)得到一個(gè)遞增的默認(rèn)名稱 TableN,此名稱以“Table”開頭,從 Table0 開始。
注意 建議您在提供 TableName 值時(shí)避免使用“Table”或“TableN”的命名規(guī)則,因?yàn)槟峁┑拿Q可能會(huì)與 DataSet 中現(xiàn)有的默認(rèn)表名稱沖突。如果提供的名稱已經(jīng)存在,將引發(fā)異常。
以下示例創(chuàng)建 DataTable 對(duì)象的實(shí)例,并為其指定名稱“Customers”。
[C#]
DataTable workTable = new DataTable("Customers");
以下示例創(chuàng)建 DataTable 實(shí)例,方法是:將其添至 DataSet 的 Tables 集合。
[C#]
DataSet custDS = new DataSet();
DataTable custTable = custDS.Tables.Add("CustTable");
創(chuàng)建和使用 DataView
DataView 使您能夠創(chuàng)建 DataTable 中所存儲(chǔ)的數(shù)據(jù)的不同視圖,這種功能通常用于數(shù)據(jù)綁定應(yīng)用程序。使用 DataView,您可以公開表中具有不同排序順序的數(shù)據(jù),并且可以按行狀態(tài)或基于篩選器表達(dá)式來篩選數(shù)據(jù)。
DataView 提供數(shù)據(jù)的動(dòng)態(tài)視圖,其內(nèi)容、排序和成員關(guān)系會(huì)實(shí)時(shí)反映對(duì)基礎(chǔ) DataTable 的更改。它不同于 DataTable 的 Select 方法,后者從表中按特定的篩選器和/或排序順序返回 DataRow 數(shù)組,雖然其內(nèi)容反映對(duì)基礎(chǔ)表的更改,但其成員關(guān)系和排序卻則保持靜態(tài)。DataView 的動(dòng)態(tài)功能使其成為數(shù)據(jù)綁定應(yīng)用程序的理想選擇。
與數(shù)據(jù)庫(kù)提供的視圖類似,DataView 為您提供了可向其應(yīng)用不同排序和篩選條件的單個(gè)數(shù)據(jù)集的動(dòng)態(tài)視圖。但是,DataView 和數(shù)據(jù)庫(kù)視圖之間相當(dāng)不同的一點(diǎn)在于 DataView 不能作為表來進(jìn)行處理,并且不能提供聯(lián)接表的視圖。另外,還不能排除存在于源表中的列,也不能追加不存在于源表中的列(如計(jì)算列)。
可以使用 DataViewManager 來管理 DataSet 中所有表的視圖設(shè)置。DataViewManager 為您提供了一種方便的方法來管理每個(gè)表的默認(rèn)視圖設(shè)置。在將一個(gè)控件綁定到 DataSet 的多個(gè)表時(shí),綁定到 DataViewManager 是理想的選擇。
創(chuàng)建 DataView
創(chuàng)建 DataView 的方法有兩種??梢允褂?DataView 構(gòu)造函數(shù),也可以創(chuàng)建對(duì) DataTable 的 DefaultView 屬性的引用。DataView 構(gòu)造函數(shù)可以為空,也可以通過單個(gè)參數(shù)的形式采用 DataTable 或者同時(shí)采用 DataTable 與篩選條件、排序條件和行狀態(tài)篩選器。有關(guān)可與 DataView 一起使用的附加參數(shù)的更多信息。
由于在創(chuàng)建 DataView 時(shí)以及在修改任何 Sort、RowFilter 或 RowStateFilter 屬性時(shí)都會(huì)生成 DataView 的索引,所以當(dāng)創(chuàng)建 DataView 時(shí),通過以構(gòu)造函數(shù)參數(shù)的形式提供任何初始排序順序或篩選條件,將實(shí)現(xiàn)最佳性能。如果在不指定排序或篩選條件的情況下創(chuàng)建 DataView,然后設(shè)置 Sort、RowFilter 或 RowStateFilter 屬性,則會(huì)使索引生成至少二次:一次是在創(chuàng)建 DataView 時(shí),另一次是在修改任何排序或篩選屬性時(shí)。
請(qǐng)注意,如果使用不采用任何參數(shù)的構(gòu)造函數(shù)來創(chuàng)建 DataView,那么在設(shè)置 Table 屬性之前,將無(wú)法使用 DataView。
以下代碼示例演示如何使用 DataView 構(gòu)造函數(shù)來創(chuàng)建 DataView。RowFilter、Sort 列和 DataViewRowState 將與 DataTable 一起提供。
[C#]
DataView custDV = new DataView(custDS.Tables["Customers"],
"Country = ‘USA‘",
"ContactName",
DataViewRowState.CurrentRows);
以下代碼演示如何使用該表的 DefaultView 屬性獲取對(duì) DataTable 的默認(rèn) DataView 的引用。
[C#]
DataView custDV = custDS.Tables["Customers"].DefaultView;
總結(jié)
上面是VS.NET中ADO.NET的一些主要的特性,給大家參考一下。有任何建議請(qǐng)MAIL我
paulni@citiz.net。