As mentioned earlier, schema for a table is defined by the columns in the table and the constraints on those columns. There are two types of constraints that can be placed on a table. Unique constraints define a column or group of columns for which the value in the column or columns must be unique in each data row. Foreign key constraints define and restrict the action performed when a value in a column or columns is updated or deleted. Constraints belonging to the DataTable are stored as either UniqueConstraint or ForeignKeyConstraint objects in a ConstraintCollection object and are accessed through the Constraints property of the DataTable. This section examines some methods and properties of the ConstraintCollection.
To add a constraint to a table, the Add( ) method takes an argument specifying a reference to an existing constraint or takes specific arguments if a unique or foreign-key constraint is added. The following example demonstrates adding both a unique and foreign-key constraint by specifying a reference to an existing constraint:
// add a unique constraint by reference UniqueConstraint uc = new UniqueConstraint(dt.Columns["MyColumn"]); dt.Constraints.Add(uc); // add a foreign key constraint by reference (wxh - test) ForeignKeyConstraint fc = new ForeignKeyConstraint( dtParent.Columns["ParentColumn"], dtChild.Columns["ChildColumn"]); dt.Constraints.Add(fc);
Two overloads of the Add( ) method create and add UniqueConstraint objects in one statement. The methods take a constraint name, a reference either to a DataColumn or a DataColumn array, and an argument indicating whether the column or columns are a primary key.
// add a unique constraint that is also a primary key dt.Constraints.Add("MyUniqueConstraint", dt.Columns["MyColumn"], true);
The other two overloads of the Add( ) method create and add a ForeignKeyConstraint in one statement. The methods take a constraint name and either two DataColumn references or two DataColumn arrays, as shown in the following example:
// add a foreign key constraint based on two columns dt.Constraints.Add("MyForeignKeyConstraint", new DataColumn(dtParent.Columns["ParentCol1"], new dtParent.Columns["parentCol2"]), new DataColumn(dtChild.Columns["ChildCol1"], dtChild.Columns["ChildCol2"]));
There are several properties and methods that interrogate the collection of constraints within a table. The Count property returns the number of constraints in a table:
Int32 constraintCount = dt.Constraints.Count;
The Contains( ) method returns a value indicating whether a column with a specified name exists in the collection. The method takes an argument containing the column name:
Boolean colExists = dt.Columns.Exists("MyColumn");
The Remove( ), RemoveAt( ), and Clear( ) methods remove constraints from the DataTable. The Remove( ) method takes an argument that specifies either a constraint name or a reference to the constraint to be removed, as shown in the following example:
// remove a constraint by specifying the name of the constraint dt.Constraints.Remove("MyConstraint"); // remove a constraint by specifying a reference to the constraint DataConstraint constraint = new DataConstraint("MyConstraint"); dt.Constraints.Add(constraint); // ... do some work dt.Constraints.Remove(constraint);
The RemoveAt( ) method removes a constraint with a specified index from the collection, as shown in this example:
// remove the first constraint from the collection dt.Constraints.RemoveAt(0);
The Clear( ) method removes all constraints from the constraint collection:
Constraints are discussed in detail in Chapter 10.