Bagikan melalui


Mengisi himpunan data dengan menggunakan TableAdapters 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. Himpunan data tersebut sangat berguna untuk aplikasi yang mengaktifkan pengguna guna 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.

Komponen TableAdapter mengisi himpunan data dengan data dari database, berdasarkan satu atau beberapa kueri atau prosedur tersimpan yang Anda tentukan. TableAdapters juga dapat melakukan penambahan, pembaruan, dan penghapusan pada database untuk mempertahankan perubahan yang Anda buat pada himpunan data. Anda juga dapat mengeluarkan perintah global yang tidak terkait dengan tabel tertentu.

Catatan

TableAdapters dihasilkan oleh perancang Visual Studio. Jika Anda membuat himpunan data secara terprogram, maka gunakan DataAdapter, yang merupakan kelas .NET.

Untuk informasi terperinci tentang operasi TableAdapter, Anda dapat langsung menuju ke salah satu topik ini:

Topik Deskripsi
Buat dan konfigurasikan TableAdapters Cara menggunakan perancang untuk membuat dan mengonfigurasi TableAdapters
Membuat kueri TableAdapter berparameter Cara mengaktifkan pengguna untuk menyediakan argumen ke prosedur atau kueri TableAdapter
Mengakses database secara langsung dengan TableAdapter Cara menggunakan metode Dbdirect TableAdapters
Menonaktifkan batasan saat mengisi himpunan data Cara bekerja dengan batasan kunci asing saat memperbarui data
Cara memperluas fungsionalitas TableAdapter Cara menambahkan kode khusus ke TableAdapters
Membaca data XML ke dalam himpunan data Cara bekerja dengan XML

Gambaran umum TableAdapter

TableAdapters adalah komponen yang dihasilkan perancang yang tersambung ke database, menjalankan kueri atau prosedur tersimpan, dan mengisi DataTable mereka dengan data yang dikembalikan. TableAdapters juga mengirim data yang diperbarui dari aplikasi Anda kembali ke database. Anda dapat menjalankan kueri sebanyak yang Anda inginkan di TableAdapter selama kueri mengembalikan data yang sesuai dengan skema tabel yang dikaitkan dengan TableAdapter. Diagram berikut menunjukkan bagaimana TableAdapters berinteraksi dengan database dan objek lain dalam memori:

Aliran data dalam aplikasi klien

Meskipun TableAdapters dirancang dengan Dataset Designer, kelas TableAdapter tidak dihasilkan sebagai kelas berlapis dari DataSet. Mereka terletak di namespace layanan terpisah yang khusus untuk setiap himpunan data. Misalnya, jika Anda memiliki himpunan data bernama NorthwindDataSet, TableAdapters yang terkait dengan DataTable di NorthwindDataSet akan berada di NorthwindDataSetTableAdapters namespace layanan. Untuk mengakses TableAdapter tertentu secara terprogram, Anda harus mendeklarasikan instans baru TableAdapter. Contohnya:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

Skema DataTable terkait

Saat Anda membuat TableAdapter, Anda menggunakan kueri awal atau prosedur tersimpan untuk menentukan skema TableAdapter yang terkait DataTable. Anda menjalankan kueri awal ini atau prosedur tersimpan dengan memanggil metode TableAdapter Fill (yang mengisi DataTable yang terkait TableAdapter). Setiap perubahan yang dilakukan pada kueri utama TableAdapter tercermin dalam skema tabel data terkait. Misalnya, menghapus kolom dari kueri utama juga menghapus kolom dari tabel data terkait. Jika ada kueri tambahan di TableAdapter menggunakan pernyataan SQL yang mengembalikan kolom yang tidak ada dalam kueri utama, perancang mencoba menyinkronkan perubahan kolom antara kueri utama dan kueri tambahan.

Perintah pembaruan TableAdapter

Fungsionalitas pembaruan TableAdapter bergantung pada berapa banyak informasi yang tersedia dalam kueri utama dalam TableAdapter Wizard. Misalnya, TableAdapters yang dikonfigurasi untuk mengambil nilai dari beberapa tabel (menggunakan JOIN), nilai skalar, tampilan, atau hasil fungsi agregat awalnya tidak dibuat dengan kemampuan untuk mengirim pembaruan kembali ke database yang mendasarinya. Namun, Anda dapat mengonfigurasi perintah INSERT, UPDATE, dan DELETE secara manual di jendela Properti.

Kueri TableAdapter

TableAdapter dengan beberapa kueri

TableAdapters dapat berisi beberapa kueri untuk mengisi tabel data terkait. Anda dapat menentukan sebanyak mungkin kueri untuk TableAdapter seperti yang diperlukan aplikasi Anda, selama setiap kueri mengembalikan data yang sesuai dengan skema yang sama dengan tabel data terkait. Kemampuan ini memungkinkan TableAdapter memuat hasil yang berbeda berdasarkan kriteria yang berbeda.

