本文提供学习和掌握 ADO.NET
DataSet、
DataView 和
DataViewManager 对象的指南。
指南文章提供指向有用信息的链接,这些信息包括联机文档、Microsoft 知识库文章和 Microsoft 白皮书,目的在于帮助您了解 Microsoft 产品或技术。Microsoft 知识库“如何”文章和演练提供完成具体任务的分步说明。快速入门示例文件是用来阐释技术的现成的程序。
有关其他 ADO.NET 技术指南文章,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
313590
(http://support.microsoft.com/kb/313590/) INFO:ADO.NET 指南
概述
loadTOCNode(2, 'summary');
DataSet 是一个处于非连接状态的数据存储;无论数据源是什么,它都可提供一致的功能。
DataSet 还是数据的关系组织(如数据库)和数据的分层组织(如可扩展标记语言)之间的桥梁。
DataSet 类似于处于非连接状态的
Recordset 对象的数组,但
DataSet 可提供更强大的功能。
DataSet 可以维护本地约束、级联更新和删除,并按照关系提供分层导航。与 Microsoft ActiveX 数据对象 (ADO) 相比,
DataSet 还具有功能更强大的表达式计算器。这使您在搜索和筛选记录时更具灵活性。还可以使用
DataSet 对行版本和错误状态进行低级别的控制。
DataView 可提供对单个
DataTable 进行排序和筛选的机制。
DataViewManager 可在执行分层导航时,提供对多个
DataTable 对象进行排序和筛选的机制。
有关 ADO.NET
DataSet 对象的更多信息,请参考以下 Microsoft 网站:
DataSet
loadTOCNode(2, 'summary');
DataSet 对象包括下列元素:
• |
DataTable 对象 |
• |
DataColumn 对象 |
• |
DataRow 对象 |
• |
DataRelation 对象 |
• |
ExtendedProperties 集合 |
DataSet 是
DataTable 对象的集合。
DataSet 还包含允许使用引用完整性、级联更新、分层导航和聚合表达式的
DataRelation 对象的集合。
DataSet 通过以下方法提供读写可扩展标记语言 (XML) 数据和架构的功能:
• |
InferXmlSchema |
• |
ReadXml |
• |
ReadXmlSchema |
• |
WriteXml |
• |
WriteXmlSchema |
• |
GetXml |
• |
GetXmlSchema |
注意:
DataTable 和
DataRow 对象无法单独读取或写入 XML。
Clone 方法返回与源
DataSet 具有相同架构的空
DataSet。
Copy 方法返回包含数据的副本。
下面的列表介绍了
DataSet 的某些方法和属性:
• |
HasChanges 属性。如果任何 DataTable 对象包含已修改的记录,则该属性返回 True。 |
• |
GetChanges 方法。此方法返回只包含已更改元素的 DataSet 的副本。
可以结合 DataRowState 标志来控制是添加、删除还是修改记录(或这些操作的组合)。默认情况下,返回所有更改。如果不存在任何更改,则返回 null(在 Microsoft Visual C# .NET、Microsoft Visual C++ .NET、Microsoft JScript .NET 中)或 Nothing(在 Microsoft Visual Basic .NET 中)。 |
• |
Merge 方法。本方法可合并两个 DataSet 对象。MissingSchemaAction 参数控制是否对目标 DataSet 架构进行扩展以匹配源 DataSet 架构、是否忽略扩展的架构或者扩展的架构是否导致异常。
• |
如果 DataTable 对象存在主键,则该键用于根据源 DataSet 中的具有相同键的记录更新目标记录。如果不存在主键,则追加这些记录,这会导致重复的记录。 |
• |
如果 PreserveChanges 参数为 True,则只合并添加的记录(即,保留目标 DataSet 中的任何更改)。如果源 DataSet 包含已修改的记录,则使用原来的键值匹配目标 DataSet 中的记录。 |
|
• |
CaseSensitive 属性。此属性确定数据是否区分大小写;不过,也可以一个表一个表地进行此项设置。架构既可以区分大小写,也可以不区分大小写。当 ADO.NET 访问某个项目时,ADO.NET 采用区分大小写的查找方式。如果此查找方式失败,ADO.NET 便换用不区分大小写的查找。如果有多个名称相同的项目(这是不区分大小写的),则您会在该区分大小写的查找方式失败时收到异常。 |
• |
AcceptChanges 和 RejectChanges 方法。这两个方法从本地提交或回滚 DataSet 中的数据更改。这两个方法不影响架构更改。 |
• |
Locale 属性。可以使用此属性设置 CultureInfo 对象以控制排序和搜索。 |
• |
DefaultViewManager 属性。此属性返回 DataSet 所维护的 DataViewManager 对象。您可以使用此对象来控制排序和筛选,也可以创建您自己的一个或多个独立的 DataViewManager 对象。 |
Microsoft 知识库“如何”文章
单击此处可查看与 ADO.NET DataSet 对象及其他相关对象有关的“如何”文章的列表
(http://support.microsoft.com/common/canned.aspx?r=d&h=ado.net+dataset+how+to+articles&ll=kbadonet&sz=kbhowto+and+(dataset+or+datatable+or+datacolumn+or+datarow+or+datarelation+or+constraint+or+dataview+or+dataviewmanager+or+datarowview))
Visual Studio .NET 帮助文档
MSDN 文章
以下文章摘自
Diving Into Data Access(深入探讨数据访问)专栏。
快速入门示例
注意:如果在计算机上安装了快速入门示例,则这些示例位于 \QuickStart\Howto\Samples\Xml 文件夹中。
Microsoft 知识库“如何”文章
305346
(http://support.microsoft.com/kb/305346/) 如何使用 Visual Basic .NET 在 DataTable 之间复制 DataRow
308909
(http://support.microsoft.com/kb/308909/) 如何使用 Visual C# .NET 在数据表之间复制数据行
308058
(http://support.microsoft.com/kb/308058/) 如何使用 Visual Basic .NET 在 DataSet 中获取扩展消息
要查看包含用来在单个函数调用中处理常见
DataSet 操作(例如 CREATE TABLE 和 SELECT DISTINCT 等效命令、联接以及分组)的 Helper 函数的文章列表,请单击以下链接:
单击此处可查看 DataSetHelper 的文章的完整列表
(http://support.microsoft.com/common/canned.aspx?r=d&h=ado.net+datasethelper+articles&ll=kbadonet&sz=kbhowto+and+datasethelper+and+kbadonet)
DataTable
loadTOCNode(3, 'summary');
DataTable 是元数据和数据的集合,其中,元数据是通过
DataColumn 对象和
Constraint 对象的集合描述的,而数据则包含在
DataRow 对象的集合中。
DataTable 可以独立存在,也可以是
DataSet 的一部分。
与 ADO
Recordset 对象(可操作
Provider)不同,
DataTable 是一个被动对象。
DataAdapter 对象、
XmlDataDocument 对象和用户代码可操作
DataTable。
DataTable 不知道自己的数据来自何处。这些数据可以来自多个源。
下面的列表介绍了
DataTable 的某些方法和属性:
• |
AcceptChanges 方法、RejectChanges 方法、Clone 方法、Copy 方法、GetChanges 方法以及 HasChanges 属性。这些方法和 HasChanges 属性在操作上与它们在 DataSet 中的等效方法和属性类似,只是它们会影响单个 DataTable,而它们的等效方法和属性则不会。 |
• |
PrimaryKey 属性。可以使用 PrimaryKey 属性指示哪一列或哪些列构成主键。 |
• |
ImportRow 方法。此方法可添加来自具有相同架构的其他 DataTable 中的 DataRow 的副本。可以将此方法与 Clone 方法结合使用来复制记录,这比单独使用 Copy 方法更便于进行选择。 |
• |
Select 方法。此方法返回根据您提供的参数进行排序和筛选的 DataRow 对象的数组。您还可以按行状态进行筛选。 |
• |
Constraints 属性。此属性是 DataTable 中唯一约束和外键约束的集合。 |
注意:
DataTable 不具有
Merge 方法的等效方法。不过,为产生相同的效果,
DataSet 的
Merge 方法可获取
DataTable 或获取
DataRow 对象的数组。
DataColumn
loadTOCNode(3, 'summary');可以使用
DataColumn 定义
DataTable 或
DataRow 中列的属性(主要是定义
ColumnName 和
DataType 属性)。
DataColumn 包含 AutoNumber 和 Null 支持。
下面的列表介绍了
DataColumn 的某些属性:
• |
ColumnMapping 属性。在 XmlDataDocument 操作 DataColumn 时或在 DataSet 序列化 DataColumn 时,此属性可控制 DataColumn 对象是映射到 XML 元素,还是映射到属性。 |
• |
Unique 属性。此属性允许您对非主键列设置唯一约束。 |
DataColumn 可以包含基于
DataTable 中其他
DataColumn 对象的表达式。此外,
DataColumn 还可以使用
DataRelation 对象引用父
DataTable 中的字段,或者聚合子
DataTable 中的字段。但在引用不是当前
DataTable 中的字段时,必须在填充这些表后添加表达式列。如果尝试使用引用其他
DataTable 的表达式更新某个
DataTable,则会收到异常。
DataRow
loadTOCNode(3, 'summary');尽管
DataRow 可以独立存在,但
DataTable 或
DataRowBuilder 必须创建
DataRow。例如,可以使用
DataTable 的
NewRow 方法创建
DataRow,也可以将
DataTable 用于
DataRowBuilder 的架构来创建
DataRow。
DataRow 可以具有下列多种状态:
如果
DataRow 不属于
DataTable,则其
RowState 属性的值为
Detached,在
DataTable 中合并
DataRow 时,该值会更改为
Added。
DataRow 可以具有下列多种版本:
下列方法可控制行版本:
• |
BeginEdit |
• |
EndEdit |
• |
CancelEdit |
• |
AcceptChanges |
• |
RejectChanges |
Item 集合具有允许您指定
DataRowVersion 以及要访问的列的重载。如果您试图引用不存在的版本,则会收到一个异常。
下面的列表介绍了
DataRow 的某些方法和属性:
• |
HasVersion 方法。可以使用 HasVersion 方法来测试是否有特定的 DataRowVersion 值。
• |
已删除的行不具有“当前”版本。 |
• |
已添加的行和已分离的行不具有“原始”版本。 |
• |
如果不在 BeginEdit、EndEdit 和 CancelEdit 块内,则所在的行不具有“建议”版本。 |
|
• |
GetParentRow、GetParentRows、GetChildRow 和 GetChildRows 方法。这些方法基于指定的 DataRelation 返回包含父行或子行的 DataRow 对象或 DataRow 对象的数组。这些方法允许在各表间进行分层访问。
注意:DataRelation 对象允许在各层之间存在多种关系(即,DataRelation 不必使用唯一列)。因此,DataRow 包括 GetParentRows 方法。 |
• |
HasErrors 和 RowError 属性。这些属性指示 DataRow 是否有错。尽管 DataAdapter 通常在更新失败后设置这些属性,但您也可以手动设置这些属性。 |
DataRelation
loadTOCNode(3, 'summary');
DataRelation 对象定义两个
DataTable 对象之间的父/子关系。
下面的列表介绍了
DataRelation 的某些属性:
• |
ParentKeyConstraint 和 ChildKeyConstraint 属性。这两个属性确定是否强制执行引用完整性。 |
• |
Nested 属性。此属性确定在 DataSet 序列化为 XML 时,子表元素是否嵌套在父表内。 |
ExtendedProperties
loadTOCNode(3, 'summary');
DataSet、
DataTable、
DataRelation 和
Constraint 对象均支持
ExtendedProperties 集合,可以在该集合中为对象存储用户定义的属性。
DataView
loadTOCNode(2, 'summary');可以使用
DataView 对要查看的记录进行排序和筛选。每个
DataTable 都具有可以访问和设置其属性的
DefaultView 对象。此外,还可以在
DataTable 中创建许多独立的
DataView 对象。
DataView 可创建基于已排序的列的索引,该索引通过
Find 方法提供快速搜索功能。只能使用此
Find 方法搜索当前已排序的列。如果按多个列对
DataView 进行排序,则必须在
Find 方法中提供一组值。
可以通过简单的赋值,编辑
DataTable 行中各字段的“当前”值。更改将立即进行。或者,也可以使用
BeginEdit 方法更改“建议”行版本,使用
EndEdit 或
CancelEdit 方法提交或回滚所做的更改。
不能直接在
DataView 中编辑数据行。而必须使用
BeginEdit、
EndEdit 和
CancelEdit 方法。调用
EndEdit 方法后,更改将写入
DataTable 中且可以立即使用。并通知同一
DataTable 中的其他
DataView 对象所做的更改。
默认情况下,
DataView 绑定到“当前”行。可以将
DataViewRowState 传递到构造函数以绑定到其他行版本(例如,访问“已删除”记录)。
注意:只能将
DataView 绑定到单个
DataTable。创建
DataView 后,不能让该
DataView 筛选其他
DataTable。
只要更改了筛选或排序的基础数据,就会引发
ListChanged 事件。
Visual Studio .NET 帮助文档
MSDN 文章
以下文章摘自
Diving into Data Access(深入探讨数据访问)专栏。
快速入门示例
注意:如果在计算机上安装了这些快速入门示例,则这些示例位于 \QuickStart\Howto\Samples\Adoplus 文件夹中。
Microsoft 知识库文章
325682
(http://support.microsoft.com/kb/325682/) 如何在 Visual Basic .NET 中实现自定义的 DataView 类
DataViewManager
loadTOCNode(2, 'summary');如果通过
DataView 或
DataTable 导航到子记录,则这些子记录未经过筛选(除非与父记录有关)。可以使用
DataViewManager 指定在执行分层导航时应用的
RowFilter 和
Sort 属性。
例如,如果将一个 Windows 窗体
DataGrid 控件绑定到包含客户和订单列表的
DataSet,则在导航到特定客户的订单时,将显示所有订单。但是,如果将
DataGrid 绑定到
DataViewManager,并将
DataViewSetting 对象添加到
DataViewManager.
DataViewSettings 集合,则可以筛选订单列表以便只显示超过某一金额的订单。此外,您还可以筛选订单列表并根据订单金额以降序对它们进行排序。
Visual Studio .NET 帮助文档
MSDN 文章
本文摘自
Diving into Data Access(深入探讨数据访问)专栏。
疑难解答
loadTOCNode(2, 'summary');如果遇到问题并且需要问题的答案,可以访问 MSDN 新闻组或 Microsoft 知识库。在 MSDN 新闻组中,可以分享同行的经验。