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 exigen cuando la System.Data.DataSet.EnforceConstraints propiedad de la DataSet 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 a la 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

Un ForeignKeyConstraint impone 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 un valor de una fila de una tabla se actualiza o elimina y ese mismo valor también se usa en uno o más tablas relacionadas, una ForeignKeyConstraint determina lo que ocurre 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.

El DeleteRule y UpdateRule propiedades de la ForeignKeyConstraint definir la acción que se 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. La tabla siguiente describen las distintas configuraciones disponibles para la DeleteRule y UpdateRule propiedades de la 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 Establecer valores en 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.
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, además de propagar, los cambios relacionados con columnas.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. Dependiendo de las propiedades establecidas para el ForeignKeyConstraint de una columna, si la EnforceConstraints propiedad de la DataSet es true, realizar ciertas operaciones en la fila primaria generará 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 DeleteRule propiedad de la ForeignKeyConstraint es ninguno, una fila primaria no se puede eliminar 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 uso de la ForeignKeyConstraint constructor.You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Pasar resultante ForeignKeyConstraint de objeto para el agregar método de la tabla restricciones propiedad, que es un 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 los agregar 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 el DeleteRule y UpdateRule valores al constructor como argumentos, o bien pueden configurarlos como propiedades como en el ejemplo de las siguientes (donde el DeleteRule valor 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

Cambios en las filas se pueden aceptar con el AcceptChanges método o cancelar con el RejectChanges método de la DataSet, DataTable, o 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, al invocar el AcceptChanges o RejectChanges métodos exige la AcceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. El AcceptRejectRule propiedad de la ForeignKeyConstraint determina qué acción se realizará en el elemento secundario cuando filas AcceptChanges o RejectChanges se llama 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 enumera las opciones disponibles para el 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.
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 UniqueConstraint objeto, que puede asignarse a una sola columna o a una matriz de columnas en un DataTable, garantiza que todos los datos de la columna o columnas especificadas son únicos en cada 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 una matriz de columnas mediante el UniqueConstraint constructor.You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Pasar resultante UniqueConstraint de objeto para el agregar método de la tabla restricciones propiedad, que es un 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 los agregar 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 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 el Unique propiedad de la columna a true.You can also create a unique constraint for a column by setting the Unique property of the column to true. También puede establecer el Unique propiedad de una sola columna para false quita cualquier restricción única que puedan 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, 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 una 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