(1) อารัมภบท
เมื่อชุดข้อมูลมีทั้งตารางหลัก/ตารางย่อย (ตารางคีย์หลัก/ตารางคีย์ต่างประเทศ) บางครั้งข้อจำกัดของความสัมพันธ์จะเข้มงวดเกินไป:
ตัวอย่างเช่น กฎความสมบูรณ์ของฐานข้อมูลเชิงสัมพันธ์:
1. ความสมบูรณ์ของเอนทิตี คีย์หลักในตารางคีย์หลักไม่ได้รับอนุญาตให้ว่างเปล่า
2. Referential Integrity ค่าของ Foreign Key ในตาราง Foreign Key จะต้องสอดคล้องกับคีย์หลักในตารางคีย์หลัก
ว่างเปล่าหรือเป็นค่าคีย์หลักในตารางคีย์หลัก
3. ปรับแต่งความสมบูรณ์
ถ้าข้อจำกัดความสัมพันธ์แบบหลายตารางที่กำหนดไว้ในตารางชุดข้อมูลเข้มงวดเกินไป ให้ใช้วิธีการอัปเดตโดยตรง
เมื่อส่งหลายตารางในชุดข้อมูลพร้อมกัน อาจไม่เป็นไปตามกฎความสมบูรณ์และอาจเกิดข้อผิดพลาดได้
เหตุผล: ตัวอย่างเช่น ตั้งค่าสองตาราง: CompanyMain (ตารางหลักของบริษัท) และ CompanySon (ตารางย่อยของบริษัท)
CompanyMain (ตารางหลักของบริษัท) เก็บข้อมูลพื้นฐานของบริษัทเป็นหลัก CompanySon (ตารางย่อยของบริษัท)
โดยส่วนใหญ่จะเก็บข้อมูลเกี่ยวกับลูกค้าบางรายของบริษัทนี้ และ (ID) ไว้ในตารางหลักของบริษัท และ (BelongID) ไว้ในตารางย่อย
สร้างการเชื่อมโยง นั่นคือ ความสัมพันธ์หลักและคีย์ต่างประเทศ บริษัทหนึ่งสอดคล้องกับลูกค้าหลายราย นั่นคือ ความสัมพันธ์ ID:BelongID = 1:n
ID ของตารางหลักเป็นตัวเลขที่สร้างขึ้นโดยอัตโนมัติ
ดังนั้น:
เมื่อส่งอินเทอร์เฟซของบริษัทใหม่พร้อมกัน ระบบจะไม่ปฏิบัติตาม "กฎความสมบูรณ์ของฐานข้อมูล" เพื่ออัปเดตฐานข้อมูล
หากอัพเดตตารางย่อยก่อนแล้วจึงอัพเดตตารางหลัก อาจมีการรายงานข้อผิดพลาด สาเหตุคือยังไม่ได้แทรกข้อมูลบริษัทในตารางหลัก
ไปยังตารางในฐานข้อมูล หมายเลขบริษัท: ID จะไม่ถูกสร้างขึ้น และจะไม่มี BelongID ที่สอดคล้องกันเมื่อมีการอัพเดตตารางย่อย
ในเวลานี้ หากตั้งค่ากฎความสมบูรณ์ "คีย์ต่างประเทศในตารางคีย์ต่างประเทศไม่เป็นโมฆะ" ข้อยกเว้นจะถูกส่งออกไป
นี่เป็นเพียงความเป็นไปได้ของข้อผิดพลาด มีความเป็นไปได้มากกว่า และข้อผิดพลาดดังกล่าวมีแนวโน้มที่จะเกิดขึ้นในการออกแบบแบบกระจาย
(2) โดยทั่วไปวิธีแก้ปัญหา
จะเป็นไปตามกฎต่อไปนี้ ซึ่งจะหลีกเลี่ยงโอกาส
ที่จะเกิดข้อผิดพลาดจำนวนมาก
กฎ ก่อนที่จะอัปเดตชุดข้อมูล ให้ดำเนินการส่งแบบแยกโดย <table> และ <RowState คุณลักษณะของตาราง>
I. ดำเนินการส่งแบบแยกโดย <table> หมายความว่า:
ตารางในชุดข้อมูลจะไม่ถูกส่งพร้อมกัน แต่ส่งทีละรายการ ตาราง ส่งหลายครั้ง
II. แยกการส่งตาม <แอตทริบิวต์ RowState ของตาราง> หมายถึง:
แบ่งตารางเดียวในชุดข้อมูลตามแอตทริบิวต์ RowState
ส่ง RowState เดียวกันหนึ่งครั้ง และส่งหลายครั้ง
2. กฎ
ตามกฎ 1 ขั้นแรกให้อัปเดตสถานะของ <new> และ <modified> จากนั้นอัปเดต <deleted>
นั่นคือ: ขั้นแรกให้อัปเดตค่าDataRowState
: เพิ่มและแก้ไข แล้วอัปเดต: ลบ
แล้ว
2 ถ้า DataRowState ถูกเพิ่มและแก้ไข ตารางหลักจะได้รับการอัปเดตก่อน จากนั้นตารางย่อยจะได้รับการอัปเดต ตามกฎข้อที่
1 และกฎข้อที่ 2 หาก DataRowState ถูกลบ ตารางย่อยจะได้รับการอัปเดตก่อน จากนั้น ตารางย่อยได้รับการอัปเดตแล้ว
(3) สรุปกฎสามข้อข้างต้นดังนี้:
1. แยกตารางในชุดข้อมูล จัดกลุ่มแต่ละระเบียนตาม RowState และจัดเก็บไว้ในชุดข้อมูลที่แตกต่างกัน
// ซึ่งควรจะเป็น เก็บไว้ในชุดข้อมูล เนื่องจาก: อัปเดตยอมรับพารามิเตอร์ของชุดข้อมูล และ WebService รองรับเฉพาะ
//ชุดข้อมูลตัวอย่างโค้ด
สำหรับการดำเนินการซีเรียลไลซ์
:สมมติว่าชุดข้อมูลที่จะอัปเดตคือ: dsCompany (ซึ่งรวมถึงสองตาราง ตารางหลัก และตารางย่อย) ตารางและจัดเก็บ
ข้อมูลที่จะอัพเดต)
//dtCompanyMain เก็บข้อมูลตารางหลักของบริษัท dtCompanySon เก็บข้อมูลตารางย่อยของบริษัท
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone(); //แยกข้อมูลตารางหลัก
และเก็บวัตถุอื่น
DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); //แยกข้อมูลตารางย่อย
และเก็บวัตถุอื่น
DataSet dsAdded = new DataSet(); //จัดเก็บข้อมูลที่เพิ่มใหม่ของตารางหลัก
DataSet dsMidified = new DataSet(); การจัดเก็บตารางหลัก บันทึกแถวที่แก้ไขแล้ว
ชุดข้อมูล dsDeleted = ชุดข้อมูลใหม่ (); // การจัดเก็บตารางหลัก บันทึกแถวที่ถูกลบ
dsAdded = dtCompanyMain.GetChanges (DataRowState.Added); // รับ
ชุดบันทึก
แถวใหม่ในตารางหลักdsMidified = dtCompanyMain.GetChanges (DataRowState.Deleted); // รับชุดบันทึกแถวที่
แก้ไข
ในตารางหลัก2.
อัป
เดตสถานะ DataRowState ของตารางหลักไปที่: เพิ่มและแก้ไขระเบียน
SqlDataAdapter.Update(dsAdded,"dtCompanyMain"); //อัปเดตชุดระเบียนที่เพิ่มไปยังฐานข้อมูล
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); //อัปเดตชุดระเบียนที่แก้ไข ไปยัง
ฐานข้อมูล
3. อัปเดตสถานะตารางย่อย DataRowState คือ: เพิ่มและแก้ไขระเบียน
... // ละเว้นรหัส, คล้ายกับการอัปเดตตารางหลัก 2 รายการ
4. อัปเดตสถานะตารางย่อย DataRowState: บันทึกที่ถูก
ลบ .... // ละเว้นรหัสคล้ายกับ 5 ด้านล่าง
5 อัปเดตสถานะ DataRowState ของตารางหลักเป็น: ลบระเบียน
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain"); // อัปเดตชุดระเบียนที่แก้ไขไปยังฐานข้อมูล
ขอบคุณสำหรับการอ่าน!