(1) المقدمة
عندما تحتوي مجموعة البيانات على كل من الجداول الأساسية/الفرعية (جداول المفاتيح الأساسية/جداول المفاتيح الخارجية)، تكون قيود العلاقة في بعض الأحيان صارمة للغاية:
على سبيل المثال، قواعد تكامل قاعدة البيانات العلائقية:
1. لا يُسمح بأن يكون المفتاح الأساسي في جدول المفتاح الأساسي فارغًا.
2. يجب أن تتوافق قيمة المفتاح الخارجي في جدول المفاتيح الخارجية مع المفتاح الأساسي في جدول المفاتيح الأساسية.
إما فارغة أو قيمة مفتاح أساسي في جدول المفتاح الأساسي.
3. تخصيص النزاهة.
إذا كانت قيود العلاقة المتعددة الجداول المحددة في جدول DataSet صارمة للغاية، فاستخدم أسلوب التحديث مباشرة.
عند إرسال جداول متعددة في DataSet معًا، قد لا يتم استيفاء قواعد التكامل وقد يحدث خطأ.
السبب: على سبيل المثال، قم بإعداد جدولين: CompanyMain (الجدول الرئيسي للشركة) وCompanySon (الجدول الفرعي للشركة)
CompanyMain (الجدول الرئيسي للشركة) يخزن بشكل أساسي المعلومات الأساسية للشركة، CompanySon (الجدول الفرعي للشركة)
يقوم بشكل أساسي بتخزين معلومات عن بعض عملاء هذه الشركة و (ID) في الجدول الرئيسي للشركة و (BelongID) في الجدول الفرعي
إنشاء اقتران، أي علاقة مفاتيح أساسية وخارجية؛ وتتوافق شركة واحدة مع العديد من العملاء، أي علاقة ID:BelongID = 1:n.
معرف الجدول الرئيسي هو رقم يتم إنشاؤه تلقائيًا.
لذا:
عند إرسال واجهة الشركة الجديدة معًا، لن يلتزم النظام بـ "قواعد تكامل قاعدة البيانات" لتحديث قاعدة البيانات.
إذا قام بتحديث الجدول الفرعي أولاً ثم قام بتحديث الجدول الرئيسي، فقد يتم الإبلاغ عن خطأ والسبب هو أنه لم يتم إدراج معلومات الشركة في الجدول الرئيسي بعد.
إلى الجدول الموجود في قاعدة البيانات، رقم الشركة: لم يتم إنشاء المعرف، ولن يكون هناك معرف BelongID مطابق عند تحديث الجدول الفرعي.
في هذا الوقت، إذا تم تعيين قاعدة التكامل "المفتاح الخارجي في جدول المفاتيح الخارجية ليس فارغًا"، فسيتم طرح استثناء.
هذا مجرد احتمال للخطأ، وهناك احتمالات أكبر للخطأ، ومن المرجح أن تحدث مثل هذه الأخطاء في التصميم الموزع
(
2
).
القاعدة قبل تحديث مجموعة البيانات، قم بإجراء الإرسال المقسم بواسطة <table> و<سمة حالة الصف للجدول>
1. إجراء الإرسال المقسم بواسطة <table> يعني:
لا يتم إرسال الجداول الموجودة في DataSet معًا، ولكن يتم إرسالها واحدًا تلو الآخر. الجدول، إرسال عدة مرات
II. تقسيم الإرسال وفقًا لـ <سمة حالة الصف للجدول> يعني:
تقسيم جدول واحد في DataSet وفقًا لسمة RowState،
وإرسال نفس حالة الصف مرة واحدة، وإرساله عدة مرات
2.
القواعد 1، قم أولاً بتحديث حالة <new> و<modified>، ثم قم بتحديث <deleted>،
أي: قم أولاً بتحديث قيمة DataRowState: المضافة والمعدلة، ثم قم بالتحديث: محذوف
3.
بناءً على القاعدة 1 والقاعدة 2، إذا تمت إضافة DataRowState وتعديله، فسيتم تحديث الجدول الرئيسي أولاً، ثم يتم تحديث الجدول الفرعي بناءً على القاعدة
1 والقاعدة 2، إذا تم حذف DataRowState، فسيتم تحديث الجدول الفرعي أولاً، ثم. تم تحديث الجدول الفرعي.
(3) تلخيص القواعد الثلاثة المذكورة أعلاه على النحو التالي:
1. قم بتقسيم الجدول في DataSet، وقم بتجميع كل سجل جدول وفقًا لحالة الصف وتخزينه في مجموعات بيانات مختلفة
// يجب أن يكون هذا المخزنة في DataSet، وذلك للأسباب التالية: يقبل التحديث معلمات DataSet، وتدعم WebService فقط
مثال رمز
//DataSetلعملية التسلسل
:افترض أن مجموعة البيانات المراد تحديثها هي: dsCompany (الذي يتضمن جدولين، الجدول الرئيسي. والجدول الفرعي) الجدول، ويخزن
البيانات، ليتم تحديثها)
// dtCompanyMain يخزن معلومات الجدول الرئيسي للشركة، ويخزن dtCompanySon معلومات الجدول الفرعي للشركة
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone(); // افصل بيانات الجدول الرئيسي
وقم بتخزين كائن آخر
DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); // افصل بيانات الجدول الفرعي
وقم بتخزين كائن آخر
DataSet dsAdded = new DataSet(); // تخزين البيانات المضافة حديثًا للجدول الرئيسي
DataSet dsMidified = new DataSet(); تخزين سجل الصف الذي تم تحريره في الجدول الرئيسي
DataSet dsDeleted = new DataSet(); // تخزين سجل الصف المحذوف في الجدول الرئيسي
dsAdded = dtCompanyMain.GetChanges(DataRowState.Added); // احصل علىمجموعة سجل
الصف الجديد
في الجدول الرئيسيdsMidified = dtCompanyMain.GetChanges (DataRowState.Modified); // احصل على مجموعة سجلات الصف
التي تم تحريرها
في الجدول الرئيسي dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); // احصل علىمجموعة سجلات الصف
المحذوفة في الجدول الرئيسي
2. قم بتحديث حالة DataRowState من الجدول الرئيسي إلى: السجلات المضافة والمعدلة.
SqlDataAdapter.Update(dsAdded,"dtCompanyMain"); // تحديث مجموعة السجلات المضافة إلى قاعدة البيانات
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); إلى
قاعدة البيانات
3. تحديث حالة DataRowState للجدول الفرعي هي: السجلات المضافة والمعدلة
... // تم حذف الكود، على غرار تحديث الجدول الرئيسي
4. تحديث حالة DataRowState للجدول الفرعي: السجلات المحذوفة
... ..... .... // تم حذف الكود، مشابه للرقم 5 الموجود أدناه
5. قم بتحديث حالة الجدول الرئيسي DataRowState إلى: السجلات المحذوفة
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain"); // تحديث مجموعة السجلات المعدلة إلى قاعدة البيانات
شكرا للقراءة!