Поделиться через


Ограничения DataTable

Ограничения можно использовать для принудительного применения ограничений к данным в объекте DataTable, чтобы обеспечить целостность данных. Ограничение — это автоматическое правило, применяемое к столбцу или связанным столбцам, которое определяет ход действия при изменении значения строки. Ограничения применяются, когда свойство System.Data.DataSet.EnforceConstraints равно DataSet. Пример кода, показывающий, как задать EnforceConstraints свойство, см. в справочном EnforceConstraints разделе.

Существует два типа ограничений в ADO.NET: ForeignKeyConstraint и UniqueConstraint. По умолчанию оба ограничения создаются автоматически при создании связи между двумя или более таблицами путем добавления DataRelation в набор данных. Однако это поведение можно отключить, указав createConstraints = false при создании отношения.

ОграничениеВнешнегоКлюча

ForeignKeyConstraint применяет правила о распространении обновлений и удалений связанных таблиц. Например, если значение в строке одной таблицы обновляется или удаляется, а это же значение также используется в одной или нескольких связанных таблицах, foreignKeyConstraint определяет, что происходит в связанных таблицах.

Свойства DeleteRule и UpdateRuleForeignKeyConstraint определяют действие, выполняемое при попытке пользователя удалить или обновить строку в связанной таблице. В следующей таблице описаны различные параметры, доступные для свойств DeleteRule и UpdateRuleдля ForeignKeyConstraint.

Настройка правил Описание
Каскад Удаление или обновление связанных строк.
SetNull Задайте значения в связанных строках как DBNull.
Установить по умолчанию Задайте значения в связанных строках значением по умолчанию.
Нет Не предпринимать никаких действий по связанным строкам. Это значение по умолчанию.

ForeignKeyConstraint может ограничить, а также распространять изменения связанных столбцов. В зависимости от набора свойств для столбца ForeignKeyConstraint , если свойство EnforceConstraints набора данныхимеет значение true, выполнение определенных операций в родительской строке приведет к исключению. Например, если свойство DeleteRuleдля ForeignKeyConstraint равно None, родительская строка не может быть удалена, если она имеет дочерние строки.

Можно создать ограничение внешнего ключа между отдельными столбцами или между массивом столбцов с помощью конструктора ForeignKeyConstraint . Передайте результирующий объект ForeignKeyConstraint методу Add свойства "Ограничения таблицы", являющегося объектом ConstraintCollection. Аргументы конструктора также можно передать нескольким перегрузкам метода Add объекта ConstraintCollection для создания ForeignKeyConstraint.

При создании ForeignKeyConstraint можно передать значения DeleteRule и UpdateRule конструктору в качестве аргументов или задать их в качестве свойств, как в следующем примере (где значение DeleteRule имеет значение 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);  

Правило принятия/отклонения

Изменения строк можно принять с помощью метода AcceptChanges или отменить с помощью метода RejectChanges набора данных, DataTable или DataRow. Если набор данных содержит ForeignKeyConstraints, вызов методов AcceptChanges или RejectChanges выполняет правило AcceptRejectRule. Свойство AcceptRejectRuleforeignKeyConstraint определяет, какое действие будет выполняться в дочерних строках при вызове AcceptChanges или RejectChanges в родительской строке.

В следующей таблице перечислены доступные параметры для AcceptRejectRule.

Настройка правил Описание
Каскад Примите или отклоните изменения дочерних строк.
Нет Не предпринимать никаких действий по дочерним строкам. Это значение по умолчанию.

Пример

В следующем примере создается ForeignKeyConstraint, задаются несколько его свойств, включая AcceptRejectRule, и добавляется в ConstraintCollection объекта DataTable.

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

уникальное ограничение

Объект UniqueConstraint , который может быть назначен одному столбцу или массиву столбцов в DataTable, гарантирует, что все данные в указанном столбце или столбцах уникальны для каждой строки. Можно создать уникальное ограничение для столбца или массива столбцов с помощью конструктора UniqueConstraint . Передайте результирующий объект UniqueConstraint методу Add свойства "Ограничения таблицы", являющегося объектом ConstraintCollection. Аргументы конструктора также можно передать нескольким перегрузкам метода Add объекта ConstraintCollection , чтобы создать UniqueConstraint. При создании UniqueConstraint для столбца или столбцов можно указать, является ли столбец или столбцы первичным ключом.

Вы также можете создать уникальное ограничение для столбца, установив уникальное свойство столбца Unique в значение true. Кроме того, при задании свойства Unique одного столбца значение false удаляет любое уникальное ограничение, которое может существовать. Определение столбца или столбцов в качестве первичного ключа таблицы автоматически создает уникальное ограничение для указанного столбца или столбцов. Если удалить столбец из свойства PrimaryKey объекта DataTable, то UniqueConstraint будет удалён.

В следующем примере создается UniqueConstraint для двух столбцов 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);  

См. также