برجاء تسجيل الإعجاب بالصفحة لتصلك كتاباتي على فيسبوك

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

الجمعة، 20 يناير، 2017



هذا هو إلقائي لقصيدة "ما نحن إلا طائران تعانقا":
 


وقد سبق نشرها مكتوبة هنا:


 


منع دس الاستعلامات SQL Injection



منع دس الاستعلامات SQL Injection:

تعرفنا في الموضوع السابق على الطريقة التي يستخدمها القراصنة لدس الاستعلامات من خلال برنامجك.. لمنع ذلك هناك عدة نصائح هامة في هذا الصدد:

1- التقليل من استخدام مربعات النص، والاستعاضة عنها بأدوات تتيح اختيار القيم، مثل القوائم Lists إن كان هذا ممكنا.

2- استخدام الخاصية MaxLength الخاصة بمربع النص لتحديد طول النص المسموح بكتابته في مربع النص.. هذا سيحد من قدرة القرصان على كتابة أوامر مدسوسة.

3- إجراء بعض الفحوصات الصغيرة على قيمة مربع النص، للتأكد من خلو النص الذي كتبه المستخدم من العلامات المريبة مثل ; '   --  /*  */ .. هذا سيشل حركة القرصان تماما.. والأفضل أن تمنع كتابة هذه الحروف في مربع النص من المنبع باستخدام الحدث KeyPress.

4- عليك أيضا أن تمنع الكلمات الدالة على أوامر SQL في مربع النص، خاصة DROP و DELETE و UPDATE و INSERT.

5- لا تقبل أيا من الكلمات التالية في مربع نص يدخل فيه المستخدم اسم ملف:

AUX, CLOCK$, CON, CONFIG$, NUL, PRN

COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8

LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8

6- من المهم أيضا أن تحدد صلاحيات مستخدمي قاعدة البيانات، وألا تعطي الصلاحيات الخطيرة (كحذف الجداول أو إنشائها) إلا للمديرين، وعليك أن تصنع نسخة خاصة من البرنامج لهؤلاء المديرين بحيث لا يتم تداولها إلا بينهم.. أما المستخدمون العاديون، فعليك أن تصنع لهم نسخة أخرى من البرنامج، وأن تتصل هذه النسخة بالخادم من خلال حساب مستخدم محدود الصلاحيات، وبهذا لو نجح أي قرصان في تجاوز خطوط دفاعك عبر هذه النسخة، لا يجد الكثير مما يستطيع فعله!

7- كن حذرا من الكلمات التي تبدأ بـ xp_، لأنها البادئة التي يتم بها تسمية الإجراءات المخزنة الإضافية لمخطط قاعدة البيانات Catalog-extended stored procedures، مثل الإجراء xp_cmdshell.

8- استخدام الإجراءات المخزنة Stored Procedures في تنفيذ الاستعلامات، لأنها محفوظة في قاعدة البيانات على الخادم، ومن ثم يقوم سيكويل سيرفر بفحص قيم المعاملات المرسلة إلى الإجراء المخزن، والتأكد من أنها من النوع الصحيح وبالطول المحدد.

9- ارفض كتابة الكلمات التالية في مربع النص، لأنها تسمح بحقن الأكواد المدسوسة في الإجراءات المخزنة:

EXECUTE, EXEC, sp_executesql

10- استخدام المعاملات Parameters لتمرير القيم إلى جمل الاستعلام، بدلا من استخدام طريقة تشبيك النصوص Concatenation، لأن المعاملات تضمن التحقق من نوع المعامل والطول المسموح به لقيمته.. لكن نصيحة: لا تتخل عن فحص النصوص التي يكتبها المستخدم في مربعات النصوص، حتى لو استخدمت المعاملات، فقد تسمح بعض المعاملات النصية الطويلة بعبور بعض الكود المدسوس.

وفي المشروع AuthorBooks_Reader استخدمنا الإجراء SqlInjection للتأكد من أن النص الذي كتبه المستخدم في مربع النص لا يحتوي على أية رموز أو كلمات مريبة، كما استخدمنا معاملا لتمرير النص إلى الاستعلام لمزيد من الحماية.

