ADO.NET数据集又是我需要学习的一个好东东

数据集在断开缓存中存储数据。数据集的结构类似于关系数据库的结构;它公开表、行和列的分层对象模型。另外,它包含为数据集定义的约束和关系。
文章来源:http://msdn.microsoft.com/library/chs/default.asp?url=/library/chs/vbcon/html/vbcondatasets.asp

注意   如果您想要在断开与数据源的连接时使用一组表和行,则使用数据集。对于设计数据访问,使用数据集并非总是最佳的解决方案。有关更多信息,请参见 数据访问策略建议。

可以用 .NET Framework 命名空间的以下部分创建和操作数据集。

数据集的基本组成部分通过标准编程构造(如属性和集合)向您公开。例如:

  • DataSet 类包含数据表的 Tables 集合和 DataRelation 对象的 Relations 集合。
  • DataTable 类包含表行的 Rows 集合、数据列的 Columns 集合和数据关系的 ChildRelations 和 ParentRelations 集合。
  • DataRow 类包含 RowState 属性,该属性的值指示自数据表首次从数据库加载后,行是否已更改以及是如何更改的。RowState 属性的可能值包括 DeletedModifiedNewUnchanged

数据集、架构和 XML

ADO.NET 数据集是以 XML 形式表示的数据视图,是一种数据关系视图。在 Visual Studio 和 .NET Framework 中,XML 是存储和传输各种数据时所用的格式。因此,数据集与 XML 有密切关系。数据集和 XML 之间的这种关系使您可以从数据集的以下功能中获益:

  • 数据集的结构(表、列、关系和约束)可在 XML 架构中定义。XML 架构是 W3C(万维网联合会)的基于标准的格式,用于定义 XML 数据的结构。数据集可以使用 ReadXmlSchema 和 WriteXmlSchema 方法读写存储结构化信息的架构。如果无架构可用,数据集可以从通过关系方法结构化的 XML 文档中的数据推导(通过其 InferXmlSchema 方法)出一个。有关数据集和架构的更多信息,请参见 XML 架构介绍。
  • 可以生成一个数据集类,在此类中并入架构信息以将其数据结构(如表和列)定义为类成员。(请参见下文“类型化数据集与非类型化数据集”)。
  • 可以使用数据集的 ReadXML 方法将 XML 文档或流读入数据集,使用数据集的 WriteXML 方法将数据集以 XML 格式写出。因为 XML 是不同应用程序之间的标准数据交换格式,这意味着可以加载其他应用程序发送的包含 XML 格式信息的数据集。同样,数据集可以将其数据集写出为 XML 流或文档,以与其他应用程序共享或只是将其存储为标准格式。
  • 可以创建数据集内容的 XML 视图(XMLDataDocument 对象),然后用关系方法(通过数据集)或 XML 方法查看和操作数据。这两种视图在更改时自动同步。

类型化数据集与非类型化数据集

数据集可以类型化或非类型化。类型化数据集这样一种数据集,它先从基 DataSet 类派生,然后使用 XML 架构文件(.xsd 文件)中的信息生成新类。架构中的信息(表、列等)被作为一组第一类对象和属性生成并编译为此新数据集类。

注意   有关数据集架构的更多信息,请参见 XML 架构和数据。

因为类型化 DataSet 类从基 DataSet 类继承,所以此类型化类承接 DataSet 类的所有功能,并且可与将 DataSet 类的实例作为参数的方法一起使用。

相形之下,非类型化数据集没有相应的内置架构。与类型化数据集一样,非类型化数据集也包含表、列等,但它们只作为集合公开。(不过,手动创建了表和非类型化数据集中的其他数据元素后,可以使用数据集的 WriteXmlSchema 方法将数据集的结构导出为架构。)

在应用程序中可以使用这两种类型中的任何一种。不过,Visual Studio 对类型化数据集有更多工具支持,并且,类型化数据集使对数据集的编程更简单且不易出错。

对比类型化和非类型化数据集中的数据访问

类型化数据集的类有一个对象模型,在该对象模型中此数据集的表和列第一类对象。例如,如果使用的是类型化数据集,可以使用如下代码引用列:

