[导入]创建带有表、键和一对多关系的数据集

在本演练中,您将创建一个数据集来验证一对多关系(一对多关系也可称为键控关系)中的数据。它将带您完成创建新的 Visual Basic 项目或 Visual C# 项目并向其添加新的数据集项的过程。然后您将创建表示带有列的数据表的复杂类型元素。您将学习如何在表中定义主键。最后您将学习如何基于所定义键创建表间关系。完成后,您将能够检查由“XML 设计器”创建的基础 XML 代码,以理解数据集用本机 XML 表达键控关系的方式。

本演练将包括创建表、主键和关系,由下面概述的三个主要节组成:

  1. 向项目添加一个数据集并创建三个表。
    1. 创建 Customers 表。
    2. 创建 Orders 表。
    3. 创建 OrderDetails 表。
  2. 创建两个主键。
    1. 在 Customers 表中创建主键。
    2. 在 Orders 表中创建主键。
  3. 创建两个关系(DataRelation 对象)。
    1. 在 Customers 表(一)和 Orders 表(多)之间创建关系。
    2. 在 Orders 表(一)和 OrderDetails 表(多)之间创建关系。

创建新的 Windows 应用程序项目并向它添加新的数据集

创建和命名新项目

  1. 从“文件”菜单中指向“新建”,然后单击“项目”以显示“新建项目”对话框。
  2. 根据要使用的语言,在“项目类型”窗格中选择“Visual Basic 项目”或“Visual C# 项目”,然后选择“Windows 应用程序”。
  3. 将项目命名为“KeyedRelationshipWalkthrough”,然后单击“确定”以创建该项目。

因为本演练需要一个数据集,因此您需要向项目添加一个数据集。

