Bagikan melalui


Memvalidasi data dalam himpunan data dalam aplikasi .NET Framework

Catatan

Himpunan data dan kelas terkait adalah teknologi .NET Framework warisan dari awal 2000-an yang memungkinkan aplikasi untuk bekerja dengan data dalam memori saat aplikasi terputus dari database. Teknologi ini sangat berguna untuk aplikasi yang memungkinkan pengguna memodifikasi data dan mempertahankan perubahan kembali ke database. Meskipun himpunan data telah terbukti menjadi teknologi yang sangat sukses, sebaiknya aplikasi .NET baru menggunakan Entity Framework Core. Entity Framework menyediakan cara yang lebih alami untuk bekerja dengan data tabular sebagai model objek, dan memiliki antarmuka pemrograman yang lebih sederhana.

Memvalidasi data adalah proses mengonfirmasi bahwa nilai yang dimasukkan ke dalam objek data sesuai dengan batasan dalam skema himpunan data. Proses validasi juga mengonfirmasi bahwa nilai-nilai ini mengikuti aturan yang telah ditetapkan untuk aplikasi Anda. Ini adalah praktik yang baik untuk memvalidasi data sebelum mengirim pembaruan ke database yang mendasar. Ini mengurangi kesalahan serta potensi jumlah perjalanan pulang pergi antara aplikasi dan database.

Anda dapat mengonfirmasi bahwa data yang sedang ditulis ke himpunan data valid dengan membangun pemeriksaan validasi ke dalam himpunan data itu sendiri. Himpunan data dapat memeriksa data terlepas dari bagaimana pembaruan dilakukan — baik secara langsung oleh kontrol dalam formulir, dalam komponen, atau dengan cara lain. Karena himpunan data adalah bagian dari aplikasi Anda (tidak seperti backend database), ini adalah tempat logis untuk membangun validasi khusus aplikasi.

Tempat terbaik untuk menambahkan validasi ke aplikasi Anda adalah dalam file kelas parsial himpunan data. Di Visual Basic atau Visual C#, buka Perancang Himpunan Data dan klik dua kali kolom atau tabel yang ingin Anda buat validasinya. Tindakan ini membuka file kode, tempat Anda dapat membuat penanganan aktivitas ColumnChanging atau RowChanging.

private static void OnColumnChanging(object sender, DataColumnChangeEventArgs e)
{

}

Validasi data

Validasi dalam himpunan data dilakukan dengan cara berikut:

Beberapa peristiwa dimunculkan oleh objek DataTable ketika perubahan terjadi dalam rekaman:

  • Peristiwa ColumnChanging dan ColumnChanged dimunculkan selama dan setelah setiap perubahan ke kolom individual. Peristiwa ColumnChanging ini berguna saat Anda ingin memvalidasi perubahan di kolom tertentu. Informasi tentang perubahan yang diusulkan diteruskan sebagai argumen dengan peristiwa.
  • Peristiwa RowChanging dan RowChanged dimunculkan selama dan setelah perubahan berturut-turut. Peristiwa RowChanging ini lebih umum. Ini menunjukkan bahwa perubahan terjadi di suatu tempat di baris, tetapi Anda tidak tahu kolom mana yang telah berubah.

Secara default, setiap perubahan pada kolom oleh karena itu menimbulkan empat peristiwa. Yang pertama adalah peristiwa ColumnChanging dan ColumnChanged untuk kolom tertentu yang sedang diubah. Selanjutnya adalah peristiwa RowChanging dan RowChanged. Jika beberapa perubahan sedang dilakukan pada baris, peristiwa akan dinaikkan untuk setiap perubahan.

Catatan

Metode baris data BeginEdit menonaktifkan peristiwa RowChanging dan RowChanged setelah setiap kolom individu berubah. Dalam hal ini, peristiwa tidak dinaikkan sampai metode EndEdit telah dipanggil, ketika peristiwa RowChanging dan RowChanged dinaikkan hanya sebanyak satu kali. Untuk informasi selengkapnya, lihat Menonaktifkan batasan saat mengisi himpunan data.

Peristiwa yang Anda pilih tergantung pada seberapa terperinci yang Anda inginkan untuk validasi. Jika penting bagi Anda untuk segera menangkap kesalahan saat kolom berubah, bangun validasi dengan menggunakan peristiwa ColumnChanging tersebut. Jika tidak, gunakan peristiwa RowChanging, yang dapat mengakibatkan penangkapan beberapa kesalahan sekaligus. Selain itu, jika data Anda terstruktur sehingga nilai satu kolom divalidasi berdasarkan konten kolom lain, lakukan validasi Anda selama peristiwa RowChanging.

Saat rekaman diperbarui, objek DataTable akan memunculkan peristiwa yang dapat Anda tanggapi saat perubahan terjadi dan setelah perubahan dibuat.

Jika aplikasi Anda menggunakan himpunan data yang diketik, Anda dapat membuat penanganan aktivitas yang diketik dengan kuat. Ini menambahkan empat peristiwa jenis tambahan yang dapat Anda buat penangannya: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeleting, dan dataTableNameRowDeleted. Penanganan aktivitas bertipe ini meneruskan argumen yang menyertakan nama kolom tabel Anda yang membuat kode lebih mudah ditulis dan dibaca.

Peristiwa pembaruan data

Kejadian Deskripsi
ColumnChanging Nilai dalam kolom sedang diubah. Peristiwa meneruskan baris dan kolom kepada Anda, bersama dengan nilai baru yang diusulkan.
ColumnChanged Nilai dalam kolom telah diubah. Peristiwa meneruskan baris dan kolom kepada Anda, bersama dengan nilai yang diusulkan.
RowChanging Perubahan yang dilakukan pada objek DataRow akan diterapkan kembali ke dalam himpunan data. Jika Anda belum memanggil metode BeginEdit, peristiwa RowChanging dinaikkan untuk setiap perubahan ke kolom segera setelah peristiwa ColumnChanging dinaikkan. Jika Anda memanggil BeginEdit sebelum membuat perubahan, peristiwa RowChanging hanya dinaikkan saat Anda memanggil metode EndEdit.

Peristiwa meneruskan baris kepada Anda, bersama dengan nilai yang menunjukkan jenis tindakan apa (perubahan, sisipkan, dan sebagainya) yang sedang dilakukan.
RowChanged Baris telah diubah. Peristiwa meneruskan baris kepada Anda, bersama dengan nilai yang menunjukkan jenis tindakan apa (perubahan, sisipkan, dan sebagainya) yang sedang dilakukan.
RowDeleting Baris sedang dihapus. Peristiwa meneruskan baris kepada Anda, bersama dengan nilai yang menunjukkan jenis tindakan (penghapusan) apa yang sedang dilakukan.
RowDeleted Baris telah dihapus. Peristiwa meneruskan baris kepada Anda, bersama dengan nilai yang menunjukkan jenis tindakan (penghapusan) apa yang sedang dilakukan.

Peristiwa ColumnChanging, RowChanging, dan RowDeleting dimunculkan selama proses pembaruan. Anda dapat menggunakan peristiwa ini untuk memvalidasi data atau melakukan jenis pemrosesan lainnya. Karena pembaruan sedang berlangsung selama peristiwa ini, Anda dapat membatalkannya dengan melemparkan pengecualian, yang mencegah pembaruan selesai.

Peristiwa ColumnChanged, RowChanged dan RowDeleted adalah peristiwa pemberitahuan yang dinaikkan ketika pembaruan telah berhasil diselesaikan. Peristiwa ini berguna ketika Anda ingin mengambil tindakan lebih lanjut berdasarkan pembaruan yang berhasil.

Memvalidasi data selama perubahan kolom

Catatan

Perancang Himpunan Data membuat kelas parsial di mana logika validasi dapat ditambahkan ke himpunan data. Himpunan data yang dihasilkan perancang tidak menghapus atau mengubah kode apa pun di kelas parsial.

Anda dapat memvalidasi data saat nilai dalam kolom data berubah dengan merespons peristiwa tersebut ColumnChanging. Saat dimunculkan, peristiwa ini meneruskan argumen peristiwa (ProposedValue) yang berisi nilai yang sedang diusulkan untuk kolom saat ini. Berdasarkan konten e.ProposedValue, Anda dapat:

  • Terima nilai yang diusulkan dengan tidak melakukan apa pun.

  • Tolak nilai yang diusulkan dengan mengatur kesalahan kolom (SetColumnError) dari dalam penanganan aktivitas yang mengubah kolom.

  • Secara opsional gunakan kontrol ErrorProvider untuk menampilkan pesan kesalahan kepada pengguna. Untuk informasi selengkapnya, lihat komponen ErrorProvider.

Validasi juga dapat dilakukan selama peristiwa RowChanging.

Memvalidasi data selama perubahan baris

Anda dapat menulis kode untuk memverifikasi bahwa setiap kolom yang ingin Anda validasi berisi data yang memenuhi persyaratan aplikasi Anda. Lakukan ini dengan mengatur kolom untuk menunjukkan bahwa kolom berisi kesalahan jika nilai yang diusulkan tidak dapat diterima. Contoh berikut mengatur kesalahan kolom saat kolom Quantity adalah 0 atau kurang. Penanganan aktivitas yang berubah baris harus menyerupai contoh berikut.

Untuk memvalidasi data saat baris berubah (Visual Basic)

  1. Buka himpunan data Anda di Perancang Himpunan Data. Untuk informasi selengkapnya, lihat Panduan: Membuat Himpunan Data di Perancang Himpunan Data.

  2. Klik dua kali bilah judul tabel yang ingin Anda validasi. Tindakan ini secara otomatis membuat penanganan aktivitas RowChanging dari DataTable di file kelas parsial himpunan data.

    Tip

    Klik dua kali di sebelah kiri nama tabel untuk membuat penanganan aktivitas yang mengubah baris. Jika Anda mengeklik dua kali nama tabel, Anda bisa mengeditnya.

    Private Sub Order_DetailsDataTable_Order_DetailsRowChanging(
        ByVal sender As System.Object, 
        ByVal e As Order_DetailsRowChangeEvent
      ) Handles Me.Order_DetailsRowChanging
    
        If CType(e.Row.Quantity, Short) <= 0 Then
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError("Quantity", "")
        End If
    End Sub
    

Untuk memvalidasi data saat baris berubah (C#)

  1. Buka himpunan data Anda di Perancang Himpunan Data. Untuk informasi selengkapnya, lihat Panduan: Membuat himpunan data di Perancang Himpunan Data.

  2. Klik dua kali bilah judul tabel yang ingin Anda validasi. Tindakan ini membuat file kelas parsial untuk DataTable.

    Catatan

    Perancang Himpunan Data tidak secara otomatis membuat penanganan aktivitas untuk peristiwa RowChanging tersebut. Anda harus membuat metode untuk menangani peristiwa RowChanging, dan menjalankan kode untuk menghubungkan peristiwa dalam metode inisialisasi tabel.

  3. Salin kode berikut ke dalam kelas:

    public override void EndInit()
    {
        base.EndInit();
        Order_DetailsRowChanging += TestRowChangeEvent;
    }
    
    public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e)
    {
        if ((short)e.Row.Quantity <= 0)
        {
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
        }
        else
        {
            e.Row.SetColumnError("Quantity", "");
        }
    }
    

Untuk mengambil baris yang diubah

Setiap baris dalam tabel data memiliki properti RowState yang melacak status baris tersebut saat ini dengan menggunakan nilai dalam enumerasi DataRowState. Anda dapat mengembalikan baris yang diubah dari himpunan data atau tabel data dengan memanggil metode GetChanges dari DataSet atau DataTable. Anda dapat memverifikasi bahwa perubahan ada sebelum memanggil GetChanges dengan memanggil metode HasChanges dari himpunan data.

Catatan