Misalnya, jika aplikasi Anda berisi tabel dengan nama pelanggan, Anda dapat membuat kueri yang mengisi tabel dengan setiap nama pelanggan yang dimulai dengan huruf tertentu, dan yang lain yang mengisi tabel dengan semua pelanggan yang terletak dalam keadaan yang sama. Untuk mengisi Customers tabel dengan pelanggan dalam status tertentu, Anda bisa membuat kueri FillByState yang mengambil parameter untuk nilai status sebagai berikut: SELECT * FROM Customers WHERE State = @State. Anda menjalankan kueri dengan memanggil metode FillByState dan meneruskan nilai parameter seperti ini: CustomerTableAdapter.FillByState("WA").

Selain menambahkan kueri yang mengembalikan data dengan skema yang sama dengan tabel data TableAdapter, Anda dapat menambahkan kueri yang mengembalikan nilai skalar (tunggal). Misalnya, kueri yang mengembalikan jumlah pelanggan (SELECT Count(*) From Customers) valid untuk CustomersTableAdapter, meskipun data yang dikembalikan tidak sesuai dengan skema tabel.

Properti ClearBeforeFill

Secara default, setiap kali Anda menjalankan kueri untuk mengisi tabel data TableAdapter, data yang ada dibersihkan, dan hanya hasil kueri yang dimuat ke dalam tabel. Atur properti TableAdapter ClearBeforeFill ke false jika Anda ingin menambahkan atau menggabungkan data yang dikembalikan dari kueri ke data yang sudah ada dalam tabel data. Terlepas dari apakah Anda menghapus data, Anda perlu secara eksplisit mengirim pembaruan kembali ke database, jika Anda ingin mempertahankannya. Jadi ingatlah untuk menyimpan perubahan apa pun pada data dalam tabel sebelum menjalankan kueri lain yang mengisi tabel. Untuk informasi selengkapnya, lihat Memperbarui data dengan menggunakan TableAdapter.

Turunan TableAdapter

TableAdapters memperluas fungsionalitas adaptor data standar dengan merangkum kelas yang dikonfigurasi DataAdapter. Secara default, TableAdapter merupakan keturunan dari kelas Component dan tidak dapat ditransmisikan ke kelas DataAdapter. Mentransmisikan TableAdapter ke kelas DataAdapter menghasilkan kesalahan InvalidCastException. Untuk mengubah kelas dasar TableAdapter, Anda dapat menentukan kelas yang berasal dari Component properti Kelas Dasar dari TableAdapter di Dataset Designer.

Metode dan properti TableAdapter

Kelas TableAdapter bukan jenis .NET. Ini berarti Anda tidak dapat mencarinya di dokumentasi atau Browser Objek. Kelas ini dibuat pada waktu desain saat Anda menggunakan salah satu wizard yang disebutkan sebelumnya. Nama yang ditetapkan ke TableAdapter saat Anda membuatnya didasarkan pada nama tabel yang sedang Anda kerjakan. Misalnya, saat Anda membuat TableAdapter berdasarkan tabel dalam database bernama Orders, TableAdapter diberi nama OrdersTableAdapter. Nama kelas TableAdapter dapat diubah menggunakan properti Nama di Dataset Designer.

Berikut ini adalah metode dan properti TableAdapters yang umum digunakan:

Anggota Deskripsi
TableAdapter.Fill Mengisi tabel data terkait TableAdapter dengan hasil perintah TableAdapter SELECT.
TableAdapter.Update Mengirim perubahan kembali ke database dan mengembalikan bilangan bulat yang menunjukkan jumlah baris yang telah terpengaruh oleh pembaruan data. Untuk informasi selengkapnya, lihat Memperbarui data dengan menggunakan TableAdapter.
TableAdapter.GetData Mengembalikan DataTable baru yang diisi dengan data.
TableAdapter.Insert Membuat baris baru dalam tabel data. Untuk informasi selengkapnya, lihat Sisipkan rekaman baru ke dalam database.
TableAdapter.ClearBeforeFill Menentukan apakah tabel data dikosongkan sebelum Anda memanggil salah satu metode Fill.

Metode pembaruan TableAdapter

TableAdapters menggunakan perintah data untuk membaca dan menulis dari database. Gunakan kueri awal Fill TableAdapter (utama) sebagai dasar untuk membuat skema tabel data terkait, serta perintah InsertCommand, UpdateCommand, dan DeleteCommand yang terkait dengan metode TableAdapter.Update. Memanggil metode Update TableAdapter akan menjalankan pernyataan yang dibuat saat TableAdapter awalnya dikonfigurasi, dan bukan salah satu kueri tambahan yang Anda tambahkan dengan Wizard Konfigurasi Kueri TableAdapter.