向项目添加新的数据集项

  1. 从“项目”菜单中选择“添加新项”。

    出现“添加新项”对话框。

  2. 从“添加新项”对话框的“模板”区域选择“数据集”。
  3. 将数据集命名为“CustomerOrders”,单击“打开”。

    Visual Studio 将名为“CustomerOrders.xsd”(Visual Basic) 和“CustomerOrders.vb”(Visual Basic) 或“CustomerOrders.cs”(Visual C#) 的文件添加到该项目并自动将其加载到设计器中。

  4. 从“项目”菜单中选择“显示所有文件”(如果其尚未选中)。(选中时图标周围将有可视边框)
  5. 在解决方案资源管理器中,展开“CustomerOrders.xsd”节点。

    您现在将可以看到在前面的步骤 3 中创建的“CustomerOrders.vb”(Visual Basic) 或“CustomerOrders.cs”(Visual C#) 文件了。它实际是数据集,更准确地说是数据集类。“CustomerOrders.xsd”文件是定义数据集结构的 XML 架构。

在数据集内创建三个表

本节将解释如何向数据集添加代表数据表的元素。

创建 Customers 表

  1. 从“工具箱”的“XML 架构”选项卡中选择一个“element”,并将它放到设计器上。
  2. 在“E”右边的顶端单元格中突出显示默认名称“element1”,键入“Customers”。
  3. 使用 TAB 键定位到下一行的中心单元格,并键入“CustomerID”。数据类型对于该元素是字符串,这是默认值,因此您可以保留该设置。但是,如果需要分配的数据类型不是字符串,则可使用 TAB 键定位到所需元素右侧的下拉列表,选择适当数据类型。
    注意   还请注意您跳过显示“element1”的单元格左边的小单元格的情况。您在该单元格中选择其他类型元素,如属性等等。由于默认值是代表元素的“E”,因此也可以保留该设置。
  4. 重复第 3 步,以在“客户”(Customers) 元素中为下列项创建新行:
    元素名称 数据类型
    CompanyName string
    ContactName string
    ContactTitle string
    Address string
    City string
    Region string
    PostalCode string

创建 Orders 表

  1. 从“工具箱”的“XML 架构”选项卡中选择一个元素,并将它放到设计器上。
  2. 在“E”右边的顶端单元格中突出显示默认名称“element1”,然后键入“Orders”。
  3. 使用 TAB 键定位到下一行的中心单元格并键入“OrderID”,然后将数据类型设置为 string。
  4. 重复步骤 3,并在 Orders 元素中为下列项创建新行:
    元素名称 数据类型
    CustomerID string
    OrderDate date
    ShippedDate date
    ShipVia string

创建 OrderDetails 表

  1. 从“工具箱”的“XML 架构”选项卡中选择一个元素,并将它放到设计器上。
  2. 在“E”右边的顶端单元格中突出显示默认名称“element1”,然后键入“OrderDetails”。
  3. 使用 TAB 键定位到下一行的中心单元格并键入“OrderID”,然后将数据类型设置为 string。
  4. 重复步骤 3,并在 OrderDetails 元素中为下列项创建新行:
    元素名称 数据类型
    ProductID integer
    UnitPrice decimal
    Quantity short

在表中创建两个主键

本节将解释如何将前一节中创建的表中的列指定为主键。若要创建关系,您必须在父表中至少定义一个键(父表是表示一对多关系中单方的表)。

在 Customers 表中创建主键

  1. 在“Customers”表中,通过单击“E”左侧来选择“CustomerID”行。
  2. 右击,指向“添加”,然后从快捷菜单中选择“新建 Key”。
  3. 出现“编辑键”对话框。
  4. 将键的名称更改为“CustomersIDKey”。
  5. “Element”下拉列表框应设置为“Customers”,指示您在 Customers 表中。
    注意   “Customers”表就是定义为复杂类型的 Customers 元素;它是表示 XML 架构和数据集内的表的复杂类型元素。有关更多信息,请参见在 XML 架构和数据集内创建一对多关系
  6. 在“字段”区域中,从下拉列表中选择“CustomerID”。如果右击“CustomerID”行来添加键,那么这应是默认值;如果单击另一行,那么将需要选择 CustomerID 元素。
    注意   可以在“字段”区域中选择要将哪个元素(在表元素的复杂类型定义内)定义为键。
  7. 选择“数据集主键”复选框,以将该键定义为主键。
    注意   如果未选中“数据集主键”复选框,那么会将该键定义为唯一键而不是主键。
  8. 单击“确定”关闭“编辑键”对话框。

    “CustomerID”行上将放置键图标来标识其为键。

在 Orders 表中创建主键

  1. 在“Orders”表中,通过单击“E”左侧来选择“OrderID”行。
  2. 右击选定的行,指向“添加”,并从快捷菜单中选择“新建 key”。

    出现“编辑键”对话框。

  3. 将键名称更改为“OrdersIDKey”。
  4. “element”下拉框应设置为“Orders”,指示您在 Orders 表中。
  5. 在“字段”区域中,从下拉列表中选择“OrderID”。如果您在 OrderID 行上右击以添加该键,这应是默认值。如果您在不同行上单击,将需要选择正确的元素。
  6. 选择“数据集主键”复选框,以将该键定义为主键。
  7. 单击“确定”关闭“编辑键”对话框。

    “OrderID”行上将放置键图标来标识其为键。

您现在已对键进行了定义,这些键将用于定义表间关系。您可能想知道为何不在“OrderDetails”表中定义键。本节开始曾说明:“若要创建关系,您必须在父表中至少定义一个键(父表是表示一对多关系中单方的表)。”“OrderDetails”表在该数据集内不表示任何关系的单方,因此不需要键定义。

创建表间的两个关系

关系是一个表中的键控列与在另一个表中有关联列的许多记录之间的关联。在 XML 架构中,用 keyref 元素定义关系。本节将解释如何定义这些关系。

创建 Customers 表和 Orders 表之间的关系(DataRelation 对象)

  1. 右击“Orders”表中的任意位置,指向“添加”,然后从快捷菜单中选择“新建关系”。

    出现“编辑关系”对话框。

    注意   确保将“新建关系”添加到表示一对多关系中多方的表中(在本例中将 Relation 添加到 Orders 表中)。
  2. “编辑关系”对话框分配默认名称“CustomersOrders”。您可以保留该名称。
  3. “父元素”应设置为“Customers”。父级是表示一对多关系中单方的元素(或表)。在此情况下,“Customers”表表示一对多关系中的单方。
  4. “子元素”应设置为“Orders”。子级是表示一对多关系中多方的元素(或表)。在此情况下,“Orders”表表示一对多关系中的多方。
  5. “键”应设置为以前定义的“CustomersIDKey”。
    注意   当创建一对多关系时,键定义需要在父表中,因为父表是包含唯一值的表。
  6. 键字段是只读字段,包含键定义中定义的一个或多个键列。
    注意   多部分键是具有一个表中多个列的键定义,这些列都是该键定义的组成部分。如果在“CustomersIDKey”中定义了一个多部分键,那么所有列(或字段)都将列在该键字段区域。本演练不包含任何多部分键。
  7. 可以在“外键字段”区域中选择子表中等效于父表中的键的字段。该字段应设置为“CustomerID”,以匹配父表中的键字段。
  8. 单击“确定”接受其他默认设置。

    将创建一个 dataRelation 对象,并且设计图面上将显示可视表示形式。

在 Orders 和 OrderDetails 表之间创建关系(DataRelation 对象)

  1. 右击“OrderDetails”表中的任意位置,指向“添加”,然后从快捷菜单中选择“新建关系”。

    出现“编辑关系”对话框。

    注意   确保将“新建关系”添加到表示一对多关系中多方的表(在本例中将 Relation 添加到 OrderDetails 表中)。
  2. 将“CustomersOrderDetails”的默认名称更改为“OrdersOrderDetails”以在关系中反映正确的表。
  3. “父元素”应设置为“Orders”。
  4. “子元素”应设置为“OrderDetails”。
  5. “键”应设置为以前定义的“OrdersIDKey”。

    键字段是只读字段,包含第 5 步中选定的键定义中定义的一个或多个键列。

  6. 可以在“外键字段”区域中选择子表中等效于父表中的键的字段。确认该字段设置为“OrderID”,以匹配父表中的键字段。
  7. 单击“确定”接受其他默认设置。

    将创建一个 dataRelation 对象,并且设计图面上将显示可视表示形式。

您的数据集在“XML 设计器”中应显示为:

您刚刚在数据集内创建了三个相关表。如果您切换到 XML 视图,则代码应等效于以下内容。重要的是要注意本机 XML 在一对多(或键控)关系模型中的组织方式。如您所看到的,CustomersOrdersOrderDetails 都作为 CustomerOrders 元素的直接子级位于层次结构中的同一级别。表示数据集的就是该 CustomerOrders 元素。

注意   请注意那些键是如何分层定义为 CustomerOrders 元素的子级的。理解为何键定义并非作为嵌套子级位于表示表(在该表内定义该键)的元素内十分重要。如果键定义作为嵌套子级位于元素内,则该键将只对各个记录唯一,而不是对表中所有记录唯一。通过在数据集本身(CustomerOrders 元素)内定义键,该键可控制在整个数据集内具有唯一性。
<xs:schema id="CustomerOrders" targetNamespace="http://tempuri.org/CustomerOrders.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/CustomerOrders.xsd" xmlns:mstns="http://tempuri.org/CustomersOrders.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="CustomerOrders" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Customers">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerID" type="xs:string" minOccurs="0" />
<xs:element name="CompanyName" type="xs:string" minOccurs="0" />
<xs:element name="ContactName" type="xs:string" minOccurs="0" />
<xs:element name="ContactTitle" type="xs:string" minOccurs="0" />
<xs:element name="Address" type="xs:string" minOccurs="0" />
<xs:element name="City" type="xs:string" minOccurs="0" />
<xs:element name="Region" type="xs:string" minOccurs="0" />
<xs:element name="PostalCode" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Orders">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderID" type="xs:string" minOccurs="0" />
<xs:element name="CustomerID" type="xs:string" minOccurs="0" />
<xs:element name="OrderDate" type="xs:date" minOccurs="0" />
<xs:element name="ShippedDate" type="xs:date" minOccurs="0" />
<xs:element name="ShipVia" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="OrderDetails">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderID" type="xs:string" minOccurs="0" />
<xs:element name="ProductID" type="xs:integer" minOccurs="0" />
<xs:element name="UnitPrice" type="xs:decimal" minOccurs="0" />
<xs:element name="Quantity" type="xs:short" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="CustomersIDKey" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Customers" />
<xs:field xpath="mstns:CustomerID" />
</xs:key>
<xs:key name="OrdersIDKey" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Orders" />
<xs:field xpath="mstns:OrderID" />
</xs:key>
<xs:keyref name="CustomersOrders" refer="CustomersIDKey">
<xs:selector xpath=".//mstns:Orders" />
<xs:field xpath="mstns:CustomerID" />
</xs:keyref>
<xs:keyref name="OrdersOrderDetails" refer="OrdersIDKey">
<xs:selector xpath=".//mstns:OrderDetails" />
<xs:field xpath="mstns:OrderID" />
</xs:keyref>  </xs:element>
</xs:schema>


suiqirui 2007-06-03 22:33 发表评论

文章来源:http://www.cnblogs.com/suiqirui19872005/articles/769683.html

posted on 2007-06-19 15:08  温温恭人  阅读(314)  评论(1编辑  收藏  举报

导航