Bagikan melalui


Batasan DataTable

Anda dapat menggunakan batasan untuk memberlakukan pembatasan pada data dalam DataTable, untuk mempertahankan integritas data. Batasan adalah aturan otomatis, diterapkan ke kolom atau kolom terkait, yang menentukan jalannya tindakan saat nilai baris entah bagaimana diubah. Pembatasan diberlakukan ketika properti dari System.Data.DataSet.EnforceConstraints adalah DataSet. Untuk contoh kode yang memperlihatkan cara mengatur EnforceConstraints properti, lihat EnforceConstraints topik referensi.

Ada dua jenis batasan dalam 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 Himpunan Data. Namun, Anda dapat menonaktifkan perilaku ini dengan menentukan createConstraints = false saat membuat relasi.

ForeignKeyConstraint

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

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

Pengaturan aturan Deskripsi
Rangkaian Menghapus atau memperbarui baris terkait.
SetNull Atur nilai dalam baris terkait ke DBNull.
SetDefault Atur nilai dalam baris terkait ke nilai default.
Tidak Jangan mengambil tindakan pada baris terkait. Ini adalah default.

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

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

Saat membuat ForeignKeyConstraint, Anda dapat meneruskan DeleteRule nilai dan UpdateRule ke konstruktor sebagai argumen, atau Anda dapat mengaturnya sebagai properti seperti dalam contoh berikut (di mana DeleteRule nilai diatur ke Tidak Ada).

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 AcceptChanges metode atau dibatalkan menggunakan RejectChanges metode Himpunan Data, DataTable, atau DataRow. DataSet Ketika sebuah DataSet berisi AcceptChanges, memanggil metode RejectChanges atau 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
Rangkaian Menerima atau menolak perubahan pada baris anak.
Tidak Tidak mengambil tindakan pada baris anak. 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 baik ke satu kolom atau ke array kolom dalam DataTable, memastikan bahwa semua data dalam kolom atau kolom yang ditentukan unik per baris. Anda dapat membuat batasan unik untuk kolom atau array kolom dengan menggunakan UniqueConstraint konstruktor. Teruskan objek hasil UniqueConstraint ke metode Add dari properti Constraints tabel, yang merupakan ConstraintCollection. Anda juga dapat meneruskan argumen konstruktor ke beberapa overload dari metode Add di ConstraintCollection untuk membuat UniqueConstraint. Saat membuat UniqueConstraint untuk kolom atau kolom-kolom, Anda dapat menentukan secara opsional apakah kolom atau kolom-kolom tersebut adalah kunci utama.

Anda juga dapat membuat batasan unik untuk kolom dengan mengatur Unique properti kolom ke true. Atau, mengatur Unique properti kolom tunggal untuk false menghapus batasan unik apa pun yang mungkin ada. Menentukan kolom atau kolom sebagai kunci utama untuk tabel akan secara otomatis membuat batasan unik untuk kolom atau kolom yang ditentukan. Jika Anda menghapus kolom dari PrimaryKey properti 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