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 aplican cuando la System.Data.DataSet.EnforceConstraints propiedad DataSet de 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, las dos restricciones se crean automáticamente cuando se crea una relación entre dos o más tablas agregando un DataRelation al conjunto de DataSet.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

Una ForeignKeyConstraint exige 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 el mismo valor también se usa en una o varias tablas relacionadas, una 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 propiedades UpdateRule y de ForeignKeyConstraint definen la acción que se debe realizar cuando el usuario intenta eliminar o actualizar una fila en 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 distintas configuraciones 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
CascadeCascade Elimina o actualiza las filas relacionadas.Delete or update related rows.
SetNullSetNull Establezca los valores de las 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.
NoneNone No realiza ninguna acción en las filas relacionadas.Take no action on related rows. Este es el valor predeterminado.This is the default.

Una ForeignKeyConstraint puede restringir y propagar los cambios en las columnas relacionadas.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. En función de las propiedades establecidas para la ForeignKeyConstraint de una columna, si la propiedad EnforceConstraints del DataSet es true, realizar determinadas operaciones en la fila primaria producirá 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 una 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 del método Add de una ConstraintCollection para crear una ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Al crear una ForeignKeyConstraint, puede pasar los valores DeleteRule y UpdateRule al constructor como argumentos, o bien puede establecerlos como propiedades como en el ejemplo siguiente (donde el valor DeleteRule se establece en Ninguno).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 con el método AcceptChanges o cancelarse con el método RejectChanges del 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 conjunto de DataSet contiene ForeignKeyConstraints, al invocar los métodos AcceptChanges o RejectChanges se aplica el método AcceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. La propiedad AcceptRejectRule de ForeignKeyConstraint determina la acción que 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
CascadeCascade Acepta o rechaza los cambios en filas secundarias.Accept or reject changes to child rows.
NoneNone 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 de un objeto 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 UNIQUE 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 una 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 del método Add de una ConstraintCollection para crear una UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Al crear una UniqueConstraint para una o varias 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 UNIQUE 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, si se establece 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 propiedad PrimaryKey de una DataTable, se quita la UniqueConstraint .If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

En el ejemplo siguiente se crea una UniqueConstraint para dos columnas de 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);  

Vea tambiénSee also