كما استخدمنا الدالة SqlInjection في المشروع DbTasks للتأكد من أن قيم المعاملات لا تحتوي على استعلامات مدسوسة.

وسنتعرف فيما يلي على المعاملات وكيفية استخدامها.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


 


الخميس، 19 يناير، 2017

أنا والنساء.. محبة أم عداء؟!



أنا والنساء.. محبة أم عداء؟!

أعرف أن شعري يعطي انطباعات معينة عني، أكثرها غير صحيح.

فرغم أنني شاعر رومانسي في الأساس، فإنني عقلاني جدا في الواقع ولا أتخذ أي قرار بناء على مشاعري وحدها.

كما أنني إنسان متحفظ جدا، ونادرا ما أتعامل مع الجنس الآخر (وفي الغالب هن من دائرة الأقارب)، ولا أحتفظ بأرقام هواتف فتيات (ومن تطلب رقمي لا أعطيه لها)، ولا أعترف بالصداقة بين الرجل والمرأة.. ولم ألمس يوما أنامل فتاة (إلا أن تمد إحداهن إليّ يدها مصافحة، وفي أغلب الحالات أحرجها وأرفض المصافحة!!)، ولم أقابل في حياتي فتاة في موعد غرامي، إلا فتاة واحدة طلبتها من أبيها وقابلتها بصحبة أخيها، ولم يكتب لهذا الأمر التوفيق.

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

(بالمناسبة: أحد مشاكلي مع المرأة في هذا المجتمع أنني لا أجد فتاة يسترسل بيننا الحوار بهذا التناغم.. لي أصدقاء مثقفون كثر لا نمل اللقاء، منهم م. نزار شهاب الدين و م. أمير رمزي.. لكن كثيرا من الفتيات أشعر بالنفور منهن بمجرد أن يبدأن الحديث!!.. والمثقفات منهن قبل الجاهلات، فالأدب والفن في هذا المجتمع يعبئ المرأة بالأمراض النفسية!!)

لكن بين الفينة والأخرى قد يحدث حوار بيني وبين فتاة أحاول فيه أن أتعرف عليها لأني في رحلة بحث دائم عن نصفي الآخر.. ولا تطول هذه الحوارات بسبب عدم توافق الرؤى أو الظروف (وقد تكون هي من ترى ذلك).

وهناك حالة معينة أقوم فيها بحظر الفتاة مباشرة، إذا اكتشفت أنها تفتح لي الطريق وهي على ذمة رجل آخر.. في حالة من هذه الحالات كانت العلاقة الزوجية مدمرة وتنتظر الطلاق.. ورغم هذا أنهيت الحوار فورا وحظرتها، لأن هذه خيانة لرجل ما زالت على ذمته شرعا وعرفا وقانونا، ولا أحب أن أشارك فيها (بالمناسبة: كل هذه حوارات رسمية مهذبة لا غزل فيها ولا غيره) كما أني لست ممن يفسدون امرأة على زوجها، وحتى لو كانا على حافة الطلاق فلست ممن يشجعون امرأة على الطلاق فالصلح خير.. وفوق كل هذا: لا أحب المرأة التي تلعب على الحبلين، وتجهز الاحتياطي إلى أن تتخلص من الأصل!!

أحببت أن أعلن كل هذا لأني كدت أقع في موقف مشابه مؤخرا.. لم أمتلك تفاصيل كافية، لكن أغلقت هذا الباب للأخذ بالأحوط.

نقطة أخيرة:

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

قلت مرة لفتاة إنني أبدأ بسقف خيال عال جدا، لكنه يهبط تدريجيا مع كل تعامل بيننا!

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

ربما استمررت في كتابة بعض أشعاري لخيالها القديم (في الحقيقة لدي الكثير من الأبيات المتفرقة التي ألهمتني بها دونتها في مسوداتي وأكمل بعضها قصائد كل حين)، لكنها لا تمثل أي شيء في واقعي، ولم أحاول مقابلتها وجها لوجه ولو مرة واحدة، مع أني أستطيع أن أراها في مكان عملها لو أحببت.. لكن لا هدف!.. الحقيقة أن شخصيتها الحالية تشوه جمال خيالاتي عنها، والتعامل معها سيكون انتحارا لشعري!!

