分享
 
 
 

在ADO.NET数据集中浏览多个相关表

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

摘要: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”作为单独的项添加到列表框中。

注意

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有