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:
dt.Constraints.Clear();
Constraints are discussed in detail in Chapter 10.