دعنا نلخص كل هذا بعبارة واحدة، لأن هناك أكثر من فتاة تتخيل أنني قد أعود لما مضى:

ما كان في الماضي سيظل في الماضي، ولا مكان له في المستقبل.. فإذا يبست جنان الخيال، لم تتبقّ إلا صحاري الواقع.

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


دس الاستعلامات SQL Injection



دس الاستعلامات SQL Injection:

في المثال السابق، سمحنا للمستخدم بكتابة اسم المؤلف في مربع نص، ثم أدرجنا محتوى النص داخل جملة الاستعلام كجزء من شرط الفقرة WHERE.. وقد تفتق ذهن بعض العباقرة عن فكرة شريرة، وهي كتابة بعض جمل الاستعلام في مربع النص بدلا من اسم المؤلف، وبهذا يستطيعون حقن استعلامات مدسوسة خاصة بهم داخل جملة الاستعلام الخاصة بك، فيقوم برنامجك بتنفيذ ما يريدون على قاعدة البيانات، وهو أمر يشبه سلوك الفيروسات التي تحقن مادتها الوراثية في نواة الخلية وتتركها تنفذها لإنتاج فيروسات جديدة!

وخطورة هذه الطريقة، هي أنها تتيح للمخترقين الاستعلام عن بعض حسابات المديرين والمستخدمين، ومعرفة تركيب الجداول، بل وتنفيذ بعض أوامر غلاف الويندوز Shell من خلال خادم سكيويل، ما قد يضر بالجهاز الذي يعمل عليه الخادم!

ولكن كيف تتم عملية الحقن Injection؟

1- أول شيء، يتوقع القرصان Hacker ضرورة وجود النص بين علامتي تنصيص، ولا بد أنك وضعت علامة تنصيص بادئة قبل النص الذي سيأتي من مربع النص، لهذا يجب على المخترق أن يكتب أي كلمة، ثم يتبعها بالعلامة ' لإغلاق علامتي التنصيص، وبهذا يضمن عدم حدوث خطأ في صيغة جملة SQL.

2- بعد هذا يضع القرصان فاصلة منقوطة ; ليستطيع كتابة أمر SQL جديد خاص به، وهنا تكون لديه الحرية في كتابة الأمر الذي يريده!

3- نظرا لأن القرصان يتوقع منك إضافة تكملة لجملة SQL بعد النص الذي كتبه في مربع النص، فإنه يضع في نهاية الكود المدسوس الرمز -- ليجعل أي نص تال له مجرد تعليق، وبهذا يلغي أي تكملة خاصة بك لجملة الاستعلام، ويضمن سلامة صيغة جملة الاستعلام!

والآن، دعنا نرى ماذا سيحدث لو كتب القرصان في مربع النص الجملة التالية:

Ahamd'; drop table Books--

في هذه الحالة ستصبح جملة الاستعلام بعد إضافة هذه الجملة كالتالي:

SELECT Books.Book

FROM Authors, Books

WHERE Authors.ID = AuthorID

AND Authors.Author = 'Ahamd'; drop table Books--'

كما ترى: صار لدينا استعلامان صحيحان وتعليق:

- الاستعلام الأول لا قيمة له، وهو  يبحث عن كتب مؤلف اسمه Ahmad.

- والاستعلام الثاني أمر حذف يطلب حذف جدول الكتب كاملا من قاعدة البيانات.. لاحظ أن القرصان لا يعرف أسماء الجداول، ولكنّ توقع اسم جدول الكتب لن يكون عسيرا، ولن ييأس القرصان من تجربة عشرات الأسماء المحتملة، ما دام عزمه قد قرّ على تدمير برنامجك!

- وفي النهاية يوجد تعليق صغير، هو العلامة ' الخاصة بك، والتي استطاع القرصان تهميشها بحيلة صغيرة بارعة!

يبدو الأمر مفزعا، أليس كذلك؟

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

فكيف إذن يمكن إغلاق هذه الثغرة القاتلة؟

هذا ما سنتعرف عليه في الموضوع التالي.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


 


الثلاثاء، 17 يناير، 2017

يغار القلب فاتنتي



يغار القلب فاتنتي 

