ADO.NET

ADO.NET的前身：ADO+

1998年起，因為Web應用程式的竄起，大大改變了許多應用程式的設計方式，傳統的資料庫連線儲存設計法無法適用於此類應用程式，這讓ADO應用程式遇到了很大的瓶頸，也讓微軟開始思考讓資料集（Resultset，在ADO中稱為Recordset）能夠離線化的能力，以及能在用戶端建立一個小型資料庫的概念，這個概念就是ADO.NET中離線型資料模型（disconnected data model）的基礎，而在ADO的使用情形來看，資料庫連線以及資源耗用的情形較嚴重（像是Server-side cursor或是Recordset.Open會保持連線狀態），在ADO.NET中也改良了這些物件，構成了能夠減少資料庫連線和資源使用量的功能。XML的使用也是這個版本的重要發展之一。
2000年，微軟的Microsoft .NET計畫開始成形，許多的微軟產品都冠上.NET的標籤，ADO+也不例外，改名為ADO.NET，並包裝到.NET Framework類別庫中，成為.NET平台中唯一的資料存取元件。

架構

ADO.NET由連線資料來源（connected data source）以及離線資料模型（disconnected data model）兩個部份構成，這兩個部份是相輔相成的。

XML的整合

XML在ADO.NET中扮演了相當重要的地位，DataSet和DataTable都可以轉換成XML或和XML之間交換資料，在DataTable的內部資料的變更記錄，可以被輸出到一個XML的格式，用來識別變更的情形，這個格式稱為DiffGram，而且它可以直接讀入DataTable之中（使用DataTable.ReadXml（）並用XmlReadMode.DiffGram當參數）。一個典型的DiffGram如下：
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
  <CustomerDataSet>
    <Customers diffgr:id="Customers1" msdata:rowOrder="0" diffgr:hasChanges="modified">
      <CustomerID>ALFKI</CustomerID>
      <CompanyName>New Company</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers2" msdata:rowOrder="1" diffgram:hasErrors="true">
      <CustomerID>ANATR</CustomerID>
      <CompanyName>Ana Trujillo Emparedados y Helados</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers3" msdata:rowOrder="2">
      <CustomerID>ANTON</CustomerID>
      <CompanyName>Antonio Moreno Taquera</CompanyName>
    </Customers>
    <Customers diffgr:id="Customers4" msdata:rowOrder="3">
      <CustomerID>AROUT</CustomerID>
      <CompanyName>Around the Horn</CompanyName>
    </Customers>
  </CustomerDataSet>
  <diffgr:before>
    <Customers diffgr:id="Customers1" msdata:rowOrder="0">
      <CustomerID>ALFKI</CustomerID>
      <CompanyName>Alfreds Futterkiste</CompanyName>
    </Customers>
  </diffgr:before>
  <diffgr:errors>
    <Customers diffgr:id="Customers2" diffgr:Error="An optimistic concurrency violation has occurred for this row."/>
  </diffgr:errors></diffgr:diffgram>
DataSet與DataTable也支援直接讀入XML Schema建立結構的能力，以及自行依XML的內容推斷（inference）其結構的能力，下列程式碼為由XML推斷結構的程式：
DataSet dataSet = new DataSet();dataSet.InferXmlSchema（"input_od.xml", new string[] "urn:schemas-microsoft-com:officedata"）;
DataSet和DataTable可以使用XmlDataDocument類別和XML DOM整合在一起，XmlDataDocument的角色就像一個橋接介面，並且作為DataSet和DataTable可使用XPath與XML DOM方式存取的方法。下列程式碼即為使用XmlDataDocument和資料庫中資料轉換為XSLT輸出的範例：
// Assumes connection is a valid SqlConnection.connection.Open();DataSet custDS = new DataSet("CustomerDataSet");SqlDataAdapter customerAdapter = new SqlDataAdapter(
  "SELECT * FROM Customers", connection);customerAdapter.Fill(custDS, "Customers");SqlDataAdapter orderAdapter = new SqlDataAdapter(
  "SELECT * FROM Orders", connection);orderAdapter.Fill(custDS, "Orders");connection.Close();custDS.Relations.Add("CustOrders",
  custDS.Tables["Customers"].Columns["CustomerID"]，
                     custDS.Tables["Orders"].Columns["CustomerID"]).Nested = true;XmlDataDocument xmlDoc = new XmlDataDocument (custDS); 

