Restricciones de DataTableDataTable Constraints

Se pueden utilizar restricciones para exigir restricciones sobre los datos de un objeto DataTable con el fin de mantener la integridad de los datos.You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. Una restricción es una regla automática que se aplica a una columna, o a varias columnas relacionadas, que determina cómo proceder cuando se modifica de alguna manera el valor de una fila.A constraint is an automatic rule, applied to a column or related columns, that determines the course of action when the value of a row is somehow altered. Las restricciones se System.Data.DataSet.EnforceConstraints aplican cuando DataSet la propiedad de la es true.Constraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. Para ver un ejemplo de código que muestre cómo establecer la propiedad EnforceConstraints, vea el tema de referencia EnforceConstraints.For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

Existen dos tipos de restricciones en ADO.NET: ForeignKeyConstraint y UniqueConstraint.There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. De forma predeterminada, ambas restricciones se crean automáticamente al crear DataRelation una relación entre dos o más tablas agregando un conjunto de datos.By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. Sin embargo, puede deshabilitar este comportamiento especificando createConstraints = false al crear la relación.However, you can disable this behavior by specifying createConstraints = false when creating the relation.

ForeignKeyConstraintForeignKeyConstraint

Un ForeignKeyConstraint aplica reglas sobre cómo se propagan las actualizaciones y eliminaciones a las tablas relacionadas.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Por ejemplo, si se actualiza o elimina un valor de una fila de una tabla y ese mismo valor también se usa en una o varias tablas relacionadas, ForeignKeyConstraint determina lo que sucede en las tablas relacionadas.For example, if a value in a row of one table is updated or deleted, and that same value is also used in one or more related tables, a ForeignKeyConstraint determines what happens in the related tables.

Las DeleteRule UpdateRule propiedades y de ForeignKeyConstraint definen la acción que se debe realizar cuando el usuario intenta eliminar o actualizar una fila de una tabla relacionada.The DeleteRule and UpdateRule properties of the ForeignKeyConstraint define the action to be taken when the user attempts to delete or update a row in a related table. En la tabla siguiente se describen las diferentes opciones disponibles para las propiedades DeleteRule y UpdateRule de ForeignKeyConstraint.The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

Establecimiento de reglasRule setting DescripciónDescription
CascadaCascade Elimina o actualiza las filas relacionadas.Delete or update related rows.
SetNullSetNull Establezca valores en filas relacionadas en DBNull.Set values in related rows to DBNull.
SetDefaultSetDefault Establece los valores de las filas relacionadas en el valor predeterminado.Set values in related rows to the default value.
NingunoNone No realiza ninguna acción en las filas relacionadas.Take no action on related rows. Este es el valor predeterminado.This is the default.

Un ForeignKeyConstraint puede restringir, así como propagar, los cambios a las columnas relacionadas.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. Dependiendo de las propiedades establecidas para el ForeignKeyConstraint de una columna, si el EnforceConstraints propiedad de la DataSet es true, realizar ciertas operaciones en la fila primaria dará lugar a una excepción.Depending on the properties set for the ForeignKeyConstraint of a column, if the EnforceConstraints property of the DataSet is true, performing certain operations on the parent row will result in an exception. Por ejemplo, si la propiedad DeleteRule de ForeignKeyConstraint es None, no se puede eliminar una fila primaria si tiene filas secundarias.For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

Puede crear una restricción de clave externa entre columnas individuales o entre una matriz de columnas mediante el constructor ForeignKeyConstraint.You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Pase el objeto ForeignKeyConstraint resultante al método Add de la propiedad Constraints de la tabla, que es ConstraintCollection.Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. También puede pasar argumentos de constructor a varias sobrecargas de la Add método de un ConstraintCollection para crear un ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Al crear un ForeignKeyConstraint, puede pasar los valores DeleteRule y UpdateRule al constructor como argumentos, o puede establecerlos como propiedades como en el ejemplo siguiente (donde el valor DeleteRule se establece en None).When creating a ForeignKeyConstraint, you can pass the DeleteRule and UpdateRule values to the constructor as arguments, or you can set them as properties as in the following example (where the DeleteRule value is set to None).

Dim custOrderFK As ForeignKeyConstraint = 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)  
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);  

AcceptRejectRuleAcceptRejectRule

Los cambios en las filas se pueden aceptar mediante el método AcceptChanges o cancelarse mediante el método RejectChanges de DataSet, DataTableo DataRow.Changes to rows can be accepted using the AcceptChanges method or canceled using the RejectChanges method of the DataSet, DataTable, or DataRow. Cuando un DataSet contiene ForeignKeyConstraints, invocar los métodos AcceptChanges o RejectChanges aplica el acceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. La propiedad AcceptRejectRule de ForeignKeyConstraint determina qué acción se realizará en las filas secundarias cuando se llame a AcceptChanges o RejectChanges en la fila primaria.The AcceptRejectRule property of the ForeignKeyConstraint determines which action will be taken on the child rows when AcceptChanges or RejectChanges is called on the parent row.

