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的時候被隱式打開。
若要確保鏈接始終關閉,請在 using 塊內部打開鏈接,以下面的代碼段所示。 這樣可確保在代碼退出代碼塊時自動關閉鏈接。web
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// Do work here; connection closed on following line.
}
Commands
Commands包含提交到數據庫的信息,特定於提供程序的類好比SQLCommand。一個命令能夠是一個存儲過程調用,一個UPDATE語句,或者一個返回結果的語句。你也可使用輸入和輸出參數,返回值做爲命令的一部分。下面的示例演示瞭如何
對Northwind數據庫
執行一條INSERT語句。
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顯示搜索結果列表。
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命令會致使更好的運行時性能。
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。
小結: