Share via


Batasan DataTable

Anda dapat menggunakan pembatasan untuk menerapkan batasan pada data di DataTable, guna menjaga integritas data. Pembatasan adalah aturan otomatis, diterapkan ke kolom atau kolom terkait, yang menentukan tindakan ketika nilai baris diubah entah bagaimana. Pembatasan diberlakukan jika System.Data.DataSet.EnforceConstraints properti DataSet adalah true. Untuk contoh kode yang menunjukkan cara mengatur properti EnforceConstraints, lihat topik referensi EnforceConstraints.

Ada dua jenis pembatasan di ADO.NET: ForeignKeyConstraint dan UniqueConstraint. Secara default, kedua batasan dibuat secara otomatis saat Anda membuat hubungan antara dua tabel atau lebih dengan menambahkan DataRelation ke DataSet. Namun, Anda dapat menonaktifkan perilaku ini dengan menentukan createConstraints = false saat membuat relasi.

ForeignKeyConstraint

ForeignKeyConstraint memberlakukan aturan tentang bagaimana pembaruan dan penghapusan ke tabel terkait disebarkan. Misalnya, jika nilai dalam baris satu tabel diperbarui atau dihapus, dan nilai yang sama juga digunakan dalam satu atau beberapa tabel terkait, ForeignKeyConstraint menentukan apa yang terjadi di tabel terkait.

Properti DeleteRule dan UpdateRule dari ForeignKeyConstraint menentukan tindakan yang akan diambil saat pengguna mencoba menghapus atau memperbarui baris dalam tabel terkait. Tabel berikut menjelaskan berbagai pengaturan yang tersedia untuk properti DeleteRule dan UpdateRule dari ForeignKeyConstraint.

Pengaturan aturan Deskripsi
Cascade Menghapus atau memperbarui baris terkait.
SetNull Menetapkan nilai di baris terkait ke DBNull.
SetDefault Menetapkan nilai di baris terkait ke nilai default.
Tidak Jangan mengambil tindakan pada baris terkait. Ini adalah default.

ForeignKeyConstraint dapat membatasi, serta menyebarkan, perubahan pada kolom terkait. Bergantung pada properti yang diatur untuk kolom ForeignKeyConstraint, jika properti EnforceConstraints dari DataSet adalah true, melakukan operasi tertentu pada baris induk akan menghasilkan pengecualian. Misalnya, jika properti DeleteRule dari ForeignKeyConstraint adalah None, baris induk tidak dapat dihapus jika memiliki baris turunan.

Anda dapat membuat batasan kunci asing di antara kolom tunggal atau di antara array kolom dengan menggunakan konstruktor ForeignKeyConstraint. Teruskan objek ForeignKeyConstraint yang dihasilkan ke metode Tambahkan dari properti Pembatasan tabel, yang merupakan ConstraintCollection. Anda juga dapat meneruskan argumen konstruktor ke beberapa kelebihan beban metode Tambahkan dari ConstraintCollection untuk membuat ForeignKeyConstraint.

Saat membuat ForeignKeyConstraint, Anda dapat meneruskan nilai DeleteRule dan UpdateRule ke konstruktor sebagai argumen, atau Anda dapat mengaturnya sebagai properti seperti pada contoh berikut (di mana nilai DeleteRule diatur ke 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);  

AcceptRejectRule

Perubahan pada baris dapat diterima menggunakan metode AcceptChanges atau dibatalkan menggunakan metode RejectChanges dari DataSet, DataTable, atau Baris Data. Saat DataSet berisi ForeignKeyConstraints, menjalankan metode AcceptChanges atau RejectChanges akan memberlakukan AcceptRejectRule. Properti AcceptRejectRule dari ForeignKeyConstraint menentukan tindakan mana yang akan diambil pada baris turunan saat AcceptChanges atau RejectChanges dipanggil pada baris induk.

Tabel berikut mencantumkan pengaturan yang tersedia untuk AcceptRejectRule.

Pengaturan aturan Deskripsi
Cascade Menerima atau menolak perubahan pada baris turunan.
Tidak Jangan mengambil tindakan pada baris turunan. Ini adalah default.

Contoh

Contoh berikut membuat ForeignKeyConstraint, mengatur beberapa propertinya, termasuk AcceptRejectRule, dan menambahkannya ke ConstraintCollection dari objek 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

Objek UniqueConstraint, yang dapat ditetapkan ke satu kolom atau array kolom dalam DataTable, memastikan bahwa semua data dalam kolom atau kolom yang ditentukan bersifat unik di setiap baris. Anda dapat membuat batasan unik untuk kolom atau array kolom dengan menggunakan konstruktor UniqueConstraint. Teruskan objek UniqueConstraint yang dihasilkan ke metode Tambahkan dari properti Pembatasan tabel, yang merupakan ConstraintCollection. Anda juga dapat meneruskan argumen konstruktor ke beberapa kelebihan beban metode Tambahkan dari ConstraintCollection untuk membuat UniqueConstraint. Saat membuat UniqueConstraint untuk kolom atau beberapa kolom, Anda dapat secara opsional menentukan apakah kolom atau beberapa kolom tersebut adalah kunci utama.

Anda juga dapat membuat pembatasan unik untuk kolom dengan mengatur properti Unik kolom ke true. Atau, mengatur properti Unik dari satu kolom ke false menghapus batasan unik apa pun yang mungkin ada. Mendefinisikan kolom atau beberapa kolom sebagai kunci utama untuk tabel akan secara otomatis membuat pembatasan unik untuk kolom atau beberapa kolom yang ditentukan. Jika Anda menghapus kolom dari properti PrimaryKey dari DataTable, UniqueConstraint akan dihapus.

Contoh berikut membuat UniqueConstraint untuk dua kolom 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);  

Lihat juga