Restrições de DataTableDataTable Constraints

Você pode usar restrições para impor restrições nos dados em um DataTable, para manter a integridade dos dados.You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. Uma restrição é uma regra automática, aplicada a uma coluna ou colunas relacionadas, que determina o curso de ação quando o valor de uma linha é modificado de alguma maneira.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. As restrições são impostas quando System.Data.DataSet.EnforceConstraints a propriedade DataSet de é verdadeira.Constraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. Para um exemplo de código que mostra como definir a propriedade EnforceConstraints, consulte o tópico de referência EnforceConstraints.For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

Há dois tipos de restrições no ADO.NET: o ForeignKeyConstraint e o UniqueConstraint.There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. Por padrão, ambas as restrições são criadas automaticamente quando você cria uma relação entre duas ou mais tabelas adicionando um DataRelation ao conjuntode informações.By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. No entanto, você pode desabilitar esse comportamento especificando createConstraints = false ao criar a relação.However, you can disable this behavior by specifying createConstraints = false when creating the relation.

ForeignKeyConstraintForeignKeyConstraint

Um ForeignKeyConstraint impõe regras sobre como as atualizações e exclusões para tabelas relacionadas são propagadas.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Por exemplo, se um valor em uma linha de uma tabela for atualizado ou excluído e esse mesmo valor também for usado em uma ou mais tabelas relacionadas, um ForeignKeyConstraint determinará o que acontece nas tabelas 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.

As DeleteRule propriedades UpdateRule e de ForeignKeyConstraint definem a ação a ser tomada quando o usuário tenta excluir ou atualizar uma linha em uma tabela 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. A tabela a seguir descreve as diferentes configurações disponíveis para as propriedades DeleteRule e UpdateRule do ForeignKeyConstraint.The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

Configuração de regraRule setting DescriçãoDescription
CascataCascade Excluir ou atualizar linhas relacionadas.Delete or update related rows.
SetNullSetNull Defina valores em linhas relacionadas como DBNull.Set values in related rows to DBNull.
SetDefaultSetDefault Definir valores em linhas relacionadas para o valor padrão.Set values in related rows to the default value.
NenhumNone Nenhuma ação em linhas relacionadas.Take no action on related rows. Esse é o padrão.This is the default.

Um ForeignKeyConstraint pode restringir, bem como propagar, alterações em colunas relacionadas.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. Dependendo das propriedades definidas para o ForeignKeyConstraint de uma coluna, se a propriedade EnforceConstraints do conjunto de dado for true, executar determinadas operações na linha pai resultará em uma exceção.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 exemplo, se a propriedade DeleteRule de ForeignKeyConstraint for None, uma linha pai não poderá ser excluída se tiver qualquer linha filho.For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

Você pode criar uma restrição FOREIGN KEY entre colunas únicas ou entre uma matriz de colunas usando o construtor ForeignKeyConstraint .You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Passe o objeto ForeignKeyConstraint resultante para o método Add da propriedade Constraints da tabela, que é uma ConstraintCollection.Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Você também pode passar argumentos de construtor para várias sobrecargas do método Add de uma ConstraintCollection para criar um ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Ao criar um ForeignKeyConstraint, você pode passar os valores DeleteRule e UpdateRule para o construtor como argumentos, ou pode defini-los como propriedades, como no exemplo a seguir (em que o valor DeleteRule está definido como Nenhum).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

As alterações nas linhas podem ser aceitas usando o método AcceptChanges ou canceladas usando o método RejectChanges do DataSet, DataTableou DataRow.Changes to rows can be accepted using the AcceptChanges method or canceled using the RejectChanges method of the DataSet, DataTable, or DataRow. Quando um conjunto de um DataSet contém ForeignKeyConstraint, invocar os métodos AcceptChanges ou RejectChanges impõe o AcceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. A propriedade AcceptRejectRule de ForeignKeyConstraint determina qual ação será executada nas linhas filhas quando AcceptChanges ou RejectChanges for chamado na linha pai.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.

A tabela a seguir lista as configurações disponíveis para o AcceptRejectRule.The following table lists the available settings for the AcceptRejectRule.

Configuração de regraRule setting DescriçãoDescription
CascataCascade Aceitar ou rejeitar alterações em linhas filho.Accept or reject changes to child rows.
NenhumNone Nenhuma ação em linhas filho.Take no action on child rows. Esse é o padrão.This is the default.

ExemploExample

O exemplo a seguir cria um ForeignKeyConstraint, define várias das suas propriedades, incluindo AcceptRejectRule e adiciona-os ao ConstraintCollection de um 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

O objeto UniqueConstraint , que pode ser atribuído a uma única coluna ou a uma matriz de colunas em uma DataTable, garante que todos os dados na coluna ou colunas especificadas sejam exclusivos por linha.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. Você pode criar uma restrição exclusiva para uma coluna ou matriz de colunas usando o construtor UniqueConstraint .You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Passe o objeto UniqueConstraint resultante para o método Add da propriedade Constraints da tabela, que é uma ConstraintCollection.Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Você também pode passar argumentos de construtor para várias sobrecargas do método Add de uma ConstraintCollection para criar um UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Ao criar um UniqueConstraint para uma coluna ou colunas, você pode opcionalmente especificar se a coluna ou as colunas são uma chave primária.When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

Você também pode criar uma restrição exclusiva para uma coluna definindo a propriedade Unique da coluna como true.You can also create a unique constraint for a column by setting the Unique property of the column to true. Como alternativa, definir a propriedade Unique de uma única coluna como false remove qualquer restrição exclusiva que possa existir.Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. Definir uma coluna ou colunas como uma chave primária para uma tabela criará automaticamente uma restrição exclusiva para a coluna ou colunas 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. Se você remover uma coluna da propriedade PrimaryKey de uma DataTable, o UniqueConstraint será removido.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

O exemplo a seguir cria um UniqueConstraint para duas colunas de uma 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 tambémSee also