XslTransform xslTran = new XslTransform();xslTran.Load（"transform.xsl"）;XmlTextWriter writer = new XmlTextWriter("xslt_output.html", 
  System.Text.Encoding.UTF8);xslTran.Transform(xmlDoc, null, writer);writer.Close();
在.NET Framework中，DataSet被分為兩類，一種是不會強制使用特別型態的DataSet，稱為Untyped DataSet，使用上較方便，但沒有強制的型別限制，另一種則是Typed DataSet，會強制型別，並且是由自訂的XML Schema所產生，Untyped DataSet則沒有XML Schema，由建立時的結構來決定，Typed DataSet可以用Visual Studio，或者是SDK工具中的xsd.exe來產生。
xsd.exe /d /l:CS XSDSchemaFileName.xsd /eld /n:XSDSchema.Namespace
產生出來的Typed DataSet會自動將欄位設定成屬性，讓開發人員的存取更方便（這個功能在TableAdapter相當常見）。
CustomerDataSet customers = new CustomerDataSet();SqlDataAdapter adapter = new SqlDataAdapter(
  "SELECT * FROM dbo.Customers;",
  "Data Source=(local);Integrated " +
  "Security=SSPI;Initial Catalog=Northwind");adapter.Fill(customers, "Customers");foreach(CustomerDataSet.CustomersRow customerRow in customers.Customers)
  Console.WriteLine(customerRow.CustomerID);

Visual Studio的支援

ADO.NET和Visual Studio開發工具幾乎已經是無縫的整合了，開發人員可以利用Visual Studio來建立強型別（strong-typed）的DataSet，到了Visual Studio 2005時更能夠在Windows Forms應用程式中使用TableAdapter（Typed DataSet和DataAdapter整合的產物）來開發應用程式（不會再看到DataAdapter，但使用上差不多）。Visual Studio在建立Typed DataSet時有提供視覺化介面的支援，以及資料庫組態精靈（Database Configuration Wizard）來讓開發人員以簡單的設定方式來建立DataSet，部份開發人員也將TableAdapter和ASP.NET應用程式的ObjectDataSource控制項並用，亦得到不錯的效果。
在.NET Framework 3.5中，微軟特別為了DataSet和DataTable建立了LINQ Provider（稱為LINQ to DataSet或LINQ to ADO.NET），讓LINQ可以在DataSet或DataTable上使用，可以讓原本在DataSet上的投資（程式碼）得以繼續使用並享有LINQ的便利性。

ADO.NET和ADO的差異

對於ADO的開發人員來說，最明顯的變化在於以往ADO中的Recordset消失了，並且明確的分開為連線型的DataReader以及離線型的DataSet與DataTable，並且發展支援離線型資料來源的瀏覽工具DataView，這樣的改變，讓習慣使用ADO的VB/ASP開發人員會有某種程度的不習慣，同時讓ADO.NET的學習會較ADO有較些許的複雜性，因此有部份新入門或是VB 6.0/ASP開發人員會在學習.NET Framework或是使用VB.NET開發應用程式時，在.NET Framework中使用ADO來連接資料來源。但在.NET Framework應用程式使用ADO的話，.NET Framework會因為要多一層ADO的COM與VB.NET使用的.NET之間的資料轉換，會讓應用程式效能有少部份的損耗。
下述範例，用ADO讀取一個資料庫中的表格，然後轉為ADO.Net的資料，最後繫結到DataGridView控制項中去顯示：
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        cn = New ADODB.Connection
        rs = New ADODB.Recordset
        cn.Provider = "Microsoft.ACE.OLEDB.12.0;"
        cn.ConnectionString = "D:\\budget2016.accdb;"
        cn.Open()

        'check whether the serial num exists in table cutter
        Dim sSQL As String = "SELECT * FROM tPassword" 
        rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs.Open(sSQL, cn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockReadOnly,_ 
                 ADODB.CommandTypeEnum.adCmdText)

        Dim da As New System.Data.OleDb.OleDbDataAdapter()
        Dim ds As New DataSet()
        da.Fill(ds, rs, "tPassword")

        'rs.Close()  'Cannot close 
        rs.ActiveConnection = Nothing
        cn.Close()
        rs = Nothing
        cn = Nothing

        DataGridView1.DataSource = (ds.Tables("tPassword"))