Setelah Anda menerapkan perubahan pada himpunan data atau tabel data (dengan memanggil metode AcceptChanges), metode GetChanges tidak mengembalikan data. Jika aplikasi Anda perlu memproses baris yang diubah, Anda harus memproses perubahan sebelum memanggil metode AcceptChanges.

Memanggil metodeGetChanges dari himpunan data atau tabel data mengembalikan himpunan data atau tabel data baru yang hanya berisi rekaman yang telah diubah. Jika Anda ingin mendapatkan rekaman tertentu — misalnya, hanya rekaman baru atau hanya rekaman yang dimodifikasi — Anda dapat meneruskan nilai dari enumerasi DataRowState sebagai parameter ke metode GetChanges.

Gunakan enumerasi DataRowVersion untuk mengakses versi baris yang berbeda (misalnya, nilai asli yang ada di baris sebelum memprosesnya).

Untuk mendapatkan semua rekaman yang diubah dari himpunan data

  • Panggil metode GetChanges dari himpunan data.

    Contoh berikut membuat himpunan data baru yang disebut changedRecords dan mengisinya dengan semua rekaman yang diubah dari himpunan data lain yang disebut dataSet1.

    DataSet changedRecords = dataSet1.GetChanges();
    

Untuk mendapatkan semua rekaman yang diubah dari tabel data

  • Panggil metode GetChanges DataTable.

    Contoh berikut membuat tabel data baru yang disebut changedRecordsTable dan mengisinya dengan semua rekaman yang diubah dari tabel data lain yang disebut dataTable1.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Untuk mendapatkan semua rekaman yang memiliki status baris tertentu

  • Panggil metode GetChanges himpunan data atau tabel data dan berikan nilai enumerasi DataRowState sebagai argumen.

    Contoh berikut menunjukkan cara membuat himpunan data baru yang disebut addedRecords dan mengisinya hanya dengan rekaman yang telah ditambahkan ke himpunan data dataSet1.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    

    Contoh berikut ini memperlihatkan cara mengembalikan semua rekaman yang baru ditambahkan ke tabel Customers:

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    

Mengakses versi asli DataRow

Saat perubahan dilakukan pada baris data, himpunan data mempertahankan versi baris (Original) asli dan (Current) baru. Misalnya, sebelum memanggil metode AcceptChanges, aplikasi Anda dapat mengakses berbagai versi rekaman (seperti yang didefinisikan dalam enumerasi DataRowVersion) dan memproses perubahan yang sesuai.

Catatan

Versi baris yang berbeda hanya ada setelah diedit dan sebelum metode AcceptChanges dipanggil. Setelah metode AcceptChanges dipanggil, versi saat ini dan aslinya sama.

Meneruskan nilai DataRowVersion bersama dengan indeks kolom (atau nama kolom sebagai string) mengembalikan nilai dari versi baris tertentu kolom tersebut. Kolom yang diubah diidentifikasi selama peristiwa ColumnChanging dan ColumnChanged. Ini adalah saat yang tepat untuk memeriksa versi baris yang berbeda untuk tujuan validasi. Namun, jika Anda telah menangguhkan sementara batasan, peristiwa tersebut tidak akan dinaikkan, dan Anda harus mengidentifikasi kolom mana yang telah berubah secara terprogram. Anda dapat melakukan ini dengan melakukan iterasi melalui koleksi Columns dan membandingkan nilai DataRowVersion yang berbeda.

Untuk mendapatkan versi asli rekaman

  • Akses nilai kolom dengan meneruskan baris DataRowVersion yang ingin Anda kembalikan.

    Contoh berikut menunjukkan cara menggunakan nilai DataRowVersion untuk mendapatkan nilai asli bidang CompanyName dalam DataRow:

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    

Mengakses versi DataRow saat ini

Untuk mendapatkan versi rekaman saat ini

  • Akses nilai kolom, lalu tambahkan parameter ke indeks yang menunjukkan versi baris mana yang ingin Anda kembalikan.

    Contoh berikut menunjukkan cara menggunakan nilai DataRowVersion untuk mendapatkan nilai bidang CompanyName saat ini dalam DataRow:

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();