摘要:ADO.NET 中的数据集是一种在内存中表示数据的方法,它可以包含多个相关的数据表。本文介绍了在数据集中浏览这些相关数据表的方法。您将在 Visual Basic? .net 或 Visual C#? .NET 中创建一个 Windows? 应用程序,基于选定的记录返回相关记录,并使用表达式列为相关记录生成合计信息。本文包含一些指向英文站点的链接。
简介
由于数据集可以包含几个相关的表,因此了解如何在父记录和子记录之间进行浏览是一项基本任务,而这并非显而易见,特别是当您试图访问相关层次结构中的深层表中的数据时,更是如此。您还将学习如何浏览包含具有多对多关系的表的数据集,其中每个表都通过第三方表(中间表)彼此相关联。
以下是本文所包含任务的概述:
1、创建 Windows 应用程序项目。
2、显示用作初始选定内容的数据列表。
3、返回与选定记录相关的记录。
4、浏览多个表和多个相关结构,并在运行时直接访问数据集中的数据。
此外,本文还介绍一些相关的任务:
1、为数据表添加基于相关数据的表达式列。
2、生成相关数据的合计信息。
前提条件
要充分理解本文,您应该具有:
●基本的关系数据库概念的知识。
●与罗斯文示例数据库的有效连接,以便您能够创建和运行应用程序。
●大体上熟悉 ADO.NET 数据集。
重要的数据对象
要使用数据集中的相关记录,您应基本了解 .NET 框架 System.Data 命名空间中的几个对象以及它们如何相互作用。这些对象协同工作以提供数据集中的导航功能。
以下对象用于表达数据集中的关系:
●DataSet - 在内存中表示数据,可以包含多个可与 DataRelation 对象相关的 DataTable 对象。
●DataTable - 表示一个完整的数据表。数据表的架构是由构成该表的 DataColumnCollection 定义的。当两个数据表相关时,DataRelation 对象使用每个表中的 DataColumn 来关联数据。
●DataRelation - 连接多个表,以便浏览相关表中的记录。访问相关记录时,DataRelation 对象被传递给 GetChildRows 或 GetParentRow 方法。DataRelation 对象确定所要查询的相关表,以便返回与 GetChildRows 或 GetParentRow 方法调用相关联的相关数据。
●DataRow - 表示数据的一个单独的记录。用于返回相关数据的 GetChildRows 方法和 GetParentRow 方法是 DataRow 对象的成员。
●DataColumn - 表示一个单独的字段,结合在一起时将定义 DataTable 的架构。当两个数据表相关时,DataRelation 对象使用每个表中的数据列来关联数据。
创建应用程序
本节将建立这一演练的起点。随后的步骤将创建数据连接、数据适配器和包含相关表的数据集,以及几个选择和显示数据的控件。
创建新的 Windows 应用程序
1、从 File(文件)菜单中,指向 New(新建),并选择 Project(项目)。将显示 New Project(新建项目)对话框。
2、在 Project Types(项目类型)窗格中,根据您需要的编程语言,选择 Visual Basic Projects(Visual Basic 项目)或 Visual C# Projects(Visual C# 项目)。
3、在 Templates(模板)窗格中,选择 Windows Application(Windows 应用程序),并将其命名为 DataRelationExample,然后单击 OK(确定)。
DataRelationExample 项目将添加到 Solution Explorer(解决方案资源管理器)中。
连接到数据库
此连接允许您与 Visual Studio? 集成开发环境 (IDE) 中的数据源进行通讯。
连接到 Server Explorer(服务器资源管理器)中的罗斯文示例数据库
1、在 Server Explorer(服务器资源管理器)中,建立连接到罗斯文示例数据库的数据连接。
2、在 Server Explorer(服务器资源管理器)中展开罗斯文数据连接,直到可以看到所有的表。
创建数据适配器和连接
此步骤创建用于在应用程序和数据源之间连接和交换数据的连接和数据适配器。
创建数据适配器和连接
1、将“客户”表从 Server Explorer(服务器资源管理器)中拖到窗体上。组件栏中将显示连接和数据适配器。
2、选择 Connection(连接)并将 Name 属性设置为 dcNorthwind.
3、选择数据适配器并将 Name 属性设置为 daCustomers.
4、将“订单”表从 Server Explorer(服务器资源管理器)中拖到窗体上。组件栏中将显示第二个数据适配器。
5、选择新的数据适配器并将 Name 属性设置为 daOrders.
生成数据集
使用刚刚添加到窗体上的数据适配器生成包含客户表和订单表的数据集。
生成将包含相关数据表的数据集
1、从 Data(数据)菜单中,选择 Generate Dataset(生成数据集)。将显示 Generate Dataset(生成数据集)对话框。
提示:将光标移到窗体上即可使用 Data(数据)菜单。
2、单击 New(新建)并将数据集命名为 dsNorthwind.
3、选择客户表和订单表。
4、选择 Add this dataset to the designer(将此数据集添加到设计器)复选框,然后单击 OK(确定)。
Solution Explorer(解决方案资源管理器)的项目中将添加一个名为 dsNorthwind.xsd 的文件,并且组件栏中将显示该数据集的一个实例。
创建关系
生成数据集并不能自动创建数据集中各表之间的关系。关系可以通过编程创建,也可以使用 XML Designer(XML 设计器)直观地创建。本文使用 XML Designer(XML 设计器)。
创建客户表和订单表之间的关系
1、在 Solution Explorer(解决方案资源管理器)中,双击 dsNorthwind.xsd 文件。文件将在 XML Designer(XML 设计器)中打开。
2、从工具栏的 XML Schema(XML 架构)选项卡中,将 Relation(关系)拖到订单表上。
3、在 Edit Relation(编辑关系)对话框中,设置以下属性:
元素 设置
Name CustomersOrders
Parent Customers
Child Orders
Key Fields CustomerID
Foreign Key Fields CustomerID
4、单击 OK(确定)以创建关系并关闭对话框。
5、从 File(文件)菜单中,选择 Save All(全部保存)以保存该项目。
显示数据
此应用程序使用组合框、列表框和 RTF 文本框来选择和显示数据。
添加选择和显示数据的控件
1、在 Solution Explorer(解决方案资源管理器)中,右键单击 Form1(。cs 或 .VB,取决于应用程序的语言),然后从快捷菜单中选择 View Designer(视图设计器)。
2、在窗体的左半部,添加一个 ListBox 控件,并将其 Name 属性设置为 lbOrders.
3、在窗体的右半部,添加一个 RichTextBox 控件,并将其 Name 属性设置为 rtbDetails.
4、在列表框的上方,添加一个 ComboBox 控件,并将其 Name 属性设置为 cbCustomers.
5、保存项目。
图 1:建议的窗体控件布局
现在,可以开始向应用程序添加功能了。
设置显示公司名称的组合框
●选择组合框 (cbCustomers) 并设置以下属性:
属性 设置
DataSource DsNorthwind1
DisplayMember Customers.CompanyName
ValueMember Customers.CustomerID
用数据填充表
要用数据填充表,必须为应用程序添加代码。
在数据集 (dsNorthwind1) 中的客户表和订单表中填充数据
1、双击窗体上的一块空白区域,为 Form1_Load 事件创建事件处理程序。
2、添加以下代码:
' Visual Basic
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' 关闭数据集中的约束。
DsNorthwind1.EnforceConstraints = False
' 用数据填充表。
daOrders.Fill(DsNorthwind1)
daCustomers.Fill(DsNorthwind1)
' 重新开启约束。
DsNorthwind1.EnforceConstraints = True
End Sub
// C#
private void Form1_Load(object sender, System.EventArgs e)
{
// 关闭数据集中的约束。
dsNorthwind1.EnforceConstraints = false;
// 用数据填充表。
daOrders.Fill(dsNorthwind1);
daCustomers.Fill(dsNorthwind1);
// 重新开启约束。
dsNorthwind1.EnforceConstraints = true;
}
3、保存项目。
4、按 F5 键运行该应用程序。现在组合框中包含一个公司名称列表。
5、关闭窗体。
在两个表中浏览相关记录
这里简要介绍一下如何在数据集中构成一对多关系的两个表之间访问数据。在选择一个数据行之后,可以通过调用 GetChildRows 或 GetParentRow 方法并向该数据行传递适当的数据关系来返回其相关记录。
注意:GetChildRows 方法将以 DataRow 对象数组的形式返回数据,而 GetParentRow 方法只返回一个单个的数据行。
要演示这一功能,需要给应用程序添加一些代码,以返回组合框中选定客户的所有订单(子行)。更改组合框中的选定客户会引发 ComboBox.SelectedIndExchanged 事件,列表框中将填充该选定客户的每个订单的订单 ID.
您可以根据组合框中选定的客户,调用 GetChildRows 方法。订单表中的所有相关记录都将分配给名为 draOrders 的数据行数组。
注意:下一节将添加在列表框中显示相关订单列表的功能。为确认数组中确实包含相关的记录,数组的长度(即选定客户的订单总数)将显示为窗体的标题。
创建获取选定客户的订单的事件处理程序
1、在 Solution Explorer(解决方案资源管理器)中,右键单击 Form1 并从快捷菜单中选择 View Designer(视图设计器)。
2、双击组合框为 SelectedIndexChanged 事件创建事件处理程序。
3、添加以下代码:
' Visual Basic
Private Sub cbCustomers_SelectedIndexChanged _
(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cbCustomers.SelectedIndexChanged
' 声明一个用来保存选定客户的客户 ID 的字符串。
Dim SelectedCustomerID As String
SelectedCustomerID = cbCustomers.SelectedValue.ToString()
' 声明一个用来保存选定客户的记录的数据行。
Dim drSelectedCustomer As DataRow
drSelectedCustomer = _
DsNorthwind1.Customers.FindByCustomerID _
(SelectedCustomerID)
' 声明一个用来保存相关记录的数据行数组。
Dim draOrders As DataRow()
draOrders = drSelectedCustomer.GetChildRows("CustomersOrders")
' 在窗体标题中显示数组的长度(订单数)
' 和客户 ID。
Me.Text = draOrders.Length.ToString() & " 订单所有者 " & _
SelectedCustomerID
End Sub
// C#
private void cbCustomers_SelectedIndexChanged
(object sender, System.EventArgs e)
{
// 声明一个用来保存选定客户的客户 ID 的字符串。
String SelectedCustomerID;
SelectedCustomerID = cbCustomers.SelectedValue.ToString();
// 声明一个用来保存选定客户的记录的数据行。
DataRow drSelectedCustomer;
drSelectedCustomer =
dsNorthwind1.Customers.FindByCustomerID(SelectedCustomerID);
// 声明一个用来保存相关记录的数据行数组。
DataRow[] draOrders;
draOrders = drSelectedCustomer.GetChildRows("CustomersOrders");
// 在窗体标题中显示数组的长度(订单数)
// 和客户 ID。
this.Text = draOrders.Length.ToString() +
" 订单所有者 " + SelectedCustomerID;
}
4、保存项目。
5、运行应用程序。
选择另一个客户,并检查窗体标题。将显示选定客户的订单总数及其客户 ID.
6、关闭窗体。
显示相关记录
现在您已经有了选定客户的相关记录(存储在数据行数组中),您可以显示它们以便与用户进行交互。应用程序将逐一访问 GetChildRows 方法返回的数据行数组中的数据,并将每个相关记录的“订单 ID”作为单独的项添加到列表框中。
注意