Aracılığıyla paylaş


DataTable Kısıtlamaları

Bir DataTable içindeki veriler üzerindeki kısıtlamaları zorlayarak verilerin bütünlüğünü koruyabilirsiniz. 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. System.Data.DataSet.EnforceConstraints özelliği DataSettrue olduğunda kısıtlamalar uygulanır. EnforceConstraints özelliğinin nasıl ayarlandığını gösteren bir kod örneği için EnforceConstraints başvuru konusuna 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 DataRelation bir ekleyerek ilişki oluşturduğunuzda her iki kısıtlama da otomatik olarak oluşturulur. Ancak, ilişkiyi oluştururken belirterek createConstraints = false bu davranışı devre dışı bırakabilirsiniz.

Yabancı Anahtar Kısıtlaması

A ForeignKeyConstraint , ilgili tablolardaki güncelleştirmelerin ve silmelerin nasıl yayıldığından emin olmak için kurallar uygular. Ö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 ve UpdateRule özellikleriForeignKeyConstraint, 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 DeleteRule ve UpdateRule özellikleri ile ForeignKeyConstraint için kullanılabilen farklı ayarlar açıklanmaktadır.

Kural ayarı Açıklama
Basamaklı İlgili satırları silin veya güncelleştirin.
SetNull İlgili satırlardaki değerleri DBNull olarak ayarlayın.
Varsayılanı Ayarla İlgili satırlardaki değerleri varsayılan değere ayarlayın.
Hiçbiri İlişkili satırlarda hiçbir işlem gerçekleştirme. Varsayılan değer budur.

, ForeignKeyConstraint ilgili sütunlara yapılan değişiklikleri kısıtlayabilir ve yayabilir. Bir sütunun ForeignKeyConstraint özelliklerine bağlı olarak, DataSet öğesinin EnforceConstraints özelliği true ise, üst satırda belirli işlemlerin yapılması bir istisna ile sonuçlanır. ** Örneğin, DeleteRuleForeignKeyConstraint öğesinin özelliği Yok ise, eğer alt satırları varsa üst satır silinemez.

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

Bir 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 (burada DeleteRule değeri Yok olarak ayarlanmıştı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);

KabulReddiKuralı

Satırlarda yapılan değişiklikler yöntemi kullanılarak AcceptChanges kabul edilebilir veya RejectChanges veya DataRow yöntemi kullanılarak iptal edilebilir. Bir DataSetForeignKeyConstraints içerdiğinde, AcceptChanges veya RejectChanges yöntemlerini çağırmak AcceptRejectKuralı'nı uygular. AcceptRejectRule özelliği, ForeignKeyConstraint üzerinde 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
Basamaklı Alt satırlarda yapılan değişiklikleri kabul edin veya reddedin.
Hiçbiri Alt satırlarda hiçbir işlem gerçekleştirme. Varsayılan değer budur.

Örnek

Aşağıdaki örnek bir ForeignKeyConstraintoluşturur, dahil olmak üzere AcceptRejectRulebirkaç özelliğini ayarlar ve bunu bir ConstraintCollection nesnenin DataTable öğ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

Benzersiz Kısıtlama

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

Sütun için benzersiz bir kısıtlama oluşturmak amacıyla sütunun Unique özelliğini true olarak ayarlayabilirsiniz. Alternatif olarak, tek bir sütunun Unique özelliğini false ayarlamak, mevcut olabilecek herhangi bir benzersiz kısıtlamayı 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. PrimaryKey özelliğinden bir sütunu kaldırırsanız, UniqueConstraint kaldırılır.

Aşağıdaki örnek, bir UniqueConstraint'yi iki sütun için bir DataTable'a 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 bakınız