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

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

الثلاثاء، 15 أغسطس، 2017

نبع البطولة



يا أمَّنا بحكمةِ الكهولةْ
تكلّمي وعلّمي الرجولةْ
لأن أشباهَ الرجالِ الآنَ عن أوطانِنا مسئولةْ
أُسْـدٌ علينا، في الحروبِ نعامةٌ
جيوشُهم في قتلِنا مشغولةْ
تبيعُ أرضَنا بمنتهى السهولةْ
وتدّعي البطولة!!



محمد حمدي غانم، 2017


استخدام مصانع المزودات



استخدام مصانع المزودات عمليا:

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

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

كما عرفنا دالة اسمها GetProviderName، تستقبل قيمة المرقم Providers، وتعيد النص الذي يمثل اسم هذا المزود، لنرسله إلى الوسيلة DbProviderFactories.GetFactory للحصول على مصنع المزود الذي يريد المستخدم التعامل معه.. بعد هذا يصير من السهل استخدام وسائل هذا المصنع للحصول على كائن الاتصال وكائن الأمر وموصل البيانات اللازمة للتعامل مع قاعدة البيانات.

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

لاحظ أننا نغير نوع قاعدة البيانات التي نتعامل معها، في حدث تغير الاختيار CheckedChanged الخاص بزري التحويل، وذلك بالكود البسيط التالي:
If RdSql.Checked Then
    DbBooks = New MyDbConnector(
                        My.Settings.BooksMdfConStr,
                        MyDbConnector.Providers.SqlServer)
Else
   DbBooks = New MyDbConnector(
                       My.Settings.BooksMdbConStr,
                       MyDbConnector.Providers.OleDb)
End If
حيث DbBooks هو متغير معرف على مستوى النموذج، نضع فيه نسخة الفئة MyDbConnector التي نستخدمها لتنفيذ وظائف الأزرار.
لاحظ أيضا أن استخدام الزر "الكتب1" لاستدعاء الإجراء المخزن، يستلزم منك أولا أن تستخدم المشروع AccessStoredProcedure لإضافة الإجراء المخزن GetAuthorBooks إلى قاعدة بيانات الكتب الخاصة بآكسيس. 

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

 

 


الأحد، 13 أغسطس، 2017

ريم بواحة صمتها



ريم بواحة صمتها
 

كالزهرِ وجهُها الصبوحْ
ريمٌ ـ بواحةِ صمتِها ـ
أبياتُ شعرٍ لا تَبوحْ
وقلبُها اصطفَى سلامَهْ
كلُّ الإجاباتِ ابتسامةْ
أشرودُ عقلٍ حائرٍ أم أنه سُمُوُّ رُوحْ؟
أم تلكَ منتهى البلاغةْ؟
كلماتُها العشرُ التي دُرَرٌ مصاغةْ
في عُرفِها يُغنينَها عن صوتِنا المبحوحْ؟
يا زهرةً بعطرِها تفوحْ
متى بسرِّها تبوحْ؟
محمد حمدي غانم
6/8/2017

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


فئة مصنع المزود DbProviderFactory Class



فئة مصنع المزود DbProviderFactory Class 

هذه الفئة أساسية مجردة تجب وراثتها، وهي تمتلك العناصر اللازمة للتعامل مع مزود البيانات الذي خصصت للتعامل معه.
وتمتلك هذه الفئة الخاصية التالية: 

 يمكنه إنشاء عداد لمصدر البيانات CanCreateDataSourceEnumerator:
تعيد True إذا كان مصنع المزود يسمح باستخدام الفئة DbDataSourceEnumerator للمرور عبر كل خوادم البيانات المتاحة.. وسنتعرف على هذه الفئة بعد قليل.

كما تمتلك هذه الفئة الوسائل التالية: 

 إنشاء باني نص الاتصال CreateConnectionStringBuilder:
تعيد باني نص الاتصال من النوع العام DbConnectionStringBuilder، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.

 

 إنشاء كائن اتصال CreateConnection:
تعيد كائن اتصال من النوع العام DbConnection، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.
لاحظ أن كائن الاتصال الذي ستحصل عليه غير مرتبط بأي نص اتصال، لهذا عليك وضع نص الاتصال في الخاصية ConnectionString الخاصة به قبل محاولة فتح الاتصال. 

 إنشاء كائن أمر CreateCommand:
تعيد كائن أمر من النوع العام DbCommand، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.. وأنت تعرف أنك تستطيع الحصول على قارئ البيانات من كائن الأمر باستدعاء الوسيلة ExecuteReader.
لاحظ أن كائن الأمر الذي ستحصل عليه ليس مرتبطا بأي اتصال، لهذا عليك ربطه بكائن الاتصال الذي حصلت عليه من الوسيلة CreateConnection، وهو ما فعلناه في الدالة CreateCommand في المشروع Factories كالتالي:
Dim Command = Fac.CreateCommand
Command.Connection = Cn
ويمكنك أداء نفس وظيفة هذه الوسيلة، باستخدام الوسيلة CreateCommand الخاصة بكائن الاتصال، وفي هذه الحالة ستختصر السطر الثاني من الكود السابق:
Dim Command = Cn.CreateCommand 

 إنشاء معامل CreateParameter:
تعيد معاملا من النوع العام DbParameter، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.
ويمكنك أداء نفس الوظيفة، باستخدام الوسيلة CreateParameter الخاصة بكائن الأمر. 

 إنشاء موصل بيانات CreateDataAdapter:
تعيد موصل بيانات من النوع العام DbDataAdapter، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.. وقد استخدمنا هذه الوسيلة في الدالة GetTable في المشروع Factories كالتالي:
Dim Table As New DataTable
Dim Da = Fac.CreateDataAdapter
Da.SelectCommand = Cmd
Da.Fill(Table) 

 إنشاء باني أوامر CreateCommandBuilder:
تعيد باني أوامر من النوع العام DbCommandBuilder، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه. 

 إنشاء عداد مصادر البيانات CreateDataSourceEnumerator:
تعيد عداد مصادر البيانات من النوع العام DbDataSourceEnumerator، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.. لاحظ أن مزود سيكويل سيرفر هو الوحيد الذي يدعم هذه الإمكانية، لأن قواعد البيانات الخاصة به تعمل على خادم، لهذا ستعيد هذه الوسيلة Nothing إذا استخدمتها مع أي مزود بيانات آخر غير سيكويل سيرفر!
ويمكنك أن تستخدم الخاصية CanCreateDataSourceEnumerator أولا قبل استدعاء هذه الوسيلة، لتعرف إن كان المزود يدعم عداد المصادر أم لا. 

 إنشاء تصريح CreatePermission:
تعيد تصريحا من النوع العام  CodeAccessPermission، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه... لاحظ أن الفئة DBDataPermission ترث الفئة CodeAccessPermission، ومنه تشتق فئات التصريح الخاصة بكل مزود بيانات مثل SqlClientPermission.. شرح هذه المواضيع خارج نطاق هذا الكتاب.

وترث الفئات التالية الفئة DbProviderFactory:
- OdbcFactory Class.
- OleDbFactory Class.
- OracleClientFactory Class.
- SqlClientFactory Class.
ولا يوجد جديد في هذه الفئات يستحق شرحه، فهي تملك نفس وسائل الفئة الأم، لكن مع فارق واحد: أنها تعيد أنواعا خاصة بكل مزود، بدلا من الأنواع العامة التي تعيدها وسائل الفئة الأم.

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


هوامش بدم الضحايا



هوامش بدم الضحايا 

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

محمد حمدي غانم
عن حادث تصادم قطاري الإسكندرية
11/8/2017 


فئة مصانع المزودات DbProviderFactories Class



 فئة مصانع المزودات DbProviderFactories Class 

تعتبر هذه الفئة مجرد مدخل لاستخدام الفئة DbProviderFactory، وهي لا تمتلك إلا وسيلتين مشتركتين، هما: 

 معرفة فئات المصانع GetFactoryClasses:
تعيد جدول بيانات DataTable، يحتوي على بيانات عن مصانع المزودات المتاحة على جهاز المستخدم.. ويمثل كل صف في هذا الجدول أحد المزودات، بينما تعرض الأعمدة تفاصيل هذا المزود.. وهذه الأعمدة هي: 

