DataTable 是 ADO.NET 库中的核心类。其他使用 DataTable 的对象包括 DataSet 和 DataView。
1、DataTable特点
(1)DataTable 对象是按条件区分大小写的。(如果有两个 DataTable对象分别为“mydatatable”和“Mydatatable”,则搜索表的字符串被认为是区分大小写的。如果只有“mydatatable”而不存在“Mydatatable”,则该搜索表的字符串不区分大小写)。
(2)以编程方式创建 DataTable,须先通过将 DataColumn 对象添加到 DataColumnCollection(通过 Columns 属性访问)中来定义其架构。
(3)向 DataTable 添加行,须使用 NewRow 方法返回新的 DataRow 对象。(DataTable 可存储的最大行数是 16,777,216)。
(4)DataTable 也包含可用于确保数据完整性的 Constraint 对象的集合
(5)DataTable 事件(RowChanged、RowChanging、RowDeleting 和 RowDeleted)可用于确定对表进行更改的时间。
2、添加列
通过使用 DataColumn 构造函数,或通过调用表的 Columns 属性的 Add 方法。 由于 DataTable 对象不特定于任何数据源,所以在指定 DataColumn 的数据类型时会使用 .NET Framework 类型。
可以使用DataColumn的DataType属性来设置或查看列将包含的数据类型。在数据添加到 DataTable对象的Rows集合之前,DataColumn对象的DataType属性是可读的。数据库的数据类型同DataColumn的数据类型不是一一映射的。
DataColumn的DataType属性默认为字符串,此外,DataColumn还包含一个构造函数,可以指定数据类型和所创建的新列的名称。同样,重载DataColumn集合对象的Add方法可以允许为新建DataTable对象和新建DataColumn对象的ColumnName和DataType属性赋值。
(1)添加列
DataTable workTable = new DataTable("Customers");
DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));
workCol.AllowDBNull = false;//不允许 DBNull 值
workCol.Unique = true;//值约束为唯一
workTable.Columns.Add("CustLName", typeof(String));
(2)添加表达式列
可以为列定义表达式,让它能够包含根据同一行中其他列值或根据表中多行的列值计算而得的值。 要定义要计算的表达式,可使用目标列的 Expression 属性,并使用 ColumnName 属性在表达式中引用其他列。 用于表达式列的 DataType 必须适合于表达式将返回的值。
workTable.Columns.Add("Total", typeof(Double)); workTable.Columns.Add("SalesTax", typeof(Double), "Total * 0.086");
(3)添加 AutoIncrement 列
要确保列值的唯一,可将列值设置为在表中添加新行时自动递增。 要创建自动递增的 DataColumn,可将列的 AutoIncrement 属性设置为 true。 然后,DataColumn 将从 AutoIncrementSeed 属性中定义的值开始,并且每添加一行,AutoIncrement 列的值将按列的 AutoIncrementStep 属性中定义的值增加。
对于 AutoIncrement 列,将 DataColumn 的 ReadOnly 属性设置为 true。
DataColumn workColumn = workTable.Columns.Add(
"CustomerID", typeof(Int32));
workColumn.AutoIncrement = true;
workColumn.AutoIncrementSeed = 200;
workColumn.AutoIncrementStep = 3;
3、添加数据
将新变量声明为 DataRow 类型。调用 NewRow 方法时,将返回新的 DataRow 对象。 然后,DataTable 会根据 DataColumnCollection 定义的表结构创建 DataRow 对象。
DataRow workRow;
for (int i = 0; i <= 9; i++)
{
workRow = workTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workTable.Rows.Add(workRow);
}
4、添加约束
(1)添加主键
在将一个单独的 DataColumn 标识为 DataTable 的 PrimaryKey 时,表会自动将列的 AllowDBNull 属性设置为 false,并将 Unique 属性设置为 true。 如果是多列主键,则只有 AllowDBNull 属性自动设置为 false。DataTable 的 PrimaryKey 属性会将一个或多个 DataColumn 对象的数组接收为它的值.
workTable.PrimaryKey = new DataColumn[] {workTable.Columns["CustLName"], workTable.Columns["CustFName"]}; // Or DataColumn[] keyColumn = new DataColumn[2]; keyColumn[0] = workTable.Columns["CustLName"]; keyColumn[1] = workTable.Columns["CustFName"]; workTable.PrimaryKey = keyColumn;
(2)添加外键
ForeignKeyConstraint 强制使用有关如何对相关表所做更新和删除进行传播的规则。 例如,如果更新或删除了一个表的某行中的值,并且一个或多个相关的表中也使用了同样的值,ForeignKeyConstraint 会决定相关表中发生的操作。
Cascade 删除或更新相关的行。
SetNull 将相关行中的值设置为 DBNull。
SetDefault 将相关行中的值设置为默认值。
None 对相关行不执行任何操作。 这是默认设置。
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
custDS.Tables["CustTable"].Columns["CustomerID"],
custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);
(3)AcceptRejectRule
可使用 AcceptChanges 方法接受对行的更改,或者使用 DataSet、DataTable 或 DataRow 的 RejectChanges 方法取消对行的更改。 DataSet 包含 ForeignKeyConstraints 时,调用 AcceptChanges 或 RejectChanges 方法会强制使用 AcceptRejectRule。 ForeignKeyConstraint 的 AcceptRejectRule 属性决定了对父行调用 AcceptChanges 或 RejectChanges 时要对子行执行的操作。
AcceptRejectRule 的可用设置。
Cascade 接受或拒绝对子行的更改。
无 对子行不执行任何操作。 这是默认设置。
UniqueConstraint 对象(可分配给 DataTable 中的单独一列或一组列)确保指定的某列或多个列中的所有数据对于每行都是唯一的。 通过使用 UniqueConstraint 构造函数,可以为一列或一组列创建唯一的约束。 将生成的 UniqueConstraint 对象传递给该表的 Constraints 属性的 Add 方法,该属性是一个 ConstraintCollection。 还可以将构造函数参数传递给 ConstraintCollection 的 Add 方法的几个重载,以创建 UniqueConstraint。 为一列或多列创建 UniqueConstraint 时,可以选择指定此列或这些列是不是主键。
还可以通过将列的 Unique 属性设置为 true,为某列创建唯一约束。 或者,通过将单列的 Unique 属性设置为 false,可移除可能存在的任何唯一约束。 如果将一列或多列定义为表的主键,会自动为一个或多个指定的列创建唯一的约束。 如果从 DataTable 的 PrimaryKey 属性中移除一列,则 UniqueConstraint 也被移除。
DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[]
{custTable.Columns["CustomerID"],
custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUnique);