ADO.NET 概述
ADO.NET是改進的ADO數據訪問模型用於開發可擴展應用程序。他是專門為可伸縮性、無狀態和XML核心的web而設計的。
ADO.NET使用一些ADO對象,如Connection和Command對象,也引入了一些新對象。關鍵的新對象包括DataSet,DataReader,和DataAdapter。
這種改進的ADO.NET和之前的數據架構的重要區別在於存在一個對象--DataSet對象--這是獨立的不同於任何的數據存儲。正因為如此,DataSet功能能夠作為獨立的實體。你可以將DataSet理解為總是斷開連接對他包含的數據源和目標一無所知的記錄集,在DataSet內部,就像一個數據庫一樣,有表,列,關系,約束,視圖等等。
DataAdapter是一種連接到數據庫來填充DataSet的對象。然后,連接回數據庫更新數據,基於DatSet擁有數據的操作操作。在過去,數據處理一直是基於連接的。現在,為了使多層應用更高效,數據處理正在轉向基於消息的方式。這種處理方式的核心是DataAdapter,提供了在DataSet和數據源之間用於檢索和保存數據的橋梁。它是通過對數據存儲請求正確的SQL指令實現的。
基於XML的DataSet對象提供了一個統一的編程模型,以至於適用於所有的數據存儲:結構型,關系型,和層級型。他是通過對數據源“一無所知”,並且用他持有的集合和數據類型表示數據做到的。無論DataSet內部是什么數據源,都是通過調用同一套標准API暴露DataSet和相關對象的。
當DataSet對數據源不可知的時候,托管提供程序享有詳盡的具體信息。托管提供程序的作用是連接,填充,並從數據存儲持久化DataSet。OLE DB和SQL Server .NET框架部分的數據提供程序(System.Data.OleDb和System.Data.SqlClient)提供了四個基本對象:Command對象,Connection對象,DataReader對象和DataAdapter對象。在本文剩下的內容里,我們會遇到DataSet的每個部分,並且解釋OLE DB/SQL Server .NET數據提供程序是什么,以及如何使用它們進行編碼。
下面的章節會
給你
介紹一些改進后的對象,和一些新的對象。這些對象是:
- Connections. 用於連接和管理針對數據庫的事務。
- Commands. 用於發出針對數據庫的SQL指令。
- DataReaders. 用於從SQL Server數據源讀取只進流的數據記錄。
- DataSets. 用於針對結構型數據,XML數據和關系型數據的存儲,遠程處理和編程。
- DataAdapters. 用於推送數據到DataSet,並針對數據庫協調數據。
注意:當處理數據庫連接的時候,有兩種不同的選項:SQL Server .NET 數據提供程序(System.Data.SqlClient)和OLE DB .NET 數據提供程序(System.Data.OleDb)。在這些實例中我們會使用SQL Server .NET數據提供程序。這些被直接寫入Microsoft SQL Server。OLE DB .NET數據提供程序常用於任一OLE DB 提供者(它使用OLE DB)
Connections
Connections用於和數據庫“溝通”,並且被聲明為特定的提供程序級別,例如SQLConnection。Commands掃描連接然后結果集以流的形式被返回,這種流可以被DataReader對象讀取,或者推入DataSet對象。
下面的例子演示了如何創建一個連接對象。Connections可以通過調用Open方法被顯式打開,或者使用DataAdapter的時候被隱式打開。
Connections用於和數據庫“溝通”,並且被聲明為特定的提供程序級別,例如SQLConnection。Commands掃描連接然后結果集以流的形式被返回,這種流可以被DataReader對象讀取,或者推入DataSet對象。
下面的例子演示了如何創建一個連接對象。Connections可以通過調用Open方法被顯式打開,或者使用DataAdapter的時候被隱式打開。
若要確保連接始終關閉,請在 using 塊內部打開連接,如下面的代碼段所示。 這樣可確保在代碼退出代碼塊時自動關閉連接。
using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // Do work here; connection closed on following line. }
Commands
Commands包含提交到數據庫的信息,特定於提供程序的類比如SQLCommand。一個命令可以是一個存儲過程調用,一個UPDATE語句,或者一個返回結果的語句。你也可以使用輸入和輸出參數,返回值作為命令的一部分。下面的示例演示了如何
對Northwind數據庫
執行一條INSERT語句。
下面的示例創建一個 SqlConnection、一個 SqlCommand 和一個 SqlDataReader。 該示例讀取所有數據,並將其寫到控制台。 最后,示例在退出 Using 代碼塊時先后關閉 SqlDataReader 和 SqlConnection。
private static void ReadOrderData(string connectionString) { string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;"; using (SqlConnection connection = new SqlConnection( connectionString)) { SqlCommand command = new SqlCommand( queryString, connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); try { while (reader.Read()) { Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1])); } } finally { // Always call Close when done reading. reader.Close(); } } }
DataReaders
DataReader對象有點類似一種只讀/只進的數據游標。DataReader API不但支持平級數據而且支持層級數據。數據庫執行一條命令后會返回一個DataReader對象。返回的DataReader對象格式不同於一個記錄集。比如,你可以在一個web頁面使用DataReader顯示搜索結果列表。
下面的示例創建一個 SqlConnection、一個 SqlCommand 和一個 SqlDataReader。 該示例讀取全部數據,並將這些數據寫到控制台窗口。 隨后此代碼關閉 SqlDataReader。 SqlConnection 在 using 代碼塊的結尾處自動關閉。
using System; using System.Data; using System.Data.SqlClient; class Program { static void Main() { string str = "Data Source=(local);Initial Catalog=Northwind;" + "Integrated Security=SSPI"; ReadOrderData(str); } private static void ReadOrderData(string connectionString) { string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(queryString, connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); // Call Read before accessing data. while (reader.Read()) { ReadSingleRow((IDataRecord)reader); } // Call Close when done reading. reader.Close(); } } private static void ReadSingleRow(IDataRecord record) { Console.WriteLine(String.Format("{0}, {1}", record[0], record[1])); } }
DataSets and DataAdapters
DataSets
DataSet對象和ADO RecordSet對象相似,但更強大,並且有一個重要區別:DataSet總是斷開連接的。DataSet代表緩存數據,與數據庫結構類似例如表,列,關系,和約束。然而,盡管DataSet可以也確實表現的更像一個數據庫,最重要的請記住DataSet對象不直接和數據庫交互,或者其他數據源。這使得開發人員無論使用什么數據源都可以始終使用一種一致的編程模型。數據從數據庫,XML文件來,或者從用戶輸入來都可以放進DatSet對象。然后,當更改DataSet就可以被跟蹤和驗證之前更新數據源。DataSe
t
對象的GetChanges方法實際上創建了第二個僅包含更改數據的DataSet。然后由DataAdapter(或其他對象)使用這個DataSet來更新原始數據源。
DataSet具備XML的特性,包括生產和消費XML數據和XML模式的能力。XML模式可以用來描述通過XML Web服務交換的模式。事實上,模式化DataSet實際上可以被編譯為類型安全和完整的語句。
DataAdapters (OLEDB/SQL)
DataAdapter對象作為DataSet和數據源之間的橋梁。當使用Microsoft SQL Server數據庫時,利用特定提供程序SqlDataAdapter(和他相關的SqlCommand和SqlConnection)可以提高整體的性能。對於其他支持OLE DB的數據庫,你可以使用OleDbDataAdapter和他先關的OleDbCommand和OleDbConnection對象。
DataAdapter對象使用命令在DataSet完成變動后更新數據源。使用DataAdapter的Fill方法調用SELECT命令;使用Update方法對於每個更改行調用INSERT、UPDATE或者DELETE命令。你可以顯示設置這些命令以便在運行時控制這些語句的使用解決變更,包括使用存儲過程。對於特別的場景,CommandBuilder對象可以在運行時基於select語句生成這些語句。然而,運行時創建語句需要
在服務器做
額外的往返以便手機必須的源數據,所以在設計階段顯示的提供INSERT、UPDATE、和DELETE命令會導致更好的運行時性能。
下面的示例使用 SqlCommand、SqlDataAdapter 和 SqlConnection 從數據庫中選擇記錄,並用選定的行填充 DataSet。 然后返回已填充的 DataSet。 為完成此任務,向該方法傳遞一個已初始化的 DataSet、一個連接字符串和一個查詢字符串,后者是一個 Transact-SQL SELECT 語句。
private static DataSet SelectRows(DataSet dataset, string connectionString,string queryString) { using (SqlConnection connection = new SqlConnection(connectionString)) { SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = new SqlCommand( queryString, connection); adapter.Fill(dataset); return dataset; } }
適應的記錄映射到相應的命令。

圖示:DataAdapter和DataSets
下面的示例說明了通過SELECT語句加載DataAdapter,然后在DataSet內部更新、刪除以及添加一些記錄。最后,通過DataAdapter返回那些對數據庫源的更新。這些構造的DeleteCommand、InsertCommand與UpdateCommand被顯示在頁面。也舉例說明了使用多個DataAdapter對象加載多個表(Customers和Orders)到DataSet。
小結:
- ADO.NET是適合於.NET框架的改進版的ADO。
- ADO.NET是在多層架構、無狀態性與XML的情況下誕生的。DataSet和DataAdapter2個對象提供這些場景。
- ADO.NET可以被用於從流獲取數據,或者緩存用於更新的數據。
- 在文檔里有更多關於ADO.NET的資料。
- 請記住,你可以直接對數據庫執行命令以便插入、更新,與刪除數據。你沒有必要為了插入、更新、或刪除數據把它放入DataSet。
- 同樣,你可以使用DataSet綁定到數據,瀏覽數據,以及操作數據關聯。
原文地址:
http://quickstarts.asp.net/QuickStartv20/howto/doc/adoplus/overviewcontents.aspx