المتابعون للمدونة

الثلاثاء، 18 أبريل 2017

ContinueUpdateOnError


 استمرار التحديث عند الخطأ DataAdapter.ContinueUpdateOnError:

إذا جعلت قيمة هذه الخاصية True، فلن يحدث خطأ في البرنامج إذا حدثت مشكلة في تحديث أحد سجلات قاعدة البيانات، وستستمر محاولة تحديث باقي السجلات، مع إرسال تفاصيل المشكلة إلى الخاصية RowError الخاصة بكائن الصف DataRow الذي فشلت عملية تحديثه.

والقيمة الافتراضية لهذه الخاصية هي False، لهذا سيحدث خطأ في البرنامج لو فشل تحديث أحد السجلات، وستتوقف عملية تحديث السجلات في الحال.. وأنت حر في اختيار الطريقة التي تناسبك أكثر لمعالجة مثل هذه الأخطاء.. والمشروع UpdateErrors يتيح للمستخدم اختيار الطريقة التي تناسبه من خلال مربع الاختيار Check Box الموضوع على النموذج.. فلو اختار "مواصلة التحديث رغم حدوث أخطاء"، فسنعرض له تقريرا بالأخطاء التي حدثت ونطلب منه إصلاحها كما توضح الصورة.
 


لاحظ أن جدول العرض يمنع معظم الأخطاء، فهو يرفض ترك خانة فارغة إذا كانت لا تقبل القيمة Null، كما يرفض أي نص يتكون من عدد من الحروف أطول مما تقبله الخانة.. لهذا لو أردت اختبار هذا البرنامج، فليس أمامك إلا أن تضع في العمود CountryID رقما أكبر من 22، لأن قيد المفتاح الفرعي FOREIGN KEY Constraint بين جدول الدول وجدول المؤلفين، يمنعك من استخدام رقم دولة ليس موجودا في جدول الدول.

أما إن اختار المستخدم إيقاف التحديث عند حدوث أخطاء، فسنستخدم المقطع Try Catch لنعرض له رسالة خطأ عند فشل تحديث أي سجل، ونحدد له هذا السجل في أدوات العرض ليقوم بتصحيحه وإعادة المحاولة.

لاحظ أن السجلات التالية لهذا السجل لم تحفظ حتى الآن، وعند تكرار محاولة الحفظ سيتم حفظها، وقد تظهر أخطاء جديدة في أي سجل منها في تلك اللحظة، حيث يتوجب على المستخدم تصحيحها أيضا وإعادة المحاولة.... وهكذا.. ورغم أن هذا يبدو مملا، إلأ أنه أسهل من كتابة تقرير طويل وترك المستخدم يبحث عن السجلات المذكورة في هذا التقرير لتصحيحها.

هذا هو كود زر الحفظ، مع استثناء الكود الذي يجمع أخطاء السجلات في الحالة الأولى، لأننا سنتعرف عليه في فصل لاحق:

 
 
If ChkContinue.Checked Then
     ' استمرار التحديث رغم حدوث أخطاء
    DaAuthors.ContinueUpdateOnError = True
    DaAuthors.Update(Ds)
    ' علينا جمع الأخطاء التي حدثت وعرضها في تقرير للمستخدم
    ' ………………………….
Else ' إيقاف التحديث عند حدوث أي خطأ
    DaAuthors.ContinueUpdateOnError = False
    Try
          DaAuthors.Update(Ds)
    Catch ex As SqlException
          MsgBox(ex.Message)
    End Try
End If
 
 
لاحظ أننا لم نكتب أي كود لوضع علامة الخطأ التي تظهر في جدول العرض بجوار السجل الذي سبب المشكلة، فهي تظهر تلقائيا بسبب وجود ربط Binding بين جدول العرض ومجموعة البيانات.. وسنتعرف على تقنية ربط البيانات بالتفصيل في فصل لاحق.

ولعلك تلجأ في برنامجك إلى تعريب أهم رسائل الخطأ التي تتوقع حدوثها، لتعرض للمستخدم العربي رسائل يستطيع فهمها، وكذلك لمنع المستخدم من معرفة أسماء الجداول والأعمدة الموجودة في قاعدة البيانات، والتي قد يستخدمها أي قرصان لمحاولة حقن استعلامات غير مرغوبة وتخريب قاعدة البيانات.. في المثال السابق مثلا، كل ما يهم المستخدم أن يعرفه هو: "لا توجد دولة لها الرقم الذي أدخلته".. طبعا سيحتاج منك الأمر إلى بعض الجهد لكتابة كود يحلل نص الرسالة ويبني النص العربي بناء على أسماء الجداول والأعمدة الموجودة فيها.. لهذا فمن الأذكى أن تقلل احتمالات الخطأ في برنامجك إلى أقصى حد.. ففي البرامج الحقيقية، ليس على المستخدم أن يكتب أرقام الدول، بل عليك أن تعرض له قائمة منسدلة فيها أسماء الدول، ليختار هو منها مباشرة، كما هو موضح في الصورة.. هذا لا يسهل عليه الحياة فقط، بل يمنعه من إحداث أخطاء لا لزوم لها في البرنامج.. وستجد مثالا على هذا في المشروع UpdateErrors2، والذي سيتعذر عليك فيه رؤية أي مثال على أخطاء التحديث.. في هذا المشروع أيضا تخلصنا من رسالة الخطأ العقيمة التي يعرضها جدول العرض عند مغادرة صف فيه أخطاء، وعرضنا رسالة خطأ خاصة بنا باستخدام الحدث DataGridView.DataError، ما يمنع المستخدم من معرفة أسماء الجداول والأعمدة الموجودة في قاعدة البيانات.

لمزيد من التفاصيل انظر فئة موصل البيانات DataAdapter

 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر