Partilhar via


Restrições de DataTable

Você pode usar restrições para impor restrições aos dados em um DataTable, a fim de manter a integridade dos dados. 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 é alterado de alguma forma. As restrições são impostas quando a System.Data.DataSet.EnforceConstraints propriedade do DataSet é verdadeira. Para obter um exemplo de código que mostra como definir a EnforceConstraints propriedade, consulte o tópico de EnforceConstraints referência.

Existem dois tipos de restrições em ADO.NET: o ForeignKeyConstraint e o 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 DataSet. No entanto, pode desativar este comportamento especificando createConstraints = false ao criar a relação.

Restrição de Chave Estrangeira

A ForeignKeyConstraint aplica regras sobre como as atualizações e eliminações das tabelas relacionadas são propagadas. Por exemplo, se um valor numa linha de uma tabela for atualizado ou eliminado, e esse mesmo valor também for usado numa ou mais tabelas relacionadas, a ForeignKeyConstraint determina o que acontece nas tabelas relacionadas.

As propriedades DeleteRule e UpdateRule de ForeignKeyConstraint definem a ação a ser tomada quando o utilizador tenta eliminar ou atualizar uma linha numa tabela relacionada. A tabela seguinte descreve as diferentes definições disponíveis para as propriedades DeleteRule e UpdateRule da ForeignKeyConstraint.

Definição de regras Descrição
Cascata Excluir ou atualizar linhas relacionadas.
SetNull Defina valores em linhas relacionadas como DBNull.
SetDefault Defina valores em linhas relacionadas para o valor padrão.
Nenhum Não execute nenhuma ação em linhas relacionadas. Este é o padrão.

A ForeignKeyConstraint pode restringir, bem como propagar, alterações a colunas relacionadas. Dependendo das propriedades definidas para o ForeignKeyConstraint de uma coluna, se a propriedade EnforceConstraints do DataSet for verdadeira, realizar certas operações na linha principal resultará em uma exceção. Por exemplo, se a DeleteRule propriedade do ForeignKeyConstraint for None, uma linha pai não pode ser eliminada se tiver linhas filhas.

Pode criar uma restrição de chave estrangeira entre colunas individuais ou entre um array de colunas usando o ForeignKeyConstraint construtor. Passe o objeto resultante ForeignKeyConstraint para o método Add da propriedade Constraints da tabela, que é uma ConstraintCollection. Também pode passar parâmetros de construtor para vários overloads do Add método de um ConstraintCollection para criar uma Restrição de Chave Estrangeira.

Ao criar um ForeignKeyConstraint, pode passar os DeleteRule valores e UpdateRule ao construtor como argumentos, ou pode defini-los como propriedades como no exemplo seguinte (onde o DeleteRule valor é definido como Nenhum).

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);

RegraAceitarRejeitar

Alterações às linhas podem ser aceites usando o AcceptChanges método ou canceladas usando o RejectChanges método do DataSet, DataTable ou DataRow. Quando a DataSet contém ForeignKeyConstraints, invocar o AcceptChanges ou RejectChanges métodos aplica a Regra AceitarRejeitar. A propriedade AcceptRejectRule do ForeignKeyConstraint determina que ação será tomada nas linhas filhas quando AcceptChanges ou RejectChanges forem chamados na linha pai.

A tabela a seguir lista as configurações disponíveis para o AcceptRejectRule.

Definição de regras Descrição
Cascata Aceitar ou rejeitar alterações em linhas filhas.
Nenhum Não tome nenhuma ação em linhas filhas. Este é o padrão.

Exemplo

O exemplo a seguir cria um ForeignKeyConstraint, define várias de suas propriedades, incluindo o AcceptRejectRule, e o adiciona ao ConstraintCollection de um DataTable objeto.

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

    // Set parent and child column variables.
    parentColumn = dataSet.Tables[table1]?.Columns[column1] ??
        throw new NullReferenceException($"{nameof(CreateConstraint)}: {table1}.{column1} not found");
    childColumn = dataSet.Tables[table2]?.Columns[column2] ??
        throw new NullReferenceException($"{nameof(CreateConstraint)}: {table2}.{column2} not found");
    foreignKeyConstraint = new ForeignKeyConstraint
       ("SupplierForeignKeyConstraint", parentColumn, childColumn)
    {
        // Set null values when a value is deleted.
        DeleteRule = Rule.SetNull,
        UpdateRule = Rule.Cascade,
        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

Restrição Única

O UniqueConstraint objeto, que pode ser atribuído a uma única coluna ou a um array de colunas numa DataTable, garante que todos os dados na coluna ou colunas especificadas são únicos por linha. Pode criar uma restrição única para uma coluna ou array de colunas usando o construtor UniqueConstraint. Passe o objeto resultante UniqueConstraint para o método Add da propriedade Constraints da tabela, que é uma ConstraintCollection. Pode também passar argumentos do construtor a várias sobrecargas do método Add de um ConstraintCollection para criar uma Restrição Única. Ao criar uma UniqueConstraint para uma ou várias colunas, pode opcionalmente especificar se a coluna ou colunas são uma chave primária.

Também pode criar uma restrição única para uma coluna definindo a Unique propriedade da coluna como verdadeira. Alternativamente, definir a propriedade Unique de uma única coluna para false remove qualquer constrangimento único que possa existir. Definir uma coluna ou colunas como a chave primária de uma tabela criará automaticamente uma restrição exclusiva para a coluna ou colunas especificadas. Se remover uma coluna da PrimaryKey propriedade de uma DataTable, a UniqueConstraint é removida.

O exemplo seguinte cria um UniqueConstraint para duas colunas de uma 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);

Ver também