Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 da ação quando o valor de uma linha é de alguma forma alterado. 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.
Há 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, você pode desabilitar esse comportamento especificando createConstraints = false ao criar a relação.
ForeignKeyConstraint
Um ForeignKeyConstraint impõe regras sobre como as atualizações e exclusões são propagadas em tabelas relacionadas. 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.
As propriedades DeleteRule e UpdateRule do ForeignKeyConstraint definem a ação a ser tomada quando o usuário tenta excluir ou atualizar uma linha em uma tabela relacionada. A tabela a seguir descreve as diferentes configurações disponíveis para as propriedades DeleteRule e UpdateRule do ForeignKeyConstraint.
Configuração de regra | Descrição |
---|---|
Cascata | Excluir ou atualizar linhas relacionadas. |
SetNull | Defina valores em linhas relacionadas como DBNull. |
SetDefault | Defina valores em linhas relacionadas ao valor padrão. |
Nenhum | Não execute nenhuma ação em linhas relacionadas. Esse é o padrão. |
Um ForeignKeyConstraint pode restringir, bem como propagar, alterações em colunas relacionadas. Dependendo das propriedades definidas para o ForeignKeyConstraint de uma coluna, se a propriedade EnforceConstraints do DataSet estiver como verdadeira, a execução de certas operações na linha pai resultará em uma exceção. Por exemplo, se a propriedade DeleteRule de ForeignKeyConstraint for None, uma linha pai não poderá ser excluída se tiver alguma linha filho.
Você pode criar uma restrição de chave estrangeira entre colunas simples ou entre uma matriz de colunas usando o construtor ForeignKeyConstraint . Passe o objeto ForeignKeyConstraint resultante para o método Add da propriedade Constraints da tabela, que é um ConstraintCollection. Você também pode passar argumentos de construtor para várias sobrecargas do método Add de um ConstraintCollection para criar um ForeignKeyConstraint.
Ao criar um ForeignKeyConstraint, você pode passar os valores DeleteRule e UpdateRule para o construtor como argumentos ou defini-los como propriedades como no exemplo a seguir (em que o valor DeleteRule é definido como 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);
AcceptRejectRule
As alterações nas linhas podem ser aceitas usando o método AcceptChanges ou canceladas usando o método RejectChanges do DataSet, DataTable ou DataRow. Quando um DataSet contém ForeignKeyConstraints, invocar os métodos AcceptChanges ou RejectChanges impõe o AcceptRejectRule. A propriedade AcceptRejectRule do ForeignKeyConstraint determina que ação será tomada nas linhas filho quando AcceptChanges ou RejectChanges for chamado na linha pai.
A tabela a seguir lista as configurações disponíveis para o AcceptRejectRule.
Configuração de regra | Descrição |
---|---|
Cascata | Aceitar ou rejeitar alterações em linhas filho. |
Nenhum | Nenhuma ação em linhas filho. Esse é o padrão. |
Exemplo
O exemplo a seguir cria um ForeignKeyConstraint, define várias de suas propriedades, incluindo a AcceptRejectRule, e adiciona-o ConstraintCollection ao 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 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. Você pode criar uma restrição exclusiva para uma coluna ou matriz de colunas usando o construtor UniqueConstraint . Passe o objeto UniqueConstraint resultante para o método Add da propriedade Constraints da tabela, que é um ConstraintCollection. Você também pode passar argumentos de construtor para várias sobrecargas do método Add de um ConstraintCollection para criar um 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.
Você também pode criar uma restrição exclusiva para uma coluna definindo a propriedade Unique da coluna como true. Como alternativa, definir a propriedade Unique de uma única coluna como false remove qualquer restrição exclusiva 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 você remover uma coluna da propriedade PrimaryKey de uma DataTable, o UniqueConstraint será removido.
O exemplo a seguir cria um UniqueConstraint para duas colunas de um 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);