首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

21.5.4  数据约束

DataTable擅长于改变在客户机上创建的列的数据类型。ADO.NET允许在列上创建一些约束,对数据应用一些规则。

运行库目前支持表21-7所示的约束类型,它们包含在System.Data命名空间的类中。

  21-7

   

    

ForeignKeyConstraint

DataSet的两个DataTable之间建立链接

UniqueConstraint

确保给定的列是惟一的

 

1. 设置主键码

在关系数据库中的表中,可以提供一个主键码,该主键码可以基于DataTable中的一个或多个列。

下面的代码为Product表创建了一个主键码,其模式是前面手工构建的。

表上的主键码只是约束的一种形式。当主键码添加到DataTable中时,运行也会对键码列生成一个惟一的约束。这是因为并没有PrimaryKey约束类型,主键码是一个或多个列上的惟一约束。

public static void ManufacturePrimaryKey(DataTable dt)

{

   DataColumn[] pk = new DataColumn[1];

   pk[0] = dt.Columns["ProductID"];

   dt.PrimaryKey = pk;

}

因为主键码可以包含几个列,所以它可以作为一组DataColumn键入。通过给表的一组列指定属性,就可以给这些列设置主键码。

要检查表中的约束,可以迭代ConstraintsCollection。上述代码自动生成的约束是Constraint1,它没有什么用,应避免这种情况,最好先在代码中创建约束,然后定义组成主键码的列。

创建主键码之前,下面的代码给约束命名:

DataColumn[] pk = new DataColumn[1];

pk[0] = dt.Columns["ProductID"];

dt.Constraints.Add(new UniqueConstraint("PK_Products", pk[0]));

dt.PrimaryKey = pk;

惟一约束可以应用到任意多的列上。

2. 设置外键码

除了惟一约束外,DataTable类还可以包含外键码约束,它们主要用于建立主/从关系,如果正确建立了约束,Foreign Key约束还可以在表之间复制列。在主/从关系的表中,常常有一个父记录(Order)和许多子记录(Order Line),它们是通过父记录的主键码链接起来的。

外键码约束只能用于同一个DataSet中的表,所以下面的示例使用Northwind数据库中的Categories表,给该表和Products表之间指定约束,如图21-8所示。

  21-8

第一步是为Categories表生成一个新的数据表:

DataTable categories = new DataTable("Categories");

categories.Columns.Add(new DataColumn("CategoryID", typeof(int)));

categories.Columns.Add(new DataColumn("CategoryName", typeof(string)));

categories.Columns.Add(new DataColumn("Description", typeof(string)));

categories.Constraints.Add(new UniqueConstraint("PK_Categories",

                               categories.Columns["CategoryID"]));

categories.PrimaryKey = new DataColumn[1]

                              {categories.Columns["CategoryID"]};

上述代码的最后一行为Categories表创建了主键码。在本例中,主键码是一个单列,但可以使用数组语法在多个列上生成一个键码。

然后,需要在两个表之间创建约束:

DataColumn parent = ds.Tables["Categories"].Columns["CategoryID"];

DataColumn child = ds.Tables["Products"].Columns["CategoryID"];

ForeignKeyConstraint fk =

   new ForeignKeyConstraint("FK_Product_CategoryID", parent, child);

fk.UpdateRule = Rule.Cascade;

fk.DeleteRule = Rule.SetNull;

ds.Tables["Products"].Constraints.Add(fk);

这个约束应用到Categories.CategoryIDProducts.CategoryID之间的链接上。有4个不同的ForeignKeyConstraint,但应使用可以给约束命名的ForeignKeyConstraint

3. 设置更新和删除约束

除了在父表和子表之间定义约束之外,还可以在更新约束中的一个列时定义应执行的操作。

上面的示例设置了更新规则和删除规则,在对父表中的列(或行)执行某种操作时,使用这些规则,以确定应对子表中的行进行什么操作。通过Rule枚举可以应用4种不同的规则:

       Cascade—— 如果更新了父键,就应把新的键值复制到所有的子记录上。如果删除了父记录,也将删除子记录,这是默认选项。

       None—— 不执行任何操作,这个选项会留下子数据表中的孤立行。

       SetDefault—— 如果定义了一个子记录,那么每个受影响的子记录都把外键码列设置为其默认值。

       SetNull—— 所有的子行都把主列设置为DBNull(按照Microsoft选择的命名约定,主列应是SetDBNull)

提示:

如果EnforceConstraints属性为true,约束就只能在DataSet中使用。

前面介绍了组成DataSet中约束部分的主类,解释了如何在代码中手工生成这些类。还可以使用.NET附带的XML模式文件和XSD工具定义DataTableDataRowDataColumnDataRelation Constraint。下一节将说明如何建立一个简单的模式,以及如何生成类型安全的类,以访问数据。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论