Name
اسم مزود البيانات.
Description
وصف مختصر لمزود البيانات.
InvariantName
الاسم الثابت للمزود، والذي يمكنك استخدامه للحصول على المصنع الخاص به.
Assembly
QualifiedName
الاسم الكامل لمزود البيانات، وهو يحتوي على التفاصيل الكافية عنه، مثل الإصدار والثقافة التي يستخدمها.

ويمكنك رؤية هذه التفاصيل بنفسك في المشروع DataProviders، فهو يعرض ناتج هذه الوسيلة في جدول عرض. 

 معرفة المصنع GetFactory:
تعيد مصنع المزود DbProviderFactory الذي يتيح لك التعامل مع مزود معين.. ولهذه الوسيلة الصيغتان التاليتان:
- الصيغة الأولى تستقبل الاسم الثابت للمزود InvariantName.
- والصيغة الثانية تستقبل صف البيانات DataRow الذي يحتوي على تفاصيل المزود.. ويمكنك الحصول على هذا الصف من الجدول العائد من الوسيلة GetFactoryClasses. 

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

 


الجمعة، 11 أغسطس، 2017

ذوقي في عشقي فاكهتي



ذُوقي في عشقي فاكهتي 

يا زَهرَ اللوزْ
وثمارَ الجَوزْ
امضي ما شئتِ فلن تَمضي
بَعدي لا جَوزْ
إن كانَ يُضيرُكِ تُفاحي
أناْ إصبعُ موزْ!
هل إنّكِ حقا كارهتي؟
ذُوقي في عشقي فاكهتي
وكَفَاكِ العَوزْ
أنا أشْهَى ما قلبُكِ يَبغي
في كفّي العَوزْ
مَن ذاقت مِن ثَغري المانجو
مِن لذةِ عشقي لا تَنجو
فإليَّ الحَوزْ
مَن هَرَبتْ خارجَ جناتي
هَلَكَتْ في تِيهِ مَفازاتي
دُوني لا فَوزْ
فأنا ما عينُكِ رانيةٌ
جناتُ ثمارِكِ دانيةٌ
فاغتنمي الحَوزْ

محمد حمدي غانم
6/8/2018

_____________
الجَوْز الأولى: الثمرة المعروفة.
الجَوْز الثانية: المَشْي (مِن: جازَ الرجلُ الطريقَ يَجُوزُه جَوْزا، والمشهورُ من هذه المادة في لغتنا اليومية الفعل الرباعي جاوز والفعل الخماسي: اجتاز)
* العَوْز الأولى: العَوَز أي الفقر والحاجة.. وسكّنت الحرف الثاني للضرورة مثلما تقول في الشعر أُفْق بدلا من أُفُق.
العَوْز الثانية: حباتُ العنب ومفردها عَوْزَة.
الحَوْز الأولى: السير السريع.. إليَّ الحَوْز: أي سيري إليَّ سريعا.. وحازَ الإبل أي ساقها، ومن هنا أُطلق لفظ الحُوزيّ على سائق عربات الخيل.
الحَوْز الثانيةْ: الامتلاك.. حازَ على الشيء يَحُوزُه حَوْزا: صار في حوزته وحيازته وملكيته. 


انتبهوا لهذه المصيدة القاتلة



انتبهوا لهذه المصيدة القاتلة

 


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

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


الثلاثاء، 8 أغسطس، 2017

آخر إنذار بالعشق



آخر إنذار بالعشق

 

من  آمرِ  جُندِ  العشقِ  الزاحفِ  بالآفاقْ
لأميرةِ  كلِّ  ممالكِ  هذا  الحسنِ  المُسكرِ  للأحداقْ
السِّلْمُ  على  أتباعِ  الحبِّ  وأصحابِ  الأشواقْ

أمّا بعدُ،

فَيا  قلبَ  الفاتنةِ  الخفّاقْ:
استسلمْ  تسلمْ
أو  دمعاتُ  الوجدِ  على  زهرِ  الخدّينِ  تُراقْ

أنتظرُ  الردَّ  سريعا  منكِ،
وهذا  الختمُ  على  الأوراقْ

المشتاقْ
محمد  حمدي  غانم
29/7/2017

 


صفحة الشاعر