' Visual Basic
' This accesses the CustomerID column in the first row of
' the Customers table.
Dim s As String
s = dsCustomersOrders1.Customers(0).CustomerID
// C#
// This accesses the CustomerID column in the first row of
// the Customers table.
string s;
s = dsCustomersOrders1.Customers[0].CustomerID;

相比较而言,如果使用的是非类型化数据集,等效的代码为:

' Visual Basic
Dim s As String
s = CType(dsCustomersOrders1.Tables("Customers").Rows(0).Item("CustomerID"), String)
// C#
string s = (string) dsCustomersOrders1.Tables["Customers"].Rows[0]["CustomerID"];

类型化访问不但更易于读取,而且完全受 Visual Studio 代码编辑器中智能感知的支持。除了更易于使用外,类型化数据集的语法还在编译时提供类型检查,从而大大降低了为数据集成员赋值时发生错误的可能性。在运行时对类型化数据集中的表和列的访问也略为快一些,因为访问是在编译时确定的,而不是在运行时通过集合确定。

尽管类型化数据集有许多优点,但在许多情况下需要使用非类型化数据集。最显而易见的情形是数据集无架构可用。例如,当应用程序正在与返回数据集的组件交互而您事先不知道其结构是哪种时,便会出现这种情况。同样,有些时候使用的数据不具有静态的可预知结构,这种情况下使用类型化数据集是不切实际的做法,因为对于数据结构中的每个更改,您都必须重新生成类型化数据集类。

更常见的是,许多时候可能需要动态创建无可用架构的数据集。这种情况下,数据集只是一种方便的、可用来保留信息的结构(只要数据可以用关系方法表示)。同时,您还可以利用数据集的功能,如序列化传递到另一进程的信息或写出 XML 文件的能力。

数据集的大小写敏感性

在数据集中,默认情况下表和列的名称不区分大小写,即数据集中名为“Customers”的表也可能是指“customers”。这符合包括 SQL Server 在内的许多数据库的命名规则,即数据元素的名称无法通过大小写区分。

注意   与数据集不同,XML 文档区分大小写,因此架构中定义的数据元素的名称区分大小写。例如,架构协议允许要包含的架构定义名为“Customers”的表和名为“customers”的另一个不同的表。这在架构用于生成数据集类时会导致名称冲突。有关更多信息,请参见 XML 的元素、属性和类型。

不过,大小写敏感性可以成为决定数据在数据集中的解释方法的因素。例如,在数据集表中筛选数据时,根据比较是否区分大小写,搜索判据可能返回不同的结果。通过设置数据集的 CaseSensitive 属性,可以控制筛选、搜索和排序是否区分大小写。默认情况下,数据集中的所有表都继承此属性的值。(对于每个单独的表可以重写此属性。)

填充数据集

数据集是容器,因此需要用数据填充它。填充数据集时,将引发各种事件,应用约束检查,等等。有关更新数据集以及与更新相关的问题的更多信息,请参见 Visual Studio .NET 中的数据集更新。

可以用多种方法填充数据集:

  • 调用数据适配器的 Fill 方法。这导致适配器执行 SQL 语句或存储过程,然后将结果填充到数据集中的表中。如果数据集包含多个表,每个表可能有单独的数据适配器,因此必须分别调用每个适配器的 Fill 方法。

    有关如何填充数据集的更多信息,请参见数据适配器介绍和创建数据适配器。有关如何使用数据适配器填充数据集的更多信息,请参见从 DataAdapter 填充 DataSet。

  • 通过创建 DataRow 对象并将它们添加到表的 Rows 集合,手动填充数据集中的表。(只能在运行时执行此操作,无法在设计时设置 Rows 集合。)有关更多信息,请参见将数据添至表中。
  • 将 XML 文档或流读入数据集。有关更多信息,请参见 ReadXml 方法。
  • 合并(复制)另一个数据集的内容。如果应用程序从不同的来源(例如,不同的 XML Web services)获取数据集,但是需要将它们合并为一个数据集,该方案会很有用。有关更多信息,请参见 DataSet.Merge 方法。

数据集中的记录位置和导航

因为数据集是完全断开的数据容器,所以数据集(与 ADO 记录集不同)不需要或不支持当前记录的概念。相反,数据集中的所有记录都可用。

