Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ketika properti SelectCommand ditentukan secara dinamis pada waktu runtime, seperti melalui alat kueri yang menerima perintah teks dari pengguna, Anda mungkin tidak dapat menentukan InsertCommand, UpdateCommand, atau DeleteCommand yang sesuai pada waktu desain. Jika DataTable Anda dipetakan ke atau dihasilkan dari satu tabel database, Anda dapat menggunakan objek DbCommandBuilder untuk menghasilkan DeleteCommand, InsertCommand, dan UpdateCommand dari DbDataAdapter secara otomatis.
Sebagai persyaratan minimum, Anda harus mengatur SelectCommand properti agar pembuatan perintah otomatis berfungsi. Skema tabel yang diambil oleh SelectCommand properti menentukan sintaksis pernyataan INSERT, UPDATE, dan DELETE yang dihasilkan secara otomatis.
DbCommandBuilder harus menjalankan SelectCommand untuk mengembalikan metadata yang diperlukan untuk membuat perintah INSERT, UPDATE, dan DELETE SQL. Akibatnya, perjalanan tambahan ke sumber data diperlukan, dan ini dapat menghambat performa. Untuk mencapai performa optimal, tentukan perintah Anda secara eksplisit daripada menggunakan DbCommandBuilder.
juga SelectCommand harus mengembalikan setidaknya satu kunci primer atau kolom unik. Jika tidak ada yang hadir, InvalidOperation pengecualian dihasilkan, dan perintah tidak dihasilkan.
Ketika dikaitkan dengan DataAdapter, DbCommandBuilder secara otomatis menghasilkan properti InsertCommand, UpdateCommand, dan DeleteCommand dari DataAdapter jika properti tersebut adalah referensi null. Jika Command sudah ada untuk properti, maka Command yang sudah ada akan digunakan.
Tampilan database yang dibuat dengan menggabungkan dua tabel atau lebih bersama-sama tidak dianggap sebagai tabel database tunggal. Dalam hal ini Anda tidak dapat menggunakan DbCommandBuilder untuk membuat perintah secara otomatis; Anda harus menentukan perintah Anda secara eksplisit. Untuk informasi tentang penetapan perintah secara eksplisit untuk menyelesaikan pembaruan ke DataSet kembali ke sumber data, lihat Memperbarui Sumber Data dengan DataAdapter.
Anda mungkin ingin memetakan parameter output kembali ke baris dari DataSet yang diperbarui. Satu tugas umum adalah mengambil nilai bidang identitas yang dihasilkan secara otomatis atau stempel waktu dari sumber data.
DbCommandBuilder tidak akan memetakan parameter output ke kolom dalam baris yang diperbarui secara default. Dalam hal ini, Anda harus menentukan perintah Anda secara eksplisit. Untuk contoh pemetaan kolom identitas yang dihasilkan secara otomatis kembali ke kolom baris yang disisipkan, lihat Mengambil Identitas atau Nilai Penomoran Otomatis.
Aturan untuk Perintah yang Dihasilkan Secara Otomatis
Tabel berikut ini memperlihatkan aturan tentang bagaimana perintah yang dihasilkan secara otomatis dihasilkan.
| Perintah | Peraturan |
|---|---|
InsertCommand |
Menyisipkan satu baris di sumber data untuk semua baris dalam tabel yang memiliki RowState dan Added. Menyisipkan nilai untuk semua kolom yang dapat diperbarui (tetapi bukan kolom seperti identitas, ekspresi, atau tanda waktu). |
UpdateCommand |
Memperbarui baris di sumber data untuk semua baris dalam tabel dengan nilai RowState dari Modified. Memperbarui nilai semua kolom kecuali untuk kolom yang tidak dapat diperbarui, seperti identitas atau ekspresi. Memperbarui semua baris di mana nilai kolom di sumber data cocok dengan nilai kolom kunci utama baris, dan di mana kolom yang tersisa di sumber data cocok dengan nilai asli baris. Untuk informasi selengkapnya, lihat "Model Konkurensi Optimis untuk Pembaruan dan Penghapusan," nanti dalam topik ini. |
DeleteCommand |
Menghapus baris di sumber data untuk semua baris dalam tabel dengan RowState dari Deleted. Menghapus semua baris di mana nilai kolom cocok dengan nilai kolom kunci utama baris, dan di mana kolom yang tersisa di sumber data cocok dengan nilai asli baris. Untuk informasi selengkapnya, lihat "Model Konkurensi Optimis untuk Pembaruan dan Penghapusan," nanti dalam topik ini. |
Model Konkurensi Optimis untuk Pembaruan dan Penghapusan
Logika untuk menghasilkan perintah secara otomatis untuk pernyataan UPDATE dan DELETE didasarkan pada konkurensi optimis--yaitu, rekaman tidak dikunci untuk pengeditan dan dapat dimodifikasi oleh pengguna atau proses lain kapan saja. Karena rekaman dapat dimodifikasi setelah dikembalikan dari pernyataan SELECT, tetapi sebelum pernyataan UPDATE atau DELETE dikeluarkan, pernyataan UPDATE atau DELETE yang dihasilkan secara otomatis berisi klausul WHERE, menentukan bahwa baris hanya diperbarui jika berisi semua nilai asli dan belum dihapus dari sumber data. Ini dilakukan untuk menghindari penimpaan data baru. Di mana pembaruan yang dihasilkan secara otomatis mencoba memperbarui baris yang telah dihapus atau yang tidak berisi nilai asli yang ditemukan di DataSet, perintah tidak memengaruhi rekaman apa pun, dan dilemparkan DBConcurrencyException .
Jika Anda ingin pembaruan atau hapus selesai tanpa mempedulikan nilai aslinya, Anda harus secara eksplisit mengatur UpdateCommand untuk DataAdapter dan tidak mengandalkan pembuatan perintah secara otomatis.
Batasan Logika Pembuatan Perintah Otomatis
Batasan berikut berlaku untuk pembuatan perintah otomatis.
Tabel Yang Tidak Terkait Saja
Logika pembuatan perintah otomatis menghasilkan pernyataan INSERT, UPDATE, atau DELETE untuk tabel mandiri tanpa memperhitungkan hubungan apa pun dengan tabel lain di sumber data. Akibatnya, Anda mungkin mengalami kegagalan saat memanggil Update untuk mengirimkan perubahan untuk kolom yang berpartisipasi dalam batasan kunci asing dalam database. Untuk menghindari pengecualian ini, jangan gunakan DbCommandBuilder untuk memperbarui kolom yang terlibat dalam batasan kunci asing; sebagai gantinya, tentukan pernyataan yang digunakan untuk melakukan operasi secara eksplisit.
Nama Tabel dan Kolom
Logika pembuatan perintah otomatis mungkin gagal jika nama kolom atau nama tabel berisi karakter khusus, seperti spasi, titik, tanda kutip, atau karakter nonalphanumeric lainnya, bahkan jika dibatasi oleh tanda kurung. Bergantung pada penyedia, mengatur parameter QuotePrefix dan QuoteSuffix dapat memungkinkan logika pembuatan memproses ruang, tetapi tidak dapat menghindari karakter khusus. Nama tabel yang sepenuhnya memenuhi syarat dalam bentuk catalog.schema.table didukung.
Menggunakan CommandBuilder untuk Membuat Pernyataan SQL secara Otomatis
Untuk secara otomatis menghasilkan pernyataan SQL untuk DataAdapter, pertama-tama atur properti SelectCommand dari DataAdapter, lalu buat objek CommandBuilder, dan tentukan DataAdapter sebagai argumen, yang CommandBuilder akan secara otomatis menghasilkan pernyataan SQL.
' Assumes that connection is a valid SqlConnection object
' inside of a Using block.
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT * FROM dbo.Customers", connection)
Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter)
builder.QuotePrefix = "["
builder.QuoteSuffix = "]"
// Assumes that connection is a valid SqlConnection object
// inside of a using block.
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
Memodifikasi SelectCommand
Jika Anda mengubah CommandText dari SelectCommand setelah perintah INSERT, UPDATE, atau DELETE dibuat secara otomatis, pengecualian mungkin terjadi. Jika yang dimodifikasi SelectCommand.CommandText berisi informasi skema yang tidak konsisten dengan SelectCommand.CommandText yang digunakan ketika perintah sisipkan, perbarui, atau hapus dibuat secara otomatis, panggilan mendatang ke DataAdapter.Update metode dapat mencoba mengakses kolom yang tidak lagi ada dalam tabel saat ini yang dirujuk oleh SelectCommand, dan pengecualian akan dilemparkan.
Anda dapat me-refresh informasi skema yang digunakan oleh CommandBuilder untuk menghasilkan perintah secara otomatis dengan memanggil metode dari RefreshSchemaCommandBuilder.
Jika Anda ingin tahu perintah apa yang dibuat secara otomatis, Anda dapat memperoleh referensi ke perintah yang dihasilkan secara otomatis dengan menggunakan metode GetInsertCommand, GetUpdateCommand, dan GetDeleteCommand dari objek CommandBuilder dan memeriksa properti CommandText dari perintah terkait.
Contoh kode berikut menulis ke konsol perintah pembaruan yang dibuat secara otomatis.
Console.WriteLine(builder.GetUpdateCommand().CommandText)
Console.WriteLine(builder.GetUpdateCommand().CommandText);
Contoh berikut membuat ulang tabel dalam dataset Customers. Metode RefreshSchema ini dipanggil untuk menyegarkan perintah yang dihasilkan secara otomatis dengan informasi kolom baru ini.
' Assumes an open SqlConnection and SqlDataAdapter inside of a Using block.
adapter.SelectCommand.CommandText = _
"SELECT CustomerID, ContactName FROM dbo.Customers"
builder.RefreshSchema()
custDS.Tables.Remove(custDS.Tables("Customers"))
adapter.Fill(custDS, "Customers")
// Assumes an open SqlConnection and SqlDataAdapter inside of a using block.
adapter.SelectCommand.CommandText =
"SELECT CustomerID, ContactName FROM dbo.Customers";
builder.RefreshSchema();
custDS.Tables.Remove(custDS.Tables["Customers"]);
adapter.Fill(custDS, "Customers");