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 块内部打开连接,如下面的代码段所示。 这样可确保在代码退出代码块时自动关闭连接。
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。
小结: