أهم أقسام المدونة

الصفحات

الاثنين، 15 مايو 2017

SqlDataAdapter Class

 فئة موصل بيانات سيكويل SqlDataAdapter Class 

 هذه الفئة ترث الفئة DbDataAdapter، وهي تعمل كموصل بيانات مخصص للتعامل مع قواعد بيانات سيكويل سيرفر.
ولحدث إنشاء هذه الفئة أربع صيغ:
1- الصيغة الأولى بدون معاملات.
2- والصيغة الثانية تستقبل أمر التحديد SelectCommand الذي سيستخدمه موصل البيانات لملء مجموعة البيانات.
3- والصيغة الثالثة تستقبل معاملين:
- نص جملة التحديد SELECT.
- كائن الاتصال SqlConnection الذي سيستخدم في الاتصال بقاعدة البيانات.
لاحظ أن موصل البيانات سيقوم بإنشاء كائن أمر SqlCommand وسيضع جملة التحديد SELECT في الخاصية CommandText الخاصة به، كما سيضع كائن الاتصال في الخاصية Connection الخاصة به.. بعد هذا سيوضع كائن الأمر في الخاصة SelectCommand الخاصة بموصل البيانات.. معنى هذا أن هذه الصيغة تختصر عليك الكثير من الخطوات.
4- الصيغة الرابعة مماثلة للصيغة السابقة، ولكن معاملها الثاني يستقبل نص الاتصال Connection String اللازم للاتصال بقاعدة البيانات، ليتم استخدامه في إنشاء كائن الاتصال SqlCommand.
 
وبالإضافة إلى ما ترثه من الفئة الأم من خصائص ووسائل وأحداث، تمتلك هذه الفئة الحدثين التاليين:
 
  يتم تحديث السجل RowUpdating:
عند استدعاء الوسيلة Update الخاصة بموصل البيانات، فإنها تمر عبر كل سجل في مجموعة البيانات لاستخدامه في تحديث قاعدة البيانات.. وينطلق هذا الحدث قبل استخدام كل سجل موجود في مجموعة البيانات في عملية التحديث.
والمعامل الثاني e لهذا الحدث من النوع SqlRowUpdatingEventArgs، وهو يمتلك الخصائص التالية:
 
Command
تقرأ أو تغير كائن الأمر SqlCommand الذي سيستخدم في عملية التحديث.
Errors
تعيد كائن الاستثناء Exception الذي يحتوي على معلومات الخطأ الذي حدث في السجل الحالي.. (مفيدة فقط في الحدث RowUpdated).
Row
تعيد كائن صف البيانات DataRow، الذي يتم التعامل معه حاليا في مجموعة البيانات.
Statement
Type
تعيد نوع جملة الاستعلام التي سيتم تنفيذها، وهي تعيد إحدى قيم المرقم StatementType التالية:
- Select: جملة تحديد.
- Insert: جملة إدراج.
- Update: جملة تحديث.
- Delete: جملة حذف.
- Batch: استعلام يتكون من مجموعة أوامر.
Status
تقرأ أو تغير حالة كائن الأمر، وهي تأخذ إحدى قيم المرقم UpdateStatus التالية:
- Continue: الاستمرار في تحديث السجل الحالي والسجلات التالية له.
- ErrorsOccurred: تطلب من موصل البيانات التعامل مع عملية التحديث كأنها تسببت في حدوث خطأ.. في هذه الحالة سينطلق خطأ في البرنامج فعلا في السطر الذي استدعيت فيه الوسيلة Update الخاصة بموصل البيانات، وعليك معالجة هذا الخطأ بمقطع Try Catch.
- SkipCurrentRow: تجاوز السجل الحالي دون استخدامه في تحديث قاعدة البيانات، مع استمرار تحديث باقي السجلات.
- SkipAllRemainingRows: تجاوز السجل الحالي والسجلات التالية له وإيقاف عملية التحديث في الحال.
Table
Mapping
تعيد كائن خريطة الجدول DataTableMapping، الذي يستخدم للربط بين الجدول في مجموعة البيانات والجدول الأصلي في قاعدة البيانات.
 
  تم تحديث السجل RowUpdated:
