ADO.NET 是在用于直接满足用户开发可伸缩应用程序需求的 ADO 数据访问模型的基础上发展而来的。它是专门为 Web 设计的,并且考虑了伸缩性,无状态性和 XML 的问题。
ADO.NET 使用了某些 ADO 的对象,如 Connection 和 Command 对象,并且还引入了新的对象。主要的新 ADO.NET 对象包括 DataSet、DataReader 和 DataAdapter。
ADO.NET 这一发展版本与以前的数据结构之间的重要区别就是 DataSet 对象的存在,该对象独立于任何数据存储区并且与之不同。正因为如此,DataSet 对象作为一个独立实体运行。可以将数据集 (DataSet) 设想为始终断开的记录集,它对其所包含的数据的源或目标一无所知。DataSet 的里面很像数据库,有表、列、关系、约束、视图,等等。
DataAdapter 连接到数据库以填充 DataSet 的对象。然后,它又连接回数据库,根据 DataSet 保留数据时所执行的操作来更新数据库中的该数据。在过去,数据处理主要是基于连接的。现在,为了使多层应用程序更为高效,数据处理正转向基于消息的方式,围绕信息块进行处理。这种方式的中心是 DataAdapter,它起着桥梁的作用,在 DataSet 和其源数据存储区之间进行数据检索和保存。这一操作是通过请求对数据存储区进行适当的 SQL 命令来完成的。
基于 XML 的 DataSet 对象提供一致的编程模型,该模型可配合所有的数据存储模型使用,无论是单层的、关系型的、还是分层的。为做到这一点,DataSet 对象对其数据源“一无所知”,并且将它拥有的数据表示为集合和数据类型。无论 DataSet 中数据的源是什么,它都是通过由 DataSet 与其从属对象所公开的同一套标准 API 来操纵的。
虽然 DataSet 对其数据的源一无所知,但托管提供程序具有详细而具体的信息。托管提供程序的作用是在 DataSet 与数据存储区之间来回进行连接、填充和保持同步。OLE DB 数据提供者与 SQL Server .NET 数据提供者(System.Data.OleDb 和 System.Data.SqlClient)是 .Net 框架的一部分,它们提供四个基本对象:Command、Connection、DataReader 和 DataAdapter。在本文档的余下部分,我们将介绍 DataSet 和 OLE DB/SQL Server .NET 数据提供程序的每一部分,解释它们是什么以及如何对它们进行编程。
- Connection。用于连接到数据库和管理对数据库的事务。
- Command。用于对数据库发出 SQL 命令。
- DataReader。用于从 SQL Server 数据源读取只进数据记录流。
- DataSet。用于对单层数据、XML 数据和关系数据进行存储、远程处理和编程。
- DataAdapter。用于将数据推入 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)。
Connection(连接)
连接用于与数据库“对话”,并由 SQLConnection 等特定于提供程序的类来表示。命令 (Command) 将遍历连接并以流的形式返回结果集,该结果集可由 DataReader 对象读取,或是被推入 DataSet 对象。
SqlConnection mySqlConnection = new SqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
SqlCommand mySqlCommand = new SqlCommand("INSERT INTO Customers (CustomerId, CompanyName, ContactName, ContactTitle, Address) Values ('ABC','ABC Company', 'John Smith', 'Owner','One My Way')", myConnection);
SqlCommand mySqlCleanup = new SqlCommand("DELETE FROM Customers WHERE CustomerId = 'ABC'", myConnection);
mySqlConnection.Open();
myReader = mySqlCommand.ExecuteReader();
Console.Write("客户 ID ");
Console.WriteLine("公司名称");
while (myReader.Read())
{
Console.Write(myReader["CustomerId"].ToString() + " ");
Console.WriteLine(myReader["CompanyName"].ToString());
}
SqlConnection myConnection = new SqlConnection("server=(local)\VSdotNET;Trusted_Connection=yes;database=northwind");
SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter("select * from customers", myConnection);
mySqlDataAdapter.InsertCommand.CommandText = "sp_InsertCustomer";
mySqlDataAdapter.InsertCommand.CommandType = CommandType.StoredProcedure;
mySqlDataAdapter.DeleteCommand.CommandText = "sp_DeleteCustomer";
mySqlDataAdapter.DeleteCommand.CommandType = CommandType.StoredProcedure;
mySqlDataAdapter.UpdateCommand.CommandText = "sp_UpdateCustomers";
mySqlDataAdapter.UpdateCommand.CommandType = CommandType.StoredProcedure;
mySqlDataAdapter.Update(myDataSet);
图:DataAdapter 和 DataSet
以下示例阐释了通过 SELECT 语句加载一个 DataAdapter。然后它在 DataSet 中更新、删除和添加一些记录。最后,通过 DataAdapter 将那些更新返回到源数据库。构造的 DeleteCommand、InsertCommand 和 UpdateCommand 将显示在页中。它还阐释了使用多个 DataAdapter 对象将多个表(Customers 和 Orders)加载到 DataSet中。
using System;
using System.Data;
using System.Data.SqlClient;
public class adooverview4
{
public static void Main()
{
adooverview4 myadooverview4 = new adooverview4();
myadooverview4.Run();
}
public void Run()
{
// Create a new Connection and SqlDataAdapter
SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter("Select * from Region", myConnection);
SqlParameter workParam = null;
// Restore database to it's original condition so sample will work correctly.
Cleanup();
// Build the insert Command
mySqlDataAdapter.InsertCommand = new SqlCommand("Insert into Region (RegionID, RegionDescription) VALUES (@RegionID, @RegionDescription)", myConnection);
workParam = mySqlDataAdapter.InsertCommand.Parameters.Add("@RegionID", SqlDbType.Int);
workParam.SourceColumn = "RegionID";
workParam.SourceVersion = DataRowVersion.Current;
workParam = mySqlDataAdapter.InsertCommand.Parameters.Add("@RegionDescription", SqlDbType.NChar, 50);
workParam.SourceVersion = DataRowVersion.Current;
workParam.SourceColumn = "RegionDescription";
// Build the update command
mySqlDataAdapter.UpdateCommand = new SqlCommand("Update Region Set RegionDescription = @RegionDescription WHERE RegionID = @RegionID" , myConnection);
workParam = mySqlDataAdapter.UpdateCommand.Parameters.Add("@RegionID", SqlDbType.Int);
workParam.SourceColumn = "RegionID";
workParam.SourceVersion = DataRowVersion.Original;
workParam = mySqlDataAdapter.UpdateCommand.Parameters.Add("@RegionDescription", SqlDbType.NChar, 50);
workParam.SourceVersion = DataRowVersion.Current;
workParam.SourceColumn = "RegionDescription";
DataSet myDataSet = new DataSet();
// Set the MissingSchemaAction property to AddWithKey because Fill will not cause primary key & unique key information to be retrieved unless AddWithKey is specified.
mySqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
mySqlDataAdapter.Fill(myDataSet, "Region");
DataRow myDataRow1 = myDataSet.Tables["Region"].Rows.Find(2);
myDataRow1[1] = "已更改此地区说明";
DataRow myDataRow2 = myDataSet.Tables["Region"].NewRow();
myDataRow2[0] = 901;
myDataRow2[1] = "新地区";
myDataSet.Tables["Region"].Rows.Add(myDataRow2);
try
{
mySqlDataAdapter.Update(myDataSet, "Region");
Console.Write("已成功更新数据集!");
}
catch(Exception e)
{
Console.Write(e.ToString());
}
}
public void Cleanup()
{
SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind");
try
{
// Restore database to it's original condition so sample will work correctly.
myConnection.Open();
SqlCommand CleanupCommand = new SqlCommand("DELETE FROM Region WHERE RegionID = '901'", myConnection);
CleanupCommand.ExecuteNonQuery();
}
catch(Exception e)
{
Console.Write(e.ToString());
}
finally
{
myConnection.Close();
}
}
}

