(1) Prolog
Ketika DataSet berisi primer/sub tabel (tabel kunci primer/tabel kunci asing), terkadang batasan hubungan terlalu ketat:
Misalnya, aturan integritas database relasional:
1. Integritas entitas. Kunci utama dalam tabel kunci utama tidak boleh kosong.
2. Integritas referensial. Nilai kunci asing pada tabel kunci asing harus sesuai dengan kunci utama pada tabel kunci utama.
Entah kosong atau nilai kunci utama dalam tabel kunci utama.
3. Sesuaikan integritas.
Jika batasan hubungan multi-tabel yang ditentukan dalam tabel DataSet terlalu ketat, gunakan metode Pembaruan secara langsung.
Saat mengirimkan beberapa tabel dalam Kumpulan Data secara bersamaan, aturan integritas mungkin tidak terpenuhi dan kesalahan mungkin terjadi.
Alasan: Misalnya, siapkan dua tabel: CompanyMain (tabel utama perusahaan) dan CompanySon (subtabel perusahaan)
CompanyMain (tabel utama perusahaan) terutama menyimpan informasi dasar suatu perusahaan, CompanySon (sub-tabel perusahaan)
Ini terutama menyimpan informasi tentang beberapa pelanggan perusahaan ini. Dan (ID) di tabel utama perusahaan dan (BelongID) di sub-tabel
Membangun asosiasi, yaitu hubungan kunci utama dan asing satu perusahaan berhubungan dengan banyak pelanggan, yaitu hubungan ID:BelongID = 1:n.
ID tabel utama adalah nomor yang dibuat secara otomatis.
Jadi:
Ketika mengirimkan antarmuka perusahaan baru bersama-sama, sistem tidak akan mematuhi "aturan integritas database" untuk memperbarui database.
Jika memperbarui subtabel terlebih dahulu lalu memperbarui tabel utama, mungkin terjadi kesalahan karena informasi perusahaan di tabel utama belum dimasukkan.
Ke tabel dalam database, nomor perusahaan: ID tidak dibuat, dan tidak akan ada BelongID yang sesuai ketika sub-tabel diperbarui.
Pada saat ini, jika aturan integritas "Kunci asing dalam tabel kunci asing bukan nol" disetel, pengecualian akan dilempar.
Ini hanya kemungkinan kesalahan, ada lebih banyak kemungkinan kesalahan, dan kesalahan seperti itu lebih mungkin terjadi dalam desain terdistribusi
2
). Solusinya
umumnya mengikuti aturan berikut, yang akan menghindari banyak kemungkinan kesalahan
Aturannya. Sebelum memperbarui DataSet, lakukan pengiriman terpisah dengan <tabel> dan <Atribut RowState dari tabel>
I. Lakukan pengiriman terpisah dengan <tabel> artinya:
tabel-tabel dalam DataSet tidak dikirimkan secara bersamaan, tetapi dikirimkan satu per satu. Tabel, kirimkan beberapa kali
II. Pengiriman terpisah menurut <atribut RowState dari tabel> berarti:
membagi satu tabel dalam DataSet berdasarkan atribut RowState,
mengirimkan RowState yang sama satu kali, dan mengirimkan beberapa kali
2.
Berdasarkan aturan 1, perbarui dulu status <baru> dan <dimodifikasi>, lalu perbarui <dihapus>.
Yaitu: perbarui terlebih dahulu nilai DataRowState: Ditambahkan dan Dimodifikasi, lalu perbarui: Dihapus
3.
Berdasarkan Aturan 1 dan Aturan 2, jika DataRowState Ditambahkan dan Dimodifikasi, tabel utama diperbarui terlebih dahulu, lalu subtabel
diperbarui terlebih dahulu, baru kemudian subtabel
diperbarui.sub-tabel diperbarui. Perbarui tabel utama.
(3) Ringkaslah tiga aturan di atas sebagai berikut:
1. Pisahkan tabel dalam Kumpulan Data, kelompokkan setiap catatan tabel menurut RowState dan simpan dalam kumpulan data yang berbeda
// Ini seharusnya disimpan di DataSet, Hal ini karena: Pembaruan menerima parameter DataSet, dan WebService hanya mendukung
//DataSet.Contoh kode
untuk operasi serialisasi
:Asumsikan bahwa kumpulan data yang akan diperbarui adalah: dsCompany (yang mencakup dua tabel, tabel utama dan sub tabel) tabel, dan menyimpan
data, untuk diperbarui)
//dtCompanyMain menyimpan informasi tabel utama perusahaan, dtCompanySon menyimpan informasi sub-tabel perusahaan
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone(); //Pisahkan data tabel utama
dan simpan objek lain
DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); //Pisahkan data sub-tabel
dan simpan objek lain
DataSet dsAdded = new DataSet(); //Penyimpanan data yang baru ditambahkan dari tabel utama
DataSet dsMidified = new DataSet(); Penyimpanan tabel utama Catatan baris tabel yang diedit
DataSet dsDeleted = new DataSet(); //Penyimpanan catatan baris tabel utama yang dihapus
dsAdded = dtCompanyMain.GetChanges(DataRowState.Added); //Dapatkan
kumpulan catatan
baris baru di tabel utamadsMidified = dtCompanyMain.GetChanges (DataRowState.Modified); //
Mengedit
kumpulan record baris di tabel utama dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); //Menghapuskumpulan record baris
di tabel utama
2. Perbarui status DataRowState dari tabel utama ke: Catatan yang ditambahkan dan Dimodifikasi
SqlDataAdapter.Update(dsAdded,"dtCompanyMain"); //Perbarui kumpulan catatan yang ditambahkan ke database
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); //Perbarui kumpulan catatan yang diubah ke
database
3. Perbarui status sub Tabel DataRowState adalah: Catatan yang Ditambahkan dan Dimodifikasi
... //Kode dihilangkan, mirip dengan 2 pembaruan tabel utama
4. Perbarui status DataRowState sub-tabel: Catatan yang dihapus
. .... // Kode dihilangkan, mirip dengan 5 di bawah
5. Perbarui status tabel utama DataRowState menjadi: Catatan yang dihapus
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain" // Perbarui kumpulan catatan yang dimodifikasi ke database
Terima kasih telah membaca!