Vincoli DataTableDataTable Constraints

I vincoli consentono di applicare restrizioni ai dati di una DataTable, in modo da garantire l'integrità di tali dati.You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. Un vincolo è una regola automatica applicata a una colonna, o a colonne correlate, che consente di determinare le operazioni da eseguire in caso di modifica del valore di una riga.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. I vincoli vengono applicati quando la System.Data.DataSet.EnforceConstraints proprietà DataSet di è true.Constraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. Per un esempio di codice che illustra come impostare la proprietà EnforceConstraints, vedere l'argomento relativo a EnforceConstraints.For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

In ADO.NET sono disponibili due tipi di vincoli: ForeignKeyConstraint e UniqueConstraint.There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. Per impostazione predefinita, entrambi i vincoli vengono creati automaticamente quando si crea una relazione tra due o più tabelle aggiungendo DataRelation un al set di dati.By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. Tuttavia, è possibile disabilitare questo comportamento specificando createConstraints = false durante la creazione della relazione.However, you can disable this behavior by specifying createConstraints = false when creating the relation.

ForeignKeyConstraintForeignKeyConstraint

Un ForeignKeyConstraint impone regole sulla modalità di propagazione degli aggiornamenti e delle eliminazioni alle tabelle correlate.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Se, ad esempio, un valore in una riga di una tabella viene aggiornato o eliminato e lo stesso valore viene utilizzato anche in una o più tabelle correlate, un vincolo ForeignKeyConstraint determina cosa accade nelle tabelle correlate.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.

Le DeleteRule proprietà UpdateRule e del vincolo ForeignKeyConstraint definiscono l'azione da intraprendere quando l'utente tenta di eliminare o aggiornare una riga in una tabella correlata.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. Nella tabella seguente vengono descritte le diverse impostazioni disponibili per le proprietà DeleteRule e UpdateRule di ForeignKeyConstraint.The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

Impostazione della regolaRule setting DESCRIZIONEDescription
CascadeCascade Elimina o aggiorna righe correlate.Delete or update related rows.
SetNullSetNull Impostare i valori nelle righe correlate su DBNull.Set values in related rows to DBNull.
SetDefaultSetDefault Imposta i valori delle righe correlate sul valore predefinito.Set values in related rows to the default value.
NoneNone Non viene eseguita alcuna operazione sulle righe correlate.Take no action on related rows. Questa è l'impostazione predefinita.This is the default.

Un vincolo ForeignKeyConstraint può limitare, nonché propagare, le modifiche alle colonne correlate.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. A seconda delle proprietà impostate per il vincolo ForeignKeyConstraint di una colonna, se la proprietà EnforceConstraints del set di dati è true, l'esecuzione di determinate operazioni sulla riga padre comporterà un'eccezione.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. Se, ad esempio, la proprietà DeleteRule di ForeignKeyConstraint è None, non è possibile eliminare una riga padre se contiene righe figlio.For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

È possibile creare un vincolo FOREIGN KEY tra singole colonne o tra una matrice di colonne usando il costruttore ForeignKeyConstraint .You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Passare l'oggetto ForeignKeyConstraint risultante al metodo Add della proprietà Constraints della tabella, che è un vincolo ConstraintCollection.Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. È anche possibile passare gli argomenti del costruttore a diversi overload del metodo Add di un oggetto ConstraintCollection per creare un vincolo ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Quando si crea un vincolo ForeignKeyConstraint, è possibile passare i valori DeleteRule e UpdateRule al costruttore come argomenti oppure è possibile impostarli come proprietà come nell'esempio seguente, in cui il valore DeleteRule è impostato su Nessuno).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

Le modifiche alle righe possono essere accettate mediante il metodo AcceptChanges o annullate mediante il metodo 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. Quando un set di dati contiene ForeignKeyConstraints, richiamando i metodi AcceptChanges o RejectChanges viene applicato il AcceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. La proprietà AcceptRejectRule di ForeignKeyConstraint determina l'azione che verrà eseguita sulle righe figlio quando AcceptChanges o RejectChanges viene chiamato sulla riga padre.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.

Nella tabella seguente sono elencate le impostazioni disponibili per AcceptRejectRule.The following table lists the available settings for the AcceptRejectRule.

Impostazione della regolaRule setting DescrizioneDescription
CascadeCascade Consente di accettare o rifiutare le modifiche alle righe figlio.Accept or reject changes to child rows.
NoneNone Non viene eseguita alcuna operazione sulle righe figlio.Take no action on child rows. Questa è l'impostazione predefinita.This is the default.

EsempioExample

Nell'esempio seguente viene creato un oggetto ForeignKeyConstraint, ne vengono impostate alcune proprietà, tra cui AcceptRejectRule, nonché viene aggiunto all'oggetto ConstraintCollection di un oggetto 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

L'oggetto UniqueConstraint , che può essere assegnato a una singola colonna o a una matrice di colonne in un oggetto DataTable, garantisce che tutti i dati della colonna o delle colonne specificate siano univoci per ogni riga.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. È possibile creare un vincolo UNIQUE per una colonna o una matrice di colonne usando il costruttore UniqueConstraint .You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Passare l'oggetto UniqueConstraint risultante al metodo Add della proprietà Constraints della tabella, che è un vincolo ConstraintCollection.Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. È anche possibile passare gli argomenti del costruttore a diversi overload del metodo Add di un oggetto ConstraintCollection per creare un oggetto UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Quando si crea un UniqueConstraint per una colonna o colonne, è possibile specificare facoltativamente se la colonna o le colonne sono una chiave primaria.When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

È inoltre possibile creare un vincolo UNIQUE per una colonna impostando la proprietà Unique della colonna su true.You can also create a unique constraint for a column by setting the Unique property of the column to true. In alternativa, l'impostazione della proprietà Unique di una singola colonna su false rimuove tutti i vincoli univoci che possono esistere.Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. La definizione di una o più colonne come chiave primaria per una tabella consentirà di creare automaticamente un vincolo univoco per la colonna o le colonne specificate.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 si rimuove una colonna dalla proprietà PrimaryKey di un oggetto DataTable, il vincolo UniqueConstraint viene rimosso.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

Nell'esempio seguente viene creato un UniqueConstraint per due colonne di un oggetto 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);  

Vedere ancheSee also