أَودَى غرامُكِ بي يا سرَّ مأساتي = يا حلمَ عمريَ يا أقصَى استحالاتي

ماذا فعلتُ لكي أَصْلاكِ في لغتي
شِعرَ العذابِ؟.. أتَغتالينَ لذاتي؟

يا كلَّ ذِكرى سَرَتْ في الرُّوحِ تُشجنُها
يا طعمَ حزنيَ مُنذُ انْدَحـْتِ في ذاتي

هل لي جمالُكِ مخلوقٌ لأعشقَه؟
أَسعَى لأُسعدَه من بينِ أناتي

لا غَروَ تيهيَ في عينيكِ ساحرتي
يا نجمةً قد مَحَتْ كلَّ المجراتِ

والثغرُ لو أنّني يومًا أُكلِّمُهُ
عَصَرْتُ فاكهةً، أَسْـكَرتُ كاساتي

والحسنُ ويلِيَ ما أقسَاه عذّبني
يَبكي على شَجَني بدرُ المساءاتِ

فاضَ الحنينُ على قلبي ليُغرقَه
والليلُ شابَ وما كفّتْ مناجاتي

مَرَّ الزمانُ وما فارقْتِ أُمنيتي
دارَ الزمانُ، أنا في نفسِ مأساتي

لو كنتُ عندَكِ أغلى كنتِ ساقيتي
مِن نهرِ سحرِكِ ما يَروي صباباتي

لو تعلمينَ: يَغارُ القلبُ فاتنتي
لو تَسكنينُ دَمِي في فَيحِ جمْراتي!

إنّي أغارُ ولا يَعنيكِ في شَغَفي
أنّي أريدُكِ يا أحلَى معاناتي

إنّي أغارُ وأنتِ الآنَ قاتلتي
في كلِّ عينٍ رأتْ أَشهَى الجميلاتِ

تَهوَينَ نفسَكِ، لا تَهوَينَني أبدا
قلبٌ من الصخرِ لم يَسمعْ شِكاياتي

لو تَذبُلينُ غدًا واغتالني ظَمَئي
ستُحرمينَ بهذا الذنبِ جناتي

مهما نأينا فقلبي في هواكِ أبٌ
يدعو لقلبِكِ يا أبهَى الأميراتِ

سأظلُّ أَهوِي إلى عينيكِ آسرتي
كونٌ من الطُّهرِ قد أفضَى لنشْواتي

إني عشقتُكِ يا عمري بلا ندمٍ
أُهدي لقلبِكِ ـ لو يَعنيكِ ـ غُنواتي

الشوقُ طالَ وهذا الهجرُ عذّبَنا
لم تُسعدي لحظةً بالقربِ نَبْضاتي

نصفانِ مزّقَنا عن بعضِنا ألمٌ
لا شيءَ يُكملُنا بينَ المتاهاتِ

العمرُ باعَدَنا والدهرُ غيّرَنا
لم يَبْـقَ منّا سوَى عشقي وآهاتي

ماذا جنيتُ لكي أهواكِ يا ألمي
حتى تصيريَ لي أغلى الحبيباتِ

في التوِّ حينَ أراكِ الشِّعرُ يَغمرُني
أُهديكِ يا مُنيَتي بالعشقِ أبياتي

لو بالغرورِ أنا أُسميكِ جاريتي
ناداكِ رغْمِيَ نبضُ القلبِ: مولاتي

مهما الزمانُ مَضَى والشوقُ لوّعني
للكونِ عن حبِّنا أحكي حكاياتي

في الأُنسِ، في وَحشَتي، في الصَّـفوِ، في شَجَني
أهواكِ يا فتـنتي في كلِّ حالاتي 

محمد حمدي غانم
8/1/2017


* تنويه:
انتبهت بعد أن كتبت هذه القصيدة أنها جاءت على نفس وزن وقافية قصيدة "أنا وليلى" رائعة الشاعر العراقي حسن المرواني والتي غناها كاظم الساهر (ولست من عشاقه)، ونظرا لأن القصيدتين تحملان نفس التجربة العاطفية تقريبا، فسيبدو أنني كنت أعارض أو أباري المرواني، ولا عيب في هذا لكن هذا فعلا لم يكن متعمدا مني!