ADO的RecordSet，相當於在客戶機或伺服器的一個邏輯上的資料表格，使用者可以通過cursor來定位/讀寫目前行，但不能重新對這些行重新排序，也不能對客戶機上的多個RecordSet資料執行跨表的連接（join）查詢。ADO.Net針對上述缺點，在客戶機上實現了DataTable與DataSet，這是客戶機記憶體中的一套（多個）資料表格，可以對其執行各種單表或多表的查詢、修改、刪除操作，既可以使用SQL語句，也可以使用LINQ子語言。
ADO與ADO.Net的共同點，在其內部都是使用SQL語句來對後台資料庫操作。
內在實現上，ADO是基於COM技術，因此變體類型（Variant）無處不在，這是一種通用、萬能類型；而ADO.Net是強型別的，並很好地支援資料庫元資料與XML功能。

ADO.NET的進化

隨著網路應用程式的進化，ADO.NET也隨之做了許多的改變，但不變的是，ADO.NET的基礎提供了強固的發展支援，這些進化的技術都是植基於ADO.NET的核心元件而來。
長久以來，程式設計師和資料庫總是保持著一種微妙的關係，在商用應用程式中，資料庫一定是不可或缺的元件，這讓程式設計師一定要為了連接與存取資料庫而去學習SQL指令，因此在資訊業中有很多人都在研究如何將程式設計模型和資料庫整合在一起，物件關聯對應（Object-Relational Mapping）的技術就是由此而生，像Hibernate或NHibernate都是這個技術下的產物，而微軟雖然有了ADO.NET這個資料存取的利器，但卻沒有像NHibernate這樣的物件對應工具，因此微軟在.NET Framework 2.0發展時期，就提出了一個ObjectSpace的概念，ObjectSpace可以讓應用程式可以用完全物件化的方法連接與存取資料庫，其技術概念與NHibernate相當類似，然而ObjectSpace專案相當大，在.NET Framework 2.0完成時仍無法全部完成，因此微軟將ObjectSpace納入下一版本的.NET Framework中，並且再加上一個設計的工具（Designer），構成了現在的ADO.NET Entity Framework。
Entity Framework利用了抽象化資料結構的方式，將每個資料庫物件都轉換成應用程式物件（entity），而資料欄位都轉換為屬性（property），關聯則轉換為結合屬性（association），讓資料庫的E/R模型完全的轉成物件模型，如此讓程式設計師能用最熟悉的程式語言來呼叫存取。而在抽象化的結構之下，則是高度整合與對應結構的概念層、對應層和儲存層，以及支援Entity Framework的資料提供者（provider），讓資料存取的工作得以順利與完整的進行。
以往在發展像是AJAX應用程式時，伺服端總是需要設計一個HTTP介面埠（end point），通常都會使用Web Service來實作，但是隨著Mashup應用程式的成長，若每次都要為一份（或一組）資料撰寫Web Service或HTTP end point的話，對開發人員也是不小的負擔，而且Web Service只支援XML/SOAP的資料格式，無法相容於Mashup應用程式常用的JSON資料格式，微軟也發現未來的Silverlight應用程式也是會面臨到相同問題。
當時剛好微軟的ADO.NET Entity Framework也正在開發中，它的EDM能力剛好可以提供給WCF資料存取的能力，因此微軟特別以ADO.NET Entity Framework為基礎，開發一個專門提供HTTP端點資料服務的資料供應層，即為WCF Data Services。