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