تمرير القيم إلى جمل الاستعلام



تمرير القيم إلى جمل الاستعلام:

افترض أنك تريد الحصول على كتب "توفيق الحكيم" من قاعدة البيانات.. في هذه الحالة يمكنك وضع جملة SQL التالية في الخاصية CommandText لكائن الأمر (وليكن اسمه Cmd):

Cmd.CommandText = "SELECT Books.Book " +

         "FROM Authors, Books " +

         "WHERE Authors.ID = AuthorID " +

         "AND Authors.Author = 'توفيق الحكيم'"

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

المنطقي والعملي، هو أن تضع على النموذج مربع نص (وليكن اسمه TxtAuthor) ليكتب فيه المستخدم اسم المؤلف، ومن ثم تعرض له كتبه.. في مثل هذه الحالة، عليك تعديل نص الاستعلام السابق ليصير كالتالي:

Cmd.CommandText = "SELECT Books.Book " +

         "FROM Authors, Books " +

         "WHERE Authors.ID = AuthorID " +

         "AND Authors.Author = '" + TxtAuthor.Text +"'"

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

لكن هذه الطريقة تحتوي على ثغرة قاتلة، تسمح للأشقياء بتدمير قاعدة بياناتك وربما نظام التشغيل الذي يوجد عليه خادم سيكويل لو أرادوا!

كيف؟.. هذا هو موضوع الفقرة التالية: دس الاستعلامات SQL Injection.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


الأحد، 15 يناير، 2017

طائر الشوق



طائر الشوق 

فتاةُ الحلمِ والخاطرْ = لها في مهجتي طائرْ

يَجوعُ لِلَثْمِ وجنتِها = وشُربِ رحيقِها الفائرْ

يُسافرُ نحوَ عينيها = بِخَفْقِ جَناحِهِ الثائرْ

يُغنّيها بأشعاري = فيُشجي بدرَنا الساهرْ

لَهوفًا، حُلمُه يومًا = يُعانقُ ضوءَها الباهرْ

وطائرُها بجوفِ القلبِ مُرتَهَنُ الهَوَى الآسرْ

جدارَ القلبِ يَنقرُهُ إذا اشتاقَ اللَّمَى الساحرْ

فيُؤلمُهُ بأشواقٍ = تُعمّقُ جُرحَهُ الغائرْ

ألا يا طائري رفقًا = ومِن هذا الهَوَى حاذِرْ

مَريرٌ في حلاوتِهِ = ألا إنَّ الهَوَى غادرْ

فما مِن عاقلٍ حرٍّ = إلى سجّانِهِ سائرْ

فلا تَعبرْ بِمَرماها = فما من سهمِها ساترْ

ولا تَغترَّ عن نُصحي = حذارِ جمالَها الماكرْ

وطائرُها بجوفِ القلبِ مَعصوبُ النُّهَى حائرْ

فلا قولي يُبَصِّرُهُ = ولا في شوقِهِ صابرْ

أيا ذا المصطفِي قلبي = بأشواقٍ بلا آخرْ

لماذا اخترتَني وحدي = مُقيما لستَ بالزائرْ؟

فَطِرْ يا طائري توًّا = لِتَسكُنَ قلبَها الشاغرْ

وسَهِّرها وخبِّرها = بأشواقِ الفتى الشاعرْ 

محمد حمدي غانم
25/8/2016


فئة أمر سيكويل SqlCommand Class



 فئة أمر سيكويل SqlCommand Class
 

هذه الفئة ترث الفئة DbCommand، وهي مخصصة للتعامل مع أوامر SQL التي يتم تنفيذها على خادم سيكويل سيرفر.

ولحدث إنشاء هذه الفئة أربع صيغ مختلفة:

1- الصيغة الأولى بدون معاملات.

2- والصيغة الثانية لها معامل واحد، يستقبل نص استعلام SQL الذي سيوضع في الخاصية CommandText.

3- والصيغة الثالثة تزيد على الصيغة السابقة بمعامل ثان من النوع SqlConnection، يستقبل كائن الاتصال الذي سيتم تنفيذ الأمر من خلاله.

4- والصيغة الأخيرة تزيد على الصيغة السابقة بمعامل ثالث من النوع SqlTransaction، يستقبل كائن التعامل الذي سيتم تنفيذ الأمر في نطاقه.