由于没有当前记录,因此就没有指向当前记录的特定属性,也没有从一个记录移动到另一个记录的方法或属性。(比较而言,ADO 记录集支持绝对记录位置和从一个记录移动到另一个记录的方法。)可以访问数据集中以对象形式出现的各个表;每个表公开一个行集合。可以像处理任何集合那样处理行集合,通过集合的索引访问行,或者用编程语言通过集合特定的语句来访问行。

注意   如果将 Windows 窗体中的控件绑定到数据集,则可以使用窗体的绑定结构简化对个别记录的访问。有关更多信息,请参见 在 Windows 窗体中定位数据。

相关表和 DataRelation 对象

如果数据集中有多个表,这些表中的信息可能是相关的。数据集没有这些关系的继承知识,因此为了使用相关表中的数据,可以创建 DataRelation 对象来描述数据集中表之间的关系。可使用 DataRelation 对象以编程方式获取父记录的相关子记录和从子记录获取父记录。

例如,设想一下顾客和订单数据,如 Northwind 数据库中的情形。“Customers”表可能包含如下记录:

CustomerID   CompanyName               City
ALFKI        Alfreds Futterkiste       Berlin
ANTON        Antonio Moreno Taquerias  Mexico D.F.
AROUT        Around the Horn           London

数据集也可能包含另一个含有订单信息的表。“Orders”表包含外键列形式的 Customer ID。只选择“Orders”表中的某些列,可能类似于以下内容:

OrderId    CustomerID    OrderDate
10692      ALFKI         10/03/1997
10702      ALFKI         10/13/1997
10365      ANTON         11/27/1996
10507      ANTON         4/15/1997

因为每个顾客可以有一个以上的订单,所以在顾客和订单之间存在一对多关系。例如,在上表中,顾客 ALFKI 有两个订单。

可以用 DataRelation 对象从子表或父表获取相关记录。例如,当使用描述顾客 ANTON 的记录时,可以获取描述该顾客的订单的记录集合。同样,如果使用描述订单号 10507 的记录,则可以使用 DataRelation 对象获取描述此订单的顾客 (ANTON) 的记录。

约束

与大多数数据库一样,数据集也支持约束,作为一种确保数据完整性的方法。约束是在表中插入、更新或删除行时应用的规则。可以定义两种类型的约束:

  • 唯一约束,检查列中的新值在表中是否是唯一的。
  • 外键约束,定义当主表中的记录被更新或删除时相关子记录应如何更新的规则。

在数据集中,约束与单个表(外键约束)或列(唯一约束,即保证列值具有唯一性的约束)关联。约束作为类型 UniqueConstraintForeignKeyConstraint 的对象实现。然后它们被添加到表的 Constraints 集合。另外,也可以通过只是将数据列的 Unique 属性设置为 true 来指定唯一约束。

数据集本身支持布尔型 EnforceConstraints 属性,该属性指定是否强制约束。默认情况下,该属性设置为 true。不过,有时暂时关闭约束很有用。最常见的情形是当更改记录过程中所采用的方式将暂时导致无效状态时。完成更改(并由此返回有效状态)后,可以重新启用约束。

在 Visual Studio 中,定义数据集时会隐式创建约束。通过将主键添加到数据集,即会为主键列隐式创建一个唯一约束。通过将其他列的 Unique 属性设置为 true,可以为它们指定唯一约束。

通过在数据集中创建 DataRelation 对象来创建外键约束。除了允许以编程方式获取有关相关记录的信息外,DataRelation 对象还允许定义外键约束规则。

有关将 DataRelation 对象用作外键约束的更多信息,请参见 DataRelation 对象介绍。有关以编程方式创建约束的更多信息,请参见将约束添加到表。

更新数据集和数据存储区

当数据集中的记录发生更改时,这些更改必须写回数据库。要将更改从数据集写入数据库,须调用数据适配器的 Update 方法,在数据集与其相应的数据源之间通信。

用于操作个别记录的 DataRow 类包含 RowState 属性,该属性的值指示自数据表首次从数据库加载后,行是否已更改以及是如何更改的。可能的值包括 DeletedModifiedNewUnchangedUpdate 方法检查 RowState 属性的值,确定哪些记录需要写入数据库,以及应该调用哪个特定的数据库命令(添加、编辑、删除)。

有关更新数据的更多信息,请参见 Visual Studio .NET 中的数据集更新。

你可能感兴趣的:(ADO.NET数据集又是我需要学习的一个好东东)