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 le System.Data.DataSet.EnforceConstraints proprietà del DataSet viene 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 un DataRelation per il 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

Oggetto ForeignKeyConstraint impone le regole sulla modalità di propagazione degli aggiornamenti ed eliminazioni alle tabelle correlate.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Ad esempio, se un valore in una riga di una tabella viene aggiornato o eliminato e lo stesso valore viene usato anche in uno o più tabelle correlate, un ForeignKeyConstraint determina ciò che 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.

Il DeleteRule e UpdateRule delle proprietà delle ForeignKeyConstraint definire 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. La tabella seguente descrive le diverse impostazioni disponibili per il DeleteRule e UpdateRule le proprietà del 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 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.
nessunoNone Non viene eseguita alcuna operazione sulle righe correlate.Take no action on related rows. Questa è l'impostazione predefinita.This is the default.

Oggetto ForeignKeyConstraint consente di limitare, oltre che propagare, le modifiche apportate a colonne correlate.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. A seconda delle proprietà impostate per il ForeignKeyConstraint di una colonna, se il EnforceConstraints proprietà del set di dati è true, eseguire 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. Ad esempio, se il DeleteRule proprietà del ForeignKeyConstraint viene None, una riga padre non può essere eliminata se dispone di tutte le 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 di chiave esterna tra le singole colonne o una matrice di colonne usando il ForeignKeyConstraint costruttore.You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Passare l'oggetto risultante ForeignKeyConstraint dell'oggetto per il Add metodo per la tabella vincoli proprietà, ovvero un 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 Add metodo di un ConstraintCollection per creare un ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Durante la creazione di un ForeignKeyConstraint, è possibile passare il DeleteRule e UpdateRule valori al costruttore come argomenti o è possono impostarli come proprietà come il in seguito esempio (in cui il DeleteRule è impostato su None).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 utilizzando il AcceptChanges metodo o annullato utilizzando il RejectChanges metodo del set di dati, DataTable, oppure 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, la chiamata di AcceptChanges oppure RejectChanges metodi impone il AcceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. Il AcceptRejectRule proprietà delle ForeignKeyConstraint determina quali azioni saranno eseguite sull'elemento figlio delle righe 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.

La tabella seguente elenca le impostazioni disponibili per il 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.
nessunoNone 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

Il UniqueConstraint oggetto, che può essere assegnato a una singola colonna o a una matrice di colonne in un DataTable, assicura che tutti i dati della colonna specificata o le colonne sia univoco 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 UniqueConstraint costruttore.You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Passare l'oggetto risultante UniqueConstraint dell'oggetto per il Add metodo per la tabella vincoli proprietà, ovvero un 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 Add metodo di un ConstraintCollection per creare un UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Quando si crea una UniqueConstraint per una o più colonne, è possibile, facoltativamente, specificare se 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.

È anche possibile creare un vincolo unique per una colonna impostando il Unique proprietà della colonna true.You can also create a unique constraint for a column by setting the Unique property of the column to true. In alternativa, impostando il Unique proprietà di una singola colonna per false rimuove qualsiasi vincolo unique che potrebbe 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 dal PrimaryKey proprietà di un DataTable, il UniqueConstraint viene rimosso.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

L'esempio seguente crea una UniqueConstraint per due colonne di 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);  

Vedere ancheSee also