4-2-2 DataTable、DataColumn和DataRow对象
1.DataTable对象
DataTable对象是内存中的一个数据表,主要由DataRow对象和DataColumn对象组成。DataTable对象是组成DataSet对象的主要组件,因DataSet对象可以接收由DataAdapter对象执行SQL指令后所取得的数据,这些数据是DataTable对象的格式,所以DataSet对象也需要许多DataTable对象来储存数据,并可利用DataRows集合对象中的Add方法加入新的数据。DataTable类属于System.Data命名空间,因此要想使用DataTable对象必须引用System.Data命名空间。DataTable对象常用的属性请参见表4-13所示:
表4-13 DataTable对象常用属性表
属性 |
说明 |
Columns |
表示列的集合或DataTable包含的DataColumn |
Constraints |
表示特定DataTable的约束集合 |
DataSet |
表示DataTable所属的数据集 |
PrimaryKey |
表示作为DataTable主键的字段或DataColumn |
Rows |
表示行的集合或DataTable包含的DataRow |
HasChanges |
返回一个布尔值,指示数据集是否更改了 |
DataTable对象常用的方法请参见表4-14所示:
表4-14 DataTable对象常用方法表
方法 |
说明 |
AcceptChanges() |
提交对该表所做的所有修改 |
NewRow() |
添加新的DataRow |
DataTable对象常用的事件请参见表4-15所示:
表4-15 DataTable对象常用事件表
事件 |
说明 |
ColumnChanged |
修改该列中的值时激发该事件 |
RowChanged |
成功编辑行后激发该事件 |
RowDeleted |
成功删除行时激发该事件 |
根据类DataTable构造函数的多种重载,类DataTable的实例化,有两种常用方法:
n 第一种方法
请看下面的代码示例:
DataTable objStudentTable = new DataTable("Students");
创建DataTable对象的实例,以表名字符串作为参数。
n 第二种方法
创建DataTable对象的实例,无参数。创建后,再修改TableName属性,给表设定表名。
此外,请看下面的代码示例:
DataSet studentDS = new DataSet();
DataTable objStudentTable = studentDS.Tables.Add("Students");
创建DataTable的实例,然后将其添加到数据集的Tables集合中。实际编程中常用这种办法,一条代码完成多个任务。
2.DataColumn对象
即数据表的字段,表示DataTable中列的结构,所组成的集合即为DataTable对象中的Columns属性,是组成数据表的最基本单位,其中DataTable的Columns属性含有对DataColumn对象的引用。DataColumn对象常用的属性请参见表4-16所示:
表4-16 DataColumn对象常用属性表
属性 |
说明 |
AllowDBNull |
表示一个值,指示对于该表中的行,此列是否允许null值 |
ColumnName |
表示指定DataColumn的名称 |
DataType |
表示指定DataColumn对象中存储的数据类型 |
DefaultValue |
表示新建行时该列的默认值 |
Table |
表示DataColumn所属的DataTable的名称 |
Unique |
表示DataColumn的值是否必须是唯一的 |
请看下面的使用示例代码:
DataTable objStudentTable = new DataTable("Students");
DataColumn objStudentNumber = objStudentTable.Columns.Add("StudentNo ", typeof(Int32));
objStudentNumber.AllowDBNull = false;
objStudentNumber.DefaultValue = 25;
objStudentTable.Columns.Add("StudentName", typeof(Int32));
objStudentTable.Columns.Add("StudentMarks", typeof(Double));
代码中使用多个DataColumn对象创建DataTable对象的数据结构。
3.DataRow对象
即数据表的元组行,DataRow对象表示DataTable中的一行数据,代表DataTable中的一行实际数据。DataRow对象常用的属性请参见表4-17所示:
表4-17 DataRow对象常用属性表
属性 |
说明 |
Item |
表示DataRow的指定列中存储的值 |
RowState |
表示行的当前状态 |
Table |
表示用于创建DataRow的DataTable的名称 |
DataRow对象常用的方法请参见表4-18所示:
表4-18 DataRow对象常用方法表
方法 |
说明 |
AcceptChanges() |
用于提交自上次调用了AcceptChanges()之后对该行所做的所有修改 |
Delete() |
用于删除DataRow |
RejectChanges() |
用于拒绝自上次调用了AcceptChanges()之后对DataRow所做的所有修改 |
请看下面的使用示例代码:
//定义表结构,为Students表添加属性列
DataTable studt = new DataTable("student");
DataColumn sno = new DataColumn();
sno = studt.Columns.Add("sno", typeof(int));
sno.AllowDBNull = false;
sno.Unique = true;
DataColumn sname = new DataColumn();
sname = studt.Columns.Add("sname", typeof(string));
sname.AllowDBNull = false;
sname.Unique = false;
DataColumn ssex = new DataColumn();
ssex = studt.Columns.Add("ssex", typeof(string));
ssex.AllowDBNull = false;
ssex.Unique = false;
ssex.DefaultValue = "男";
DataColumn sbirthday = new DataColumn();
sbirthday = studt.Columns.Add("sbirthday", typeof(string));
sbirthday.DefaultValue = DateTime.Now.ToLongDateString();
studt.Columns.Add("sclass", typeof(string));
DataRow dr = studt.NewRow();
dr["sno"] = 1001;
dr["sname"] = "张三";
dr["ssex"] = "男";
dr["sbirthday"] = "1980-2-1";
dr["sclass"] = "98002";
studt.Rows.Add(dr);
for (int i = 0; i < studt.Rows.Count; i++)
{
label1.Text = "编号:" + dr["sno"].ToString() + ";姓名:" + dr["sno"].ToString() + ";性别:" + dr["ssex"].ToString() + ";生日:" + dr["sbirthday"].ToString() + ";班级:" + dr["sclass"].ToString();
}
从代码中可以看出,是在DataTable对象中新建DataRow对象的,利用的是DataTable对象的NewRow()方法。
4.如何定义Datatable的主键
根据数据库基本理论,所谓表中的主键用于对记录行进行唯一标识的属性或者属性集合的统称,同样DataTable的主键属性接受含有一个或多个DataColumn对象的数组。
设置单个列为DataTable的主键,请看下面的使用示例代码:
objStudentTable.PrimaryKey = new DataColumn[]{objStudentTable.Columns["StudentNo"]}
代码中将表objStudentTable的"StudentNo"列作为表的主键。
注意:
上面的代码示例中“objStudentTable”是DataTable对象的引用名,DataTable对象还有个表名,如“Student”。前面在讲DataTable实例化时,提到将表名字符串作为参数传给构造函数,这个字符串传给DataTable对象的TableName属性,而TableName属性就是前面所指的表名。DataTable对象引用名和表名不能混为一谈,DataTable对象引用名是以对象角度去考虑数据表,编程中用的较多,而表名是从数据库角度考虑,设计中用的较多。
同样道理,DataColumn对象、DataSet对象也存在同样的情况,请读者使用时留意。
为DataTable对象设置复合主键,请看下面的使用示例代码:
objStudentTable.PrimaryKey = new DataColumn[]{objStudentTable.Columns["StudentNo"], objStudentTable.Columns["StudentName"]};
代码中将表objStudentTable的"StudentNo"列和"StudentName"的组合作为表的主键。
5.DataTable的约束
所谓关系型数据库的约束,实质是数据库理论中三个参照完成整性的规定:实体完整性(主属性非空唯一性),参照完整性(外键可以为空,一旦添加数据则必须受制于主表的主键约束)和用户定义完整性(用户自行规定的属性规则)。DataTable对象的属性Constraints就是用来进行对关系型数据表进行约束的,它里面可以包含若干Constraint对象,每个Constraint对象是这个DataTable对象的一个约束。约束的作用是用于维护数据的正确性和有效性。主要体现在两个方面,请见图4-32所示:
图4-32 应用程序中约束的作用体现图
在ADO.NET中, DataTable对象使用的约束主要分为:外键约束和唯一性约束。见图4-33所示:
图4-33 约束的分类图
其中ForeignKeyConstraint表示删除或更新某个值或行时,对主键/外键关系中一组列强制进行的操作限制。UniqueConstraint表示对一组列的限制,列中的所有值必须是唯一的。