استمرار التحديث عند الخطأ 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
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.