Share via


DataTable Kısıtlamaları

Verilerin bütünlüğünü korumak için içindeki veriler DataTableüzerinde kısıtlamaları zorlamak için kısıtlamaları kullanabilirsiniz. Kısıtlama, bir satırın değeri bir şekilde değiştirildiğinde eylem seyrini belirleyen bir sütuna veya ilgili sütunlara uygulanan otomatik bir kuraldır. özelliği DataSet true olduğunda System.Data.DataSet.EnforceConstraintskısıtlamalar uygulanır. Özelliğinin nasıl ayarlandığını EnforceConstraints gösteren bir kod örneği için başvuru konusuna EnforceConstraints bakın.

ADO.NET iki tür kısıtlama vardır: ForeignKeyConstraint ve UniqueConstraint. Varsayılan olarak, iki veya daha fazla tablo arasında DataSet'e bir DataRelation ekleyerek ilişki oluşturduğunuzda her iki kısıtlama da otomatik olarak oluşturulur. Ancak ilişkiyi oluştururken createConstraints = false değerini belirterek bu davranışı devre dışı bırakabilirsiniz.

Foreignkeyconstraint

ForeignKeyConstraint, ilgili tablolardaki güncelleştirmelerin ve silmelerin nasıl yayıldığından emin olmak için kuralları zorunlu tutar. Örneğin, bir tablonun satırındaki bir değer güncelleştirilir veya silinirse ve aynı değer bir veya daha fazla ilişkili tabloda da kullanılırsa, foreignkeyconstraint ilgili tablolarda ne olacağını belirler.

DeleteRule ForeignKeyConstraint'in ve UpdateRule özellikleri, kullanıcı ilgili tablodaki bir satırı silmeye veya güncelleştirmeye çalıştığında gerçekleştirilecek eylemi tanımlar. Aşağıdaki tabloda, ForeignKeyConstraint'in DeleteRule ve UpdateRule özellikleri için kullanılabilen farklı ayarlar açıklanmaktadır.

Kural ayarı Açıklama
Cascade İlgili satırları silin veya güncelleştirin.
Setnull İlgili satırlardaki değerleri DBNull olarak ayarlayın.
Setdefault İlgili satırlardaki değerleri varsayılan değere ayarlayın.
Hiçbiri İlişkili satırlarda hiçbir işlem gerçekleştirme. Bu varsayılan seçenektir.

ForeignKeyConstraint, değişiklikleri ilişkili sütunlara kısıtlayabilir ve yayabilir. Bir sütunun ForeignKeyConstraint için ayarlanan özelliklere bağlı olarak, DataSet'inEnforceConstraints özelliği true ise, üst satırda belirli işlemlerin gerçekleştirilmesi özel durumla sonuçlanır. Örneğin, ForeignKeyConstraint'in DeleteRule özelliği Yok ise, alt satırı varsa üst satır silinemez.

ForeignKeyConstraint oluşturucuyu kullanarak tek sütunlar arasında veya bir sütun dizisi arasında yabancı anahtar kısıtlaması oluşturabilirsiniz. Sonuçta elde edilen ForeignKeyConstraint nesnesini, tablonun ConstraintCollection olan Constraints özelliğinin Add yöntemine geçirin. Bir ForeignKeyConstraint oluşturmak için bir ConstraintCollection'ın Add yönteminin birkaç aşırı yüklemesine oluşturucu bağımsız değişkenlerini de geçirebilirsiniz.

ForeignKeyConstraint oluştururken, DeleteRule ve UpdateRule değerlerini oluşturucuya bağımsız değişken olarak geçirebilir veya bunları aşağıdaki örnekte olduğu gibi özellikler olarak ayarlayabilirsiniz (DeleteRuledeğeri Yok olarak ayarlanır).

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

Satırlarda yapılan değişiklikler AcceptChanges yöntemi kullanılarak kabul edilebilir veya DataSet, DataTable veya DataRow'un RejectChanges yöntemi kullanılarak iptal edilebilir. DataSet ForeignKeyConstraints içerdiğinde AcceptChanges veya RejectChanges yöntemlerini çağırmak AcceptRejectRule'yi zorunlu tutar. ForeignKeyConstraint'in AcceptRejectRule özelliği, üst satırda AcceptChanges veya RejectChanges çağrıldığında alt satırlarda hangi eylemin gerçekleştirileceğini belirler.

Aşağıdaki tabloda AcceptRejectRule için kullanılabilir ayarlar listelenir.

Kural ayarı Açıklama
Cascade Alt satırlarda yapılan değişiklikleri kabul edin veya reddedin.
Hiçbiri Alt satırlarda hiçbir işlem gerçekleştirme. Bu varsayılan seçenektir.

Örnek

Aşağıdaki örnek bir ForeignKeyConstraintoluşturur, dahil olmak üzere AcceptRejectRulebirkaç özelliğini ayarlar ve bunu bir DataTable nesnenin ConstraintCollection öğesine ekler.

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

Tek bir sütuna veya DataTable'daki bir sütun dizisine atanabilen UniqueConstraint nesnesi, belirtilen sütun veya sütunlardaki tüm verilerin satır başına benzersiz olmasını sağlar. UniqueConstraint oluşturucuyu kullanarak bir sütun veya sütun dizisi için benzersiz bir kısıtlama oluşturabilirsiniz. Sonuçta elde edilen UniqueConstraint nesnesini tablonun ConstraintCollection olan Constraints özelliğinin Add yöntemine geçirin. Oluşturucu bağımsız değişkenlerini, UniqueConstraint oluşturmak için ConstraintCollection'ınAdd yönteminin birkaç aşırı yüklemesine de geçirebilirsiniz. Sütun veya sütunlar için UniqueConstraint oluştururken isteğe bağlı olarak sütunun veya sütunların birincil anahtar olup olmadığını belirtebilirsiniz.

Sütunun Benzersiz özelliğini true olarak ayarlayarak da sütun için benzersiz bir kısıtlama oluşturabilirsiniz. Alternatif olarak, tek bir sütunun Unique özelliğini false olarak ayarlamak, mevcut olabilecek tüm benzersiz kısıtlamaları kaldırır. Bir sütunu veya sütunları bir tablonun birincil anahtarı olarak tanımlamak, belirtilen sütun veya sütunlar için otomatik olarak benzersiz bir kısıtlama oluşturur. DataTable'ın PrimaryKey özelliğinden bir sütunu kaldırırsanız, UniqueConstraint kaldırılır.

Aşağıdaki örnek, bir DataTable'ın iki sütunu için bir UniqueConstraint oluşturur.

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

Ayrıca bkz.