ADO.NET 概述
ADO.NET 提供对 Microsoft SQL Server 等数据源以及通过 OLE DB 和 XML 公开的数据源的一致访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、操作和更新数据。
ADO.NET 有效地从数据操作中将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。 ADO.NET 包含用于连接到数据库、执行命令和检索结果的 .NET 数据提供程序。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。 ADO.NET DataSet 对象也可以独立于 .NET 数据提供程序使用,以管理应用程序本地的数据或源自 XML 的数据。
ADO.NET 结构
以前,数据处理主要依赖于基于连接的双层模型。当数据处理越来越多地使用多层结构时,程序员正在向断开方式转换,以便为他们的应用程序提供更佳的可缩放性。
ADO.NET 借用 XML 的力量来提供对数据的断开式访问。ADO.NET 的设计与 .NET 框架中 XML 类的设计是并进的——它们都是同一个结构的组件。
ADO.NET 和 .NET 框架中的 XML 类集中于 DataSet 对象。无论 DataSet 是文件还是 XML 流,它都可以使用来自 XML 源的数据来进行填充。无论 DataSet 中数据的数据源是什么, DataSet 都可以写为符合 WWW 联合会 (W3C) 的 XML,并且将其架构包含为 XML 架构定义语言 (XSD) 架构。由于 DataSet 固有的序列化格式为 XML,它是在层间移动数据的优良媒介,这使 DataSet 成为以远程方式向 XML Web services 发送数据和架构上下文以及从 XML Web services 接收数据和架构上下文的最佳选择。
设计 ADO.NET 组件的目的是为了从数据操作中分解出数据访问。完成此任务的是 ADO.NET 的两个核心组件: DataSet 和 .NET 数据提供程序,后者是一组包括 Connection 、 Command 、 DataReader 和 DataAdapter 对象在内的组件。
ADO.NET DataSet 是 ADO.NET 的断开式结构的核心组件。 DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。 DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。
ADO.NET 结构的另一个核心元素是 .NET 数据提供程序,其组件的设计目的相当明确:为了实现数据操作和对数据的快速、只进、只读访问。 Connection 对象提供与数据源的连接。 Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。 DataReader 从数据源中提供高性能的数据流。最后, DataAdapter 提供连接 DataSet 对象和数据源的桥梁。 DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。
可以为任何数据源编写 .NET 数据提供程序。.NET 框架附带了两个 .NET 数据提供程序:SQL Server .NET 数据提供程序和 OLE DB .NET 数据提供程序。
下图阐释了 ADO.NET 结构的组件。
ADO.NET DataSet
** DataSet ** 对象是支持 ADO.NET 的断开式、分布式数据方案的核心对象。 DataSet 是数据的内存驻留表示形式,无论数据源是什么,它都会提供一致的关系编程模型。它可以用于多个不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。 DataSet 表示包括相关表、约束和表间关系在内的整个数据集。
下图将显示 ** DataSet ** 对象模型。
** DataSet ** 中的方法和对象与关系数据库模型中的方法和对象一致。
** DataSet ** 也可以按 XML 的形式来保持和重新加载其内容,并按 XML 架构定义语言 (XSD) 架构的形式来保持和重新加载其架构。
使用 ADO.NET 提供的通用接口,您可以编写一组在使用任何 .NET 数据提供程序时都将运行的代码。
当编写将用于多个 .NET 数据提供程序的代码时,请特别注意所使用的任何提供程序特定的语法。例如,根据您所访问的数据源,SQL 语法将有所不同。当更改为一个不同的 .NET 数据提供程序时,如果将 SQL 命令隔离为字符串常数,则将使代码更易于维护。
另外,务必要保持在代码中创建参数的顺序。对于 SQL Server .NET 数据提供程序,参数使用名称来标识,因此参数顺序并不重要。但是,OLE DB .NET 数据提供程序会按照参数添加到参数集合中的顺序来分配参数值。因此,最好始终保持参数在代码中的顺序。
下面是C#的示例代码:
[C#]
// You can use either:
// IDbConnection myConn = new SqlConnection();
// or:
// IDbConnection myConn = new OleDbConnection();
IDbCommand myCommand = myConn.CreateCommand();
myCommand.CommandText = "SELECT * FROM Customers";
IDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read())
Console.WriteLine("{0}\t{1}", myReader.GetString(0), myReader.GetString(1));
创建和使用 DataSet
ADO.NET DataSet 是数据的一种内存驻留表示形式,无论它包含的数据来自什么数据源,它都会提供一致的关系编程模型。一个 DataSet 表示整个数据集,其中包含对数据进行包含、排序和约束的表以及表间的关系。
使用 ** DataSet ** 的方法有若干种,这些方法可以单独应用,也可以结合应用。您可以:
- 在 ** DataSet ** 中以编程方式创建 DataTables 、 DataRelations 和 Constraints 并使用数据填充这些表。
- 通过 ** DataAdapter ** 用现有关系数据源中的数据表填充 ** DataSet ** 。
创建 DataSet
可以通过调用 ** DataSet ** 构造函数来创建 DataSet 的实例。请指定一个可选名称参数。如果没有为 DataSet 指定名称,则该名称会设置为“NewDataSet”。
也可以基于现有的 ** DataSet ** 来创建新的 DataSet 。新的 DataSet 可以是:现有 DataSet 的原样副本; DataSet 的复本,它复制关系结构(即架构)但不包含现有 DataSet 中的任何数据;或 DataSet 的子集,它仅包含现有 DataSet 中已使用 GetChanges 方法修改的行。
以下代码示例演示如何构造 ** DataSet ** 的实例。
[C#]
DataSet custDS = new DataSet("CustomerOrders");
向 DataSet 添加 DataTable
ADO.NET 使您能够创建 DataTable 对象并将其添加到现有 DataSet 中。可以使用要添加到 DataTable 的 Columns 集合中的 DataColumn 对象的 PrimaryKey 和 Unique 属性来设置 DataTable 的约束信息。
以下示例构造一个 ** DataSet ** ,将一个新的 ** DataTable ** 对象添加到该 DataSet 中,然后将三个 DataColumn 对象添加到该表中。最后,该代码将一个列设置为主键列。
[C#]
DataSet custDS = new DataSet("CustomerOrders");
DataTable ordersTable = custDS.Tables.Add("Orders");
DataColumn pkCol = ordersTable.Columns.Add("OrderID", typeof(Int32));
ordersTable.Columns.Add("OrderQuantity", typeof(Int32));
ordersTable.Columns.Add("CompanyName", typeof(string));
ordersTable.PrimaryKey = new DataColumn[] {pkCol};
创建和使用数据表
** DataSet ** 由表、关系和约束的集合组成。在 ADO.NET 中, DataTable 对象用于表示 DataSet 中的表。 DataTable 表示一个内存内关系数据的表;数据对于它驻留于其中的基于 .NET 的应用程序来说是本地数据,但可从数据源(例如,使用 DataAdapter 的 Microsoft® SQL Server)中导入。
** DataTable ** 类是“.NET 框架类库”中 System.Data 命名空间的成员。您可以独立创建和使用 DataTable ,或者可以将其用作 DataSet 的成员,而且 DataTable 对象也可以与其他 .NET 框架对象(包括 DataView )一起使用。您可以通过 DataSet 对象的 Tables 属性来访问 DataSet 中表的集合。
表的架构或结构由列和约束表示。使用 ** DataColumn ** 对象以及 ForeignKeyConstraint 和 UniqueConstraint 对象定义 DataTable 的架构。表中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值,或包含主键值。
除架构以外, ** DataTable ** 还必须具有行,在其中包含数据并对数据排序。 DataRow 类表示表中包含的实际数据。 DataRow 及其属性和方法用于检索、计算和操作表中的数据。在访问和更改行中的数据时, DataRow 对象会维护其当前状态和原始状态。
您可以使用表中的一个或多个相关的列来创建表与表之间的父子关系。 ** DataTable ** 对象之间的关系可使用 DataRelation 来创建。然后, DataRelation 对象可用于返回某特定行的相关子行或父行。
创建数据表
** DataTable ** 表示一个内存内关系数据的表,可以独立创建和使用,也可以由其他 .NET 框架对象使用,最常见的情况是作为 DataSet 的成员使用。
** DataTable ** 对象可通过使用 DataTable 构造函数来创建,或者可通过将构造函数参数传递到 DataSet 的 Tables 属性的 Add 方法(它是一个 DataTableCollection )来创建。
** DataTable ** 对象可通过使用 DataAdapter 对象的 Fill 方法或 FillSchema 方法在 DataSet 内创建,或者可使用 DataSet 的 ReadXml 、 ReadXmlSchema 或 InferXmlSchema 方法从预定义的或推断的 XML 架构中创建。请注意,将 DataTable 添加为一个 DataSet 的 Tables 集合的成员后,不能再将其添至任何其他 DataSet 的表的集合。
最初创建 ** DataTable ** 时,它是没有架构(结构)的。要定义表的架构,必须创建 DataColumn 对象并将其添至表的 Columns 集合。您也可以为表定义主键列,而且可以创建 Constraint 对象并将其添至表的 Constraints 集合。在为 DataTable 定义了架构之后,可通过将 DataRow 对象添至表的 Rows 集合来将数据行添加到表。
创建 ** DataTable ** 时,不需要为 TableName 属性提供值,您可以在其他时间指定属性,或者将其保留为空。但是,在将没有 TableName 值的表添至 DataSet 时,该表就会得到一个递增的默认名称 Table N ,此名称以“Table”开头,从 Table0 开始。
** 注意 ** 建议您在提供 ** TableName ** 值时避免使用“Table”或“Table N ”的命名规则,因为您提供的名称可能会与 DataSet 中现有的默认表名称冲突。如果提供的名称已经存在,将引发异常。
以下示例创建 ** DataTable ** 对象的实例,并为其指定名称“Customers”。
[C#]
DataTable workTable = new DataTable("Customers");
以下示例创建 ** DataTable ** 实例,方法是:将其添至 DataSet 的 Tables 集合。
[C#]
DataSet custDS = new DataSet();
DataTable custTable = custDS.Tables.Add("CustTable");
创建和使用 DataView
** DataView ** 使您能够创建 DataTable 中所存储的数据的不同视图,这种功能通常用于数据绑定应用程序。使用 DataView ,您可以公开表中具有不同排序顺序的数据,并且可以按行状态或基于筛选器表达式来筛选数据。
** DataView ** 提供数据的动态视图,其内容、排序和成员关系会实时反映对基础 DataTable 的更改。它不同于 DataTable 的 Select 方法,后者从表中按特定的筛选器和/或排序顺序返回 DataRow 数组,虽然其内容反映对基础表的更改,但其成员关系和排序却则保持静态。 DataView 的动态功能使其成为数据绑定应用程序的理想选择。
与数据库提供的视图类似, ** DataView ** 为您提供了可向其应用不同排序和筛选条件的单个数据集的动态视图。但是, DataView 和数据库视图之间相当不同的一点在于 DataView 不能作为表来进行处理,并且不能提供联接表的视图。另外,还不能排除存在于源表中的列,也不能追加不存在于源表中的列(如计算列)。
可以使用 ** DataViewManager ** 来管理 DataSet 中所有表的视图设置。 DataViewManager 为您提供了一种方便的方法来管理每个表的默认视图设置。在将一个控件绑定到 DataSet 的多个表时,绑定到 DataViewManager 是理想的选择。
创建 DataView
创建 ** DataView ** 的方法有两种。可以使用 DataView 构造函数,也可以创建对 DataTable 的 DefaultView 属性的引用。 DataView 构造函数可以为空,也可以通过单个参数的形式采用 DataTable 或者同时采用 DataTable 与筛选条件、排序条件和行状态筛选器。有关可与 DataView 一起使用的附加参数的更多信息。
由于在创建 ** DataView ** 时以及在修改任何 Sort 、 RowFilter 或 RowStateFilter 属性时都会生成 DataView 的索引,所以当创建 DataView 时,通过以构造函数参数的形式提供任何初始排序顺序或筛选条件,将实现最佳性能。如果在不指定排序或筛选条件的情况下创建 DataView ,然后设置 Sort 、 RowFilter 或 RowStateFilter 属性,则会使索引生成至少二次:一次是在创建 DataView 时,另一次是在修改任何排序或筛选属性时。
请注意,如果使用不采用任何参数的构造函数来创建 ** DataView ** ,那么在设置 ** Table ** 属性之前,将无法使用 DataView 。
以下代码示例演示如何使用 ** DataView ** 构造函数来创建 DataView 。 RowFilter 、 Sort 列和 DataViewRowState 将与 DataTable 一起提供。
[C#]
DataView custDV = new DataView(custDS.Tables["Customers"],
"Country = 'USA'",
"ContactName",
DataViewRowState.CurrentRows);
以下代码演示如何使用该表的 ** DefaultView ** 属性获取对 DataTable 的默认 DataView 的引用。
[C#]
DataView custDV = custDS.Tables["Customers"].DefaultView;
总结
上面是VS.NET中ADO.NET的一些主要的特性,给大家参考一下。有任何建议请MAIL我 [email protected] 。