En la tabla siguiente se enumeran los valores disponibles para AcceptRejectRule.The following table lists the available settings for the AcceptRejectRule.

Establecimiento de reglasRule setting DescripciónDescription
CascadaCascade Acepta o rechaza los cambios en filas secundarias.Accept or reject changes to child rows.
NingunoNone No realiza ninguna acción en las filas secundarias.Take no action on child rows. Este es el valor predeterminado.This is the default.

EjemploExample

En el ejemplo siguiente se crea un ForeignKeyConstraint, se establecen varias de sus propiedades, incluida la AcceptRejectRule, y se añade a la ConstraintCollection de un objeto DataTable.The following example creates a ForeignKeyConstraint, sets several of its properties, including the AcceptRejectRule, and adds it to the ConstraintCollection of a DataTable object.

private void CreateConstraint(DataSet dataSet,
    string table1, string table2,string column1, string column2)
{
   // Declare parent column and child column variables.
   DataColumn parentColumn;
   DataColumn childColumn;
   ForeignKeyConstraint foreignKeyConstraint;

   // Set parent and child column variables.
   parentColumn = dataSet.Tables[table1].Columns[column1];
   childColumn = dataSet.Tables[table2].Columns[column2];
   foreignKeyConstraint = new ForeignKeyConstraint
      ("SupplierForeignKeyConstraint",  parentColumn, childColumn);

   // Set null values when a value is deleted.
   foreignKeyConstraint.DeleteRule = Rule.SetNull;
   foreignKeyConstraint.UpdateRule = Rule.Cascade;
   foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None;

   // Add the constraint, and set EnforceConstraints to true.
   dataSet.Tables[table1].Constraints.Add(foreignKeyConstraint);
   dataSet.EnforceConstraints = true;
}
Private Sub CreateConstraint(dataSet As DataSet, _
   table1 As String, table2 As String, _
   column1 As String, column2 As String)

    ' Declare parent column and child column variables.
    Dim parentColumn As DataColumn
    Dim childColumn As DataColumn
    Dim foreignKeyConstraint As ForeignKeyConstraint

    ' Set parent and child column variables.
    parentColumn = dataSet.Tables(table1).Columns(column1)
    childColumn = dataSet.Tables(table2).Columns(column2)
    foreignKeyConstraint = New ForeignKeyConstraint _
       ("SupplierForeignKeyConstraint", parentColumn, childColumn)

    ' Set null values when a value is deleted.
    foreignKeyConstraint.DeleteRule = Rule.SetNull
    foreignKeyConstraint.UpdateRule = Rule.Cascade
    foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None

    ' Add the constraint, and set EnforceConstraints to true.
    dataSet.Tables(table1).Constraints.Add(foreignKeyConstraint)
    dataSet.EnforceConstraints = True
End Sub

UniqueConstraintUniqueConstraint

El objeto UniqueConstraint, que se puede asignar a una sola columna o a una matriz de columnas en una DataTable, garantiza que todos los datos de la columna o columnas especificadas sean únicos por fila.The UniqueConstraint object, which can be assigned either to a single column or to an array of columns in a DataTable, ensures that all data in the specified column or columns is unique per row. Puede crear una restricción única para una columna o matriz de columnas mediante el Constructor UniqueConstraint.You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Pase el objeto UniqueConstraint resultante al método Add de la propiedad Constraints de la tabla, que es ConstraintCollection.Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. También puede pasar argumentos de constructor a varias sobrecargas de la Add método de un ConstraintCollection para crear un UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Al crear un UniqueConstraint para una columna o columnas, puede especificar opcionalmente si la columna o columnas son una clave principal.When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

También puede crear una restricción única para una columna estableciendo la propiedad Unique de la columna en true.You can also create a unique constraint for a column by setting the Unique property of the column to true. Como alternativa, al establecer la propiedad Unique de una sola columna en false, se quita cualquier restricción única que pueda existir.Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. Si se define una o varias columnas como clave principal de una tabla se creará automáticamente una restricción única para la columna o columnas especificadas.Defining a column or columns as the primary key for a table will automatically create a unique constraint for the specified column or columns. Si quita una columna de la PrimaryKey propiedad de un DataTable, el UniqueConstraint se quita.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

En el ejemplo siguiente se crea un UniqueConstraint para dos columnas de un DataTable.The following example creates a UniqueConstraint for two columns of a DataTable.

Dim custTable As DataTable = custDS.Tables("Customers")  
Dim custUnique As UniqueConstraint = _  
    New UniqueConstraint(New DataColumn()   {custTable.Columns("CustomerID"), _  
    custTable.Columns("CompanyName")})  
custDS.Tables("Customers").Constraints.Add(custUnique)  
DataTable custTable = custDS.Tables["Customers"];  
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[]
    {custTable.Columns["CustomerID"],
    custTable.Columns["CompanyName"]});  
custDS.Tables["Customers"].Constraints.Add(custUnique);  

Consulte tambiénSee also