ينطلق هذا الحدث في كل مرة ينتهي فيها موصل البيانات من استخدام أحد سجلات مجموعة البيانات في عملية التحديث.
والمعامل الثاني e لهذا الحدث من النوع SqlRowUpdatedEventArgs، وهو يمتلك نفس خصائص الفئة SqlRowUpdatingEventArgs التي تعرفنا عليها في الحدث السابق، ويزيد عليها بالعناصر التالية:
 
RecordsAffected
تعيد عدد السجلات التي تأثرت بعملية التحديث في قاعدة البيانات.. هذا العدد يكون صفرا إذا لم يتم العثور على السجل، أو حدث خطأ، ويكون -1 إذا كنت تستخدم جملة SELECT الخاصة بأمر التحديد.. لاحظ أن جملة SELECT الموجودة في نهاية أمر التحديث وأمر الإدراج تؤثر على قيمة هذه الخاصية، وتجعل قيمتها صفرا!
RowCount
هذه الخاصية مفيدة إذا كانت للخاصية UpdateBatchSize الخاصة بموصل البيانات قيمة أكبر من 1، ففي هذه الحالة يقوم موصل البيانات بتحديث أكثر من سجل في المرة الواحدة، حيث تعيد إليك هذه الخاصية عدد السجلات التي تم التعامل معها.. لاحظ أن هذا العدد قد يكون مساويا لقيمة الخاصية UpdateBatchSize أو أصغر منها (في حالة عدم وجود سجلات كافية في مجموعة البيانات).
CopyToRows
إذا كانت للخاصية UpdateBatchSize قيمة أكبر من 1، فإن الخاصية e.Row لا تفيدك لمعرفة السجلات التي تم حفظ بياناتها في قاعدة البيانات.. وبدلا منها، يمكنك إرسال مصفوفة صفوف DataRow Array إلى هذه الوسيلة، لتوضع فيها صفوف مجموعة البيانات التي تم استخدامها في عملية التحديث، مع ملاحظة أن هذه العملية مرجعية By Reference، أي أن أي تغيير في الصفوف الموجودة في المصفوفة، سيظهر تأثيره في مجموعة البيانات.. ويجب أن تحتوي المصفوفة المرسلة على الأقل على عدد من الخانات يساوي قيمة الخاصية e.RowCount.
وتوجد صيغة أخرى لهذه الوسيلة، لها معامل ثان، يستقبل رقم الخانة، الذي سيتم وضع الصفوف في المصفوفة بدءا منه.
 
 
ملحوظة:
لعلك تتساءل لماذا لا يمتلك معامل الحدث RowUpdating الوسيلة CopyToRows.. السبب أن الحدث RowUpdating ينطلق دائما قبل تحديث كل صف على حدة، حتى لو كان موصل البيانات سيستخدم مجموعة أوامر Batch SQL لتحديث مجموعة صفوف دفعة واحدة.. هذا منطقي، لأن موصل البيانات يقرأ سجلا تلو سجل من مجموعة البيانات (ويطلق الحدث RowUpdating لكل سجل)، وبعد هذا يكوّن موصل البيانات مجموعة أوامر لتحديث السجلات التي قرأها، ويرسل هذه الأوامر المجمعة إلى قاعدة البيانات، ثم يطلق الحدث RowUpdated بعد تنفيذها.
 
لاحظ أنك لو لم تكتب الإجراء المستجيب للحدث RowUpdated، فإن الوسيلة Update تطلق خطأ في البرنامج إذا حدثت مشكلة تطابق Concurrency Violation عند حفظ أحد السجلات.. أما إذا كتبت الإجراء المستجيب لهذا الحدث، فإن الخطأ لا يحدث، وتتاح لك الفرصة لكتابة الكود الذي يحل مشكلة التطابق.
لكن.. ما هو موضوع التطابق Concurrency هذا؟
هذا هو موضوع الفقرة التالية.
 
من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

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

إرسال تعليق

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