وإضافة إلى ما ترثه من الفئة الأم، تمتلك هذه الفئة الخاصيتين التاليتين: 

 التنبيه Notification:
تحدد كائن طلب التنبيه SqlNotificationRequest الذي سيستخدمه كائن الأمر في تلقي التنبيهات من الخادم عند تنفيذ الاستعلام.. وسنتعرف على الفئة SqlNotificationRequest لاحقا. 

 ضم تلقائي إلى قائمة التنبيهات NotificationAutoEnlist:
إذا جعلت قيمة هذه الخاصية True، فسيستقبل كائن الأمر تنبيهات تلقائية من كائن معلومات التبعية SqlDependency.. وتستخدم هذه الخاصية مع صفحات المواقع في ASP.NET لتتيح عرض الصفحة المجهزة Cashed Page إلى أن يأتي تنبيه بحدوث تغير في بعض بياناتها فيتم إنعاشها.. وسنتعرف على الفئة SqlDependency لاحقا. 

وإضافة إلى ما ترثه من الفئة الأم، تمتلك هذه الفئة الوسائل التالية: 

 نسخ Clone:
تعيد كائن SqlCommand جديدا مماثلا في كل شيء للكائن الحالي. 

 تصفير زمن انتظار الأمر ResetCommandTimeout:
تعيد قيمة الخاصية CommandTimeout إلى قيمتها الافتراضية 30 ثانية. 

 "تنفيذ قارئ بيانات XML" ExecuteXmlReader:
تنفذ الأمر، وتعيد كائنا من النوع XMLReader، الذي يحتوي على البيانات بتنسيق XML.. ويجب عليك استخدام هذه الوسيلة في الحالات التالية:
- عند استخدام الفقرة FOR XML في جملة الاستعلام.. هذه الفقرة تعيد ناتج الاستعلام في صورة وثيقة XML.
- عند قراءة عمود نوع بياناته XML.
- عند قراءة عمود نوع بياناته ntext أو nvarchar لكنه يحتوي على بيانات بتنسيق XML.

وتدعم الفئة SqlCommand استخدام العمليات غير المتزامنة Asynchronous Operations لتنفيذ الأمر، وذلك من خلال أزواج الوسائل التالية:
 BeginExecuteXmlReader          EndExecuteXmlReader
 BeginExecuteNonQuery            EndExecuteNonQuery
 BeginExecuteReader          EndExecuteReader
حيث تقوم الوسائل التي تبدأ بالكلمة Begin بتنفيذ الأمر في عملية غير متزامنة، ويمكنك أن ترسل إليها مندوبا عن إجراء Sub يتم استدعاؤه بعد انتهاء العملية لتقرأ فيه البيانات الناتجة.. وتعيد هذه الوسائل كائنا يمثل الواجهة IAsyncResult ليمكنك استخدامه في متابعة العملية، كما يمكن إرساله إلى الوسائل التي تبدأ بالكلمة End (مثل الوسيلة EndExecuteXmlReader) لإنهاء العملية غير المتزامنة والحصول على نتائجها.

وتمتاز العمليات غير المتزامنة بأنها لا توقف تنفيذ البرنامج إلى حين انتهاء إتمام العملية، بل ينتقل التنفيذ إلى السطر التالي مباشرة، بينما ترسل النتائج فور توفرها إلى الدالة الخاصة بالحصول على النتائج Callback Function.. وتقع العمليات غير المتزامنة خارج نطاق هذا الكتاب، وسنتعرف عليها بالتفصيل بإذن الله في كتاب المواضيع المتقدمة في برمجة إطار العمل. 

كما تمتلك الفئة SqlCommand الحدث التالي: 

  اكتملت الجملة StatementCompleted:
ينطلق عند اكتمال تنفيذ جملة الاستعلام الخاصة بكائن الأمر.. والمعامل الثاني e لهذا الحدث من النوع StatementCompletedEventArgs، وهو يمتلك خاصية واحدة هي "عدد السجلات" RecordCount، التي تعيد عدد السجلات التي تأثرت بتنفيذ جملة الاستعلام.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


صفحة الشاعر