ASP.NET 3.5核心编程学习笔记(16):DataTable、DataView

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);
  DataTable类的属性见下表:

 ASP.NET 3.5核心编程学习笔记(16):DataTable、DataView_第1张图片

  EntendedProperties集合由多个ADO.NET对象共享,用于管理键值对,能接受object类型值。

  DataTable类的方法见下表:

 ASP.NET 3.5核心编程学习笔记(16):DataTable、DataView_第2张图片

  DataTable实现了IXmlSerializable接口,它提供了几种公共方法,可将DataTable的内容保存为XML流,也可从中加载。对该接口的实现也是DataTable可用作.NET Web服务方法的参数和返回值的原因。

  Select方法针对表实现了一种简单而有效的查询引擎,查询结果为DataRow对象的数组。示例:

  
  
  table.Select(“ID > 5 and Name like ‘A % ’”);
  DataTable类的Compute方法能够查找满足筛选条件的行,并计算出表达式的值。该表达式不仅可包含任何形式的布尔和数学运算符,还可包含聚合函数和一些统计运算符。

  示例代码:

  
  
   int num = ( int )table.Compute(“Count(ID)”, “ Name like ‘A % ’”);
DataColumn对象代表DataTable对象中列的模式。

  DataColumn对象有名称和类型,还可与表达式进行关联。基于表达式的列的内容是函数,包含若干用运算符结合的列名。当基于表达式的列被创建后,ADO.NET会事先计算并缓存该列的值。ADO.NET会跟踪表达式所涉及的列,监视它们的更改。这需要在一个DataTable内部的RowChanged事件处理程序中注册。如果某行的相关列被更改,曾经计算的值会被自动刷新。

  表中的数据是由DataRow对象的集合承载,行有值和状态,还可能包含错误信息。DataTable能维护行的不同版本,可随时通过Item访问器属性查询某一版本。如下所示:

  
  
  Response.Write(row[“Name”, DataRowVersion.Original].ToString());
  若要访问某行所有的数据,可使用ItemArray属性,它返回一个object类型的数组,每个元素对应一列。

  DataRow类未公开构造函数,数据行的创建只能基于DataTable的NewRow方法。

  
  
   // 添加行数据
DataRow row = table.NewRow();
row[“ID”]
= 1 ;
row[“Name”]
= “Joe”;
table.Rows.Add(row);
  注意,DataRow对象在同一时刻不能与多个表关联,为将某个行加载到另一表中,可使用DataTable的ImportRow方法,该方法复制这个DataRow对象,并将其加到指定的表中。Remove方法可将某行分离出去。如果使用Delete方法,行会标记为删除,但仍是表的一部分。

表约束

       约束是设置在表上的逻辑规则,用于确保数据的完整性。.NET支持两种类型的约束,分别为ForeignKeyConstraint(外键约束)和UniqueConstraint(唯一约束)。

       外键约束示例代码:

  
  
DataColumn c1 = tableEmp.Columns(“empID”);
DataColumn c2
= tableOrd.Columns(“empID”);
ForeignKeyConstraint fk
= new ForeignKeyConstraint(“EmpOrders”, c1, c2);
tableOrd.Constraint.Add(fk);
       外键约束应添加到子表中,通过UpdateRule、DeleteRule、AcceptRejectRule属性来配置。

   唯一约束示例代码:

  
  
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);
  ADO.NET提供了一种自动机制,可以方便地获取相关行。DataRow类的GetChildRows方法接受一个关系对象,返回的是所有匹配的DataRow对象的数组。

  示例代码:

  
  
foreach (DataRow childRow in parentRow.GetChildRows(“Emp2Orders”))

{
// 处理子表中的相关行
}

关系的计算

       在实际的应用程序中,我们往往要管理两个相关的表,在给定父记录的情况下,对子记录的子集进行处理。许多情况下,对子记录的处理无非是对其进行聚合计算。ADO.NET正好提供了这种功能,包括“关系”在内。

       以雇员/订单关系为例:

  
  
tableEmp.Columns.Add(“Total”, typeof ( int ), “Sum(child(Emp2Orders).Amount)”);
       对于每个雇员,该列(Total)包含的值代表当前关系子记录Amount列的和,换言之,该列能自动计算每个雇员的订单总数。关键字child是ADO.NET表达式支持的特殊语言元素。

DataView对象

       DataView类代表DataTable的自定义视图。DataTable对象作为文档,DataView充当视图。

       DataView类的主要属性如下:

 ASP.NET 3.5核心编程学习笔记(16):DataTable、DataView_第3张图片

       RowStateFilter属性能够接受来自DataViewRowState枚举的值,使我们能够基于行的当前值或原始值进行筛选,也可针对被更改、添加或删除的记录。RowFilter属性支持的语法与DataTable的Select方法相同。

       DataView不含表中记录的副本,而仅限于存储索引,它会随着筛选属性的设置而更新。下表列出了DataView的方法:

 ASP.NET 3.5核心编程学习笔记(16):DataTable、DataView_第4张图片

       AddNew和Delete都会影响底层的DataTable对象。

       DataView对象的内容可通过各种编程接口进行遍历。具体来讲,GetEnumerator方法可使我们通过for…each语句对所有记录进行遍历。示例代码:

  
  
DataView myView = new DataView(table);
foreach (DataRowView rowview in myView)
{
DataRow row
= rowview.Row;
……
}
  当客户端应用程序访问视图中的某一行时,DataView类会在内部的行缓存中找到该行。如果该缓存不为空,指定的行会通过一个中间的DataRowView对象返回给主调程序。DataRowView对象是一种包含实现数据的DataRow对象封装器。我们可通过Row属性访问数据。如果该行缓存为空,DataView类会使用一组DataRowView对象来填充它,每个元素指向原始的DataRow对象。

你可能感兴趣的:(Datatable)