DataTable对象
下面的代码演示了如何在DataSet中创建表:
DataSet ds = new DataSet();
// 创建表
DataTable table = new DataTable(“Employees”);
table.Columns.Add(“ID”, typeof ( int ));
table.Columns.Add(“Name”, typeof ( string ));
// 添加行数据
DataRow row = table.NewRow();
row[“ID”] = 1 ;
row[“Name”] = “Joe”;
table.Rows.Add(row);
// 将表添加到DataSet中
ds.Tables.Add(table);
EntendedProperties集合由多个ADO.NET对象共享,用于管理键值对,能接受object类型值。
DataTable类的方法见下表:
DataTable实现了IXmlSerializable接口,它提供了几种公共方法,可将DataTable的内容保存为XML流,也可从中加载。对该接口的实现也是DataTable可用作.NET Web服务方法的参数和返回值的原因。
Select方法针对表实现了一种简单而有效的查询引擎,查询结果为DataRow对象的数组。示例:
table.Select(“ID > 5 and Name like ‘A % ’”);
示例代码:
int num = ( int )table.Compute(“Count(ID)”, “ Name like ‘A % ’”);
DataColumn对象有名称和类型,还可与表达式进行关联。基于表达式的列的内容是函数,包含若干用运算符结合的列名。当基于表达式的列被创建后,ADO.NET会事先计算并缓存该列的值。ADO.NET会跟踪表达式所涉及的列,监视它们的更改。这需要在一个DataTable内部的RowChanged事件处理程序中注册。如果某行的相关列被更改,曾经计算的值会被自动刷新。
表中的数据是由DataRow对象的集合承载,行有值和状态,还可能包含错误信息。DataTable能维护行的不同版本,可随时通过Item访问器属性查询某一版本。如下所示:
Response.Write(row[“Name”, DataRowVersion.Original].ToString());
DataRow类未公开构造函数,数据行的创建只能基于DataTable的NewRow方法。
// 添加行数据
DataRow row = table.NewRow();
row[“ID”] = 1 ;
row[“Name”] = “Joe”;
table.Rows.Add(row);
表约束
约束是设置在表上的逻辑规则,用于确保数据的完整性。.NET支持两种类型的约束,分别为ForeignKeyConstraint(外键约束)和UniqueConstraint(唯一约束)。
外键约束示例代码:
DataColumn c1 = tableEmp.Columns(“empID”);
DataColumn c2 = tableOrd.Columns(“empID”);
ForeignKeyConstraint fk = new ForeignKeyConstraint(“EmpOrders”, c1, c2);
tableOrd.Constraint.Add(fk);
唯一约束示例代码:
UniqueConstraint uc = new UniqueConstraint(tableEmp.Columns(“empID”));
tableEmp.Constraints.Add(uc);
通过将列对象的Unique属性设为true,可隐式地创建唯一约束。此外,如果将某列加到表的主键集合中,则会自动创建该列的唯一约束。DataTable对象中的主键是一组DataColumn对象。
数据关系
数据关系代表同一DataSet中DataTable对象间的父/子关系。数据关系用DataRelation对象表示。
DataRelation被创建后,会有两个约束对象随之创建:
1. 设置在子表上的外键约束,该约束以两个列对象为参数生成关系。
2. 父表会被设置一个唯一约束,防止其拥有重复记录。
示例代码:
DataColumn c1 = tableEmp.Columns(“empID”);
DataColumn c2 = tableOrd.Columns(“empID”);
DataRelation rel = new DataRelation(“Emp2Orders”, c1, c2);
DataSet.Relations.Add(rel);
示例代码:
foreach (DataRow childRow in parentRow.GetChildRows(“Emp2Orders”))
{
// 处理子表中的相关行
}
关系的计算
在实际的应用程序中,我们往往要管理两个相关的表,在给定父记录的情况下,对子记录的子集进行处理。许多情况下,对子记录的处理无非是对其进行聚合计算。ADO.NET正好提供了这种功能,包括“关系”在内。
以雇员/订单关系为例:
tableEmp.Columns.Add(“Total”, typeof ( int ), “Sum(child(Emp2Orders).Amount)”);
DataView对象
DataView类代表DataTable的自定义视图。DataTable对象作为文档,DataView充当视图。
DataView类的主要属性如下:
RowStateFilter属性能够接受来自DataViewRowState枚举的值,使我们能够基于行的当前值或原始值进行筛选,也可针对被更改、添加或删除的记录。RowFilter属性支持的语法与DataTable的Select方法相同。
DataView不含表中记录的副本,而仅限于存储索引,它会随着筛选属性的设置而更新。下表列出了DataView的方法:
AddNew和Delete都会影响底层的DataTable对象。
DataView对象的内容可通过各种编程接口进行遍历。具体来讲,GetEnumerator方法可使我们通过for…each语句对所有记录进行遍历。示例代码:
DataView myView = new DataView(table);
foreach (DataRowView rowview in myView)
{
DataRow row = rowview.Row;
……
}