Saat Anda menggunakan TableAdapter, TableAdapter secara efektif melakukan operasi yang sama dengan perintah yang biasanya Anda lakukan. Misalnya, saat Anda memanggil metode Fill adaptor, adaptor menjalankan perintah data di propertinya SelectCommand dan menggunakan pembaca data (misalnya, SqlDataReader) untuk memuat tataan hasil ke dalam tabel data. Demikian pula, ketika Anda memanggil metode Update adaptor, ia menjalankan perintah yang sesuai (di properti UpdateCommand, InsertCommand, dan DeleteCommand) untuk setiap rekaman yang diubah dalam tabel data.

Catatan

Jika ada cukup informasi dalam kueri utama, perintah InsertCommand, UpdateCommand, dan DeleteCommand dibuat secara default saat TableAdapter dibuat. Jika kueri utama TableAdapter lebih dari satu pernyataan tabel SELECT, ada kemungkinan perancang tidak akan dapat menghasilkan InsertCommand, UpdateCommand, dan DeleteCommand. Jika perintah ini tidak dihasilkan, Anda mungkin menerima kesalahan saat menjalankan metode TableAdapter.Update.

TableAdapter GenerateDbDirectMethods

Selain InsertCommand, UpdateCommand, dan DeleteCommand, TableAdapters dibuat dengan metode yang dapat Anda jalankan langsung terhadap database. Anda dapat memanggil metode ini (TableAdapter.Insert, TableAdapter.Update, dan TableAdapter.Delete) secara langsung untuk memanipulasi data dalam database. Ini berarti Anda dapat memanggil metode individual ini dari kode Anda alih-alih memanggil TableAdapter.Update untuk menangani sisipan, pembaruan, dan penghapusan yang tertunda untuk tabel data terkait.

Jika Anda tidak ingin membuat metode langsung ini, atur properti GenerateDbDirectMethods TableAdapter ke false (di jendela Properti). Kueri tambahan yang ditambahkan ke TableAdapter adalah kueri mandiri — kueri tersebut tidak menghasilkan metode ini.

Dukungan TableAdapter untuk jenis yang dapat diubah ke null

TableAdapters mendukung jenis yang dapat diubah ke null Nullable(Of T) dan T?. Untuk informasi selengkapnya tentang jenis yang dapat diubah ke null di Visual Basic, lihat Jenis Nilai Yang Dapat Diubah Ke null. Untuk informasi selengkapnya tentang jenis yang dapat diubah ke null di C#, lihat Menggunakan jenis yang dapat diubah ke null.

Referensi TableAdapterManager

Secara default, kelas TableAdapterManager dihasilkan saat Anda membuat himpunan data yang berisi tabel terkait. Untuk mencegah kelas dibuat, ubah nilai properti Hierarchical Update himpunan data menjadi false. Saat Anda menyeret tabel yang memiliki hubungan ke permukaan desain halaman Formulir Windows atau WPF, Visual Studio akan mendeklarasikan variabel anggota kelas. Jika Anda tidak menggunakan pengikatan data, Anda harus mendeklarasikan variabel secara manual.

Kelas TableAdapterManager bukan jenis .NET. Oleh karena itu, Anda tidak dapat mencarinya dalam dokumentasi. Kelas ini dibuat pada waktu desain sebagai bagian dari proses pembuatan himpunan data.

Berikut ini adalah metode dan properti kelas TableAdapterManager yang sering digunakan:

Anggota Deskripsi
metode UpdateAll Menyimpan semua data dari semua tabel data.
Properti BackUpDataSetBeforeUpdate Menentukan apakah akan membuat salinan cadangan himpunan data sebelum menjalankan metode.Boolean TableAdapterManager.UpdateAll.
properti tableName TableAdapter Mewakili TableAdapter. TableAdapterManager yang dihasilkan berisi properti untuk setiap TableAdapter yang dikelolanya. Misalnya, himpunan data dengan tabel Pelanggan dan Pesanan dihasilkan dengan TableAdapterManager yang berisi properti CustomersTableAdapter dan OrdersTableAdapter.
Properti UpdateOrder Mengontrol urutan perintah sisipkan, perbarui, dan hapus individu. Atur ini ke salah satu nilai dalam enumerasi TableAdapterManager.UpdateOrderOption.

Secara default, UpdateOrder diset ke InsertUpdateDelete. Ini berarti bahwa sisipan, lalu pembaruan, dan kemudian penghapusan dilakukan untuk semua tabel dalam himpunan data.

Keamanan

Saat Anda menggunakan perintah data dengan properti CommandType diatur ke Text, periksa dengan cermat informasi yang dikirim dari klien sebelum meneruskannya ke database Anda. Pengguna jahat mungkin mencoba mengirim (memasukkan) pernyataan yang dimodifikasi atau SQL tambahan dalam upaya untuk mendapatkan akses yang tidak sah atau merusak database. Sebelum Anda mentransfer input pengguna ke database, selalu verifikasi bahwa informasi tersebut valid. Praktik terbaik adalah selalu menggunakan kueri berparameter atau prosedur tersimpan jika memungkinkan.