فئة موصل بيانات سيكويل
SqlDataAdapter Class
ولحدث
إنشاء هذه الفئة أربع صيغ:
1-
الصيغة الأولى بدون معاملات.
2-
والصيغة الثانية تستقبل أمر التحديد SelectCommand الذي سيستخدمه موصل البيانات لملء مجموعة البيانات.
3- والصيغة الثالثة تستقبل
معاملين:
- نص جملة التحديد SELECT.
لاحظ أن موصل البيانات سيقوم بإنشاء كائن أمر SqlCommand وسيضع جملة التحديد SELECT في الخاصية CommandText الخاصة به، كما سيضع كائن الاتصال في الخاصية Connection الخاصة به.. بعد هذا سيوضع كائن الأمر في الخاصة SelectCommand الخاصة بموصل البيانات.. معنى هذا أن هذه الصيغة تختصر عليك
الكثير من الخطوات.
4- الصيغة الرابعة
مماثلة للصيغة السابقة، ولكن معاملها الثاني يستقبل نص الاتصال Connection
String اللازم للاتصال بقاعدة البيانات،
ليتم استخدامه في إنشاء كائن الاتصال SqlCommand.
وبالإضافة
إلى ما ترثه من الفئة الأم من خصائص ووسائل وأحداث، تمتلك هذه الفئة الحدثين
التاليين:
يتم تحديث السجل RowUpdating:
عند استدعاء الوسيلة Update الخاصة بموصل البيانات، فإنها تمر عبر كل سجل في مجموعة البيانات
لاستخدامه في تحديث قاعدة البيانات.. وينطلق هذا الحدث قبل استخدام كل سجل موجود
في مجموعة البيانات في عملية التحديث.
والمعامل الثاني e لهذا الحدث من النوع SqlRowUpdatingEventArgs، وهو يمتلك الخصائص التالية:
Command
|
|
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.. للتنزيل:
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.