أهلا أخي
Hazem1
الكثير يسأل هذا السؤال : الجواب ( كل الطرق تؤدي إلى روما ) ( ولكن الطرق كلها لا تتشابة وإن كان بعضها متقارب ) ( ولكن المهم هنا كيف كانت رحلتك إلى روما؟ - وأي طريق سلكت؟ - ليست كل الطرق متشابهة - هذا متعب وهذا مشوار طويل وهذا وعر وآخر مرصوف وبعضها سريع وغيرها مريح , وهناك طريق يسر الناظرين وآخر يسد نفس الناظرين )
لفهم الأمور في سياقها الصحيح : كل شيء في البرنامج عبارة عن كود ( سواءاً أنت من كتبت الكود أم قام بكتابتها معالج مخصص ( الـ wizard ) في الفيجوال يقوم بكتابة الكود عنك بطريقة مختلفة عن طريقة كتابتك لها بشكل يدوياً )
الإختلاف ( بالكود : الأمر مفتوح لك لتفعل أي شيء تريد , أما عن طريق الـ wizard : فهو أسلوب محدد بإستخدام كائنات خاصة بهذا الغرض ولكن بإمكانيات كبيرة أيضاً )
ربط قاعدة البيانات باستخدام الكود :
بإمكانك إنشاء نظام الوصول إلى البيانات بطريقتك الخاصة التي تتناسب مع متطلباتك, بإستخدام الكائن SqlCommand ( على فرض أننا نتحدث عن قاعدة بيانات SQL SERVER)
الكائن SqlCommand : من كائنات المستوى الأدنى -
lowest level objects ( بمعنى هو الأساس ) من خلالة بإمكنك إنشاء منظومة الوصول إلى البيانات بالطريقة التي تريدها كيفما تريدها أن تكون.
( لا يعني أنها الأفضل مع : المشاريع الصغيرة والمتوسطة ) ( لكن بالتأكيد الأفضل في المشاريع الكبيرة التي تستخدم قواعد بيانات عالية الارتباط. )
تستطيع من خلال هذة الطريقة على سبيل المثال إنشاء ( الإستعلامات الديناميكية ) لا يمكن عملها بالـ wizard , لتوضيح أكثر ,
أنت تريد جلب بيانات , لكن شكل وهيكل البيانات ليس ثابت , الإستعلام يتم بنائة وقت التشغيل بناءاً على معطيات متغيرة تزيد أو تنقص, نفس الإجراء لكنة يقوم بإرجاع هياكل بيانات مختلفة.
هذة الطريقة تحتاج وقت أكثر
تدقيق وتصحيح أكثر
تعديلها ( يعتبر كابوس ) في المشاريع الكبيرة / كابوس كبير - أي تعديل في قاعدة البيانات يجب أن تعيد تغيير وصياغة الإستعلامات كلها مثل ( الـ SELECT الـ INSERT الـ UPDATE الـ DELETE , ) لا أتحدث عن مشروع بسيط , إستعلاماتة لا تتعدى 20 أو 30 جدول. تخيل كمية الإستعلامات الموجودة , وأي تغيير يحدث على قاعدة البيانات يجب إعادة النظر في إستعلامات البرنامج وتعديلها , ناهيك عن إذا كانت منتشرة في المشروع بشكل كبير , تحتاج إلى تغيير جميع الأكواد في جميع أرجاء المشروع.
هذا من غير كمية البراميترات لجدول واحد , تخيل جدول يحتوي على 40 أو 50 حقل , تحتاج أيضاً إلى تعديلها وتعيين جميع قيمها يدوياً.
الأنسان معرض للخطاء , ولكثر الأكواد بهذة الطريقة وأنت من يدير طريقة كتابة الكود, إحتمال السهو أو النسيان أو عدم الإنتباة لحركة بسيطة أثناء التطوير كبيرة جداً جداً , حتى لو كنت محترف درجة أولى.
( الكثير وليس الكل طبعاً ) من المبرمجين - فعلاً يسيء فهم وطريقة إدارة البيانات بواسطة الكود الذي يكتبة.
بعض الأمور تحتاج أن تكتبها يدوياً ( لا يمكن عملها بالـ wizard )
ملاحظاتي :
- هناك من لا يعرف الأدوات ( فيفضل إدارة البيانات عن طريقة الكود - بكتابة كل شيء يدوياً - من الألف إلى الياء ) ( هذا لا يعني أنه سينشئ منظومة جديدة - فقط يريد أن يجلب البيانات في أبسط صورها )
- الأغلب من المبرمجين لا يتبع طريقة الكتابة الصحيحة للأكواد. أمور كثيرة جداً من المفترض أن يتحقق منها ويفعلها بطريقة معينة ( هو لا يقوم بها أساساً )
- مفهوم الفئات الـ classes : ( تقريباً غائب عن هذة الطريقة عند أغلب المبرمجين ) (العرب خصوصاً) ( لأنها متعبة في الجهد والوقت )
لا أقصد عمل class وتكتب فية أكواد الإتصال والأوامر ما شابة ذلك , القصد أن تكون الجداول في قاعدة البيانات على هيئة classes لديك في المشروع
ربط قاعدة البيانات باستخدام الأدوات ( الـ Wizard ) : ( موجودة منذ 13 سنة , طرحت في إصدار فيجوال 2005 )
تصرفاتها واضحة وتلبي أغلب إحتياجات المبرمجين.
بإمكانك التحكم في تصرفاتها إلى حد كبير جداً .
وقت التصميم قياسي جداً بالمقارنة مع ( كتابتها يدوياً ) كتابتها يدوياً : ستحتاج إلى كتابة كل شيء يدوياً من الصفر , أما عن طريق الـ wizard : مجرد ضغطات على الماوس فقط بدون حتى إستخدام الكيبورد ( لجعلها تعمل فقط بدون الإضافات الأخرى التي تحتاج منك كتابة القليل جداً جداً من الأكود , لتؤدي بعض الإجراءات الأخرى)
تصميم المشروع ( يدوي بالكود : ستحتاج إلى يوم كامل مثلاُ لإنهاء المشروع ) ( بالأدوات عن طريق الـ wizard : في خلال ساعات لا تتعدى 3 أو 4 ساعات ) على سبيل المثال والتقريب.
سهولة معرفة الخطاء بسرعة لأن الفيجوال يخبرك بمكان الخطاء ( إذا كان برمجي ) ( الأخطاء المنطقية أنت من يجب عليك إكتشافها في كلا الطريقتين - بالكود أو بالأدوات ).
أي تعديل في قاعدة البيانات : فقط تحتاج إلى بعض الضغطات على الماوس في الـ Dataset, ولا تحمل هم تعيين جميع البراميترات , ولا حتى كتابتها وتصميمها وتحديد أنواعها وبأي حقل مرتبطة ومن أيين تأتي بالقيم التي تريد ربطها بها.
تعتمد كلياً على الفئات : تصميم واضح وسهل من خلال الـ Dataset , كل الجداول تأتي على هيئة فئات ( classes ) , وكل الحقول التي في الجداول تأتي على هيئة خصائص ( property ).
لا تحتاج إلى تدقيق كبير لأنها تعيد بناء نفسها بعد كل تعديل .
تعديل الإستعلامات سهل جداً وبواسطة نوافذة متخصصة في الإستعلامات.
إضافة أي إستعلام جديد على أي جدول مثل ( شرب الماء ) وبواجهات رسومية وأدوات تتحقق من صحة الإستعلام وتنفيذ الإستعلام للتجربة , وعرض نتائج الإستعلام للتجربة , كلها في نافذة واحد تبني لك أي إستعلام جديد , ولا تهتم بالبراميترات نهائياً إلى في حالات نادرة تحتاج إلى تعديل يدوي من خلال النوافذ أيضاً.
تستطيع عمل علاقات بكل سهولة وبإستخدام الماوس فقط.
سهولة إدراجها في أي نافذة جديدة لإستخدامها , ( ولديك خيارين أما إدراجها على شكل DataGridView أو إدراجها على شكل Controls صناديق النصوص ومربعات الإختيار والقوائم المنسدلة )
بمجرد السحب والإفلات , وتقوم بإنشاء كل العناصر التي تتحكم في البيانات (داخل النافذة) من ( BindingNavigator , DataSet , BindingSource , TableAdapter , TableAdapterManager )
كل هذة الأدوات يتم إنشائها بمجرد السحب والإفلات, بالإضافة إلى كل حقول الجدول يتم إنشائها في النافذة ,
الحقل من نوع نص ينشئ على شكل
TextBox , الحقل من نوع صورة ينشئ على شكل
PictureBox , الحقل من نوع صح خطأ ينشئ على شكل
CheckBox
بالإضافة إلى إنشاء Label لكل حقل يدل على تسمية الحقل ويكون ملاصق له عندما تقوم بعملية السحب والإفلات.
الـ TableAdapterManager من هذة الأدوات : بإمكانة إجراء عمل تحديث على كل جداول قاعدة البيانات بواسطة أمر واحد ( بالإضافة أنه تلقائياً عند تنفيذ أي أمر يقوم بالدخول في وضع الـ Transaction -
هذا الوضع مهمته هي تطبيق مبداء
تكامل البيانات -
Data integration -
ينطوي تكامل البيانات على الجمع بين البيانات المقيمة في مصادر مختلفة وتزويد المستخدمين بمنظور موحد لها
لو كنت تقوم بتحديث 10 جداول دفعة واحدة وكلها تحتوي على قيم مرتبطة ببعضها في هذة الجداول - إما أن تنجح كامل العملية وإما أن تفشل بالكامل - لا يتم تحديث بعض الجداول والجداول الأخرى لم تنجح في التحديث - سيؤدي إلى تظارب في البيانات في مثل هذة الحالة )
آلية جلب البيانات وفتح الإتصال وتعبئة الجداول هي نفسها ( لا يوجد أي إختلاف ) , لأنها في الأساس تستخدم الـ
SqlCommands.
لا يوجد فرق في السرعة لأنها نفس الآلية المستخدمة. ( ولكن تحتاج إلى معرفة تصرفات هذة الأدوات مثل الـ TableAdapter وكيف يقوم بالعمل, لدية تصرف معين , بإمكانك تعديل هذا التصرف حتى لا يقوم بأمور لا داعي لها , لأنه صمم بشكل إفتراضي أن يتم العمل بشكل معين, وكل مبرمج حرية التغيير في بعض تصرفات هذا الكائن TableAdapter , إفتراضياً لو كنت تحاول إدراج 10 سجلات بالأمر Update , سيقوم بفتح وإغلاق الإتصال في كل عملية إدراج لكل سجل , يعني سيفتح الإتصال ويغلقة 10 مرات, وهذا طبعاً سيحدث بطئ في العملية , أنت بإمكانك أن تفتح الإتصال يدوياً :
TableAdapter.Connection.Open
إجراء الأمر
TableAdapter.Connection.Close
وبذلك ستحصل على نفس سرعة الكائن SqlCommands. ) ( فقط نحتاج إلى معرفة تصرفات هذة الكائنات و الـ Mechanism خلف هذة الأدوات)
كتابة الكود الذي يتعامل مع هذة الأدوات مرتب ومنظم جداً ومدعوم بوظائف كثيرة لمساعدتك في إدارة البيانات والسجلات.
شكل الكود وقرائته أجمل ومفهومة أكثر .
لا يمكنك عمل إستعلامات ديناميكية متغيرة
لا يُقصد بإستخدامها في قاعدة بيانات عالية الارتباط. ( أي بمعنى لم يتم تصميمها للتعامل مع هذا النوع من قواعد البيانات )
القصد بعالية الإرتباط : أنها تحتوي على جداول كثيرة جداً مترابطة بشكل علائقي قوي جداً , محكمة الشروط والقيود ( وهذا النوع عادتاً يكون من نصيب الشركات الكبرى ) فبالتأكيد أنها لن تستخدم ربط البيانات من خلال الـ wizard بل ستستخدم إما منظومة جاهزة أو تقوم بتصميم المنظومة التي تناسبها )
* طريقة تصميمك للإستعلامات تؤثر جداً على قوة أداء وسرعة تنفيذ الإجراءات في البرنامج وحتى داخل قاعدة البيانات.
* كتابتك للإستعلامات بشكل سليم وبدراية , يزيد من سرعة تنفيذ الإجراء بشكل كبير خصوصاً مع البيانات الكبيرة , العدد القليل من السجلات لا يظهر فرق أبداً في سرعة التنفيذ.
أهلاً أخي
elgokr
أعتذر منك أخي العزيز إذا قلت أنني لا أتفق معك في الكلام الذي ذكرتة.
أتمنى أن لا تكون من المتشددين والمتعصبين وتقبل رأيي بصدر رحب.
أنا غالباً لا أرد على موضوع لو كان به الكثير من المفارقات
(23-09-18, 08:09 PM)elgokr كتب : لا يوجد اختلاف فكلاهما واحد
أكيد طبعاً يوجد إختلاف في الإسلوب
( بنفسك تقوم بسرد الإختلافات في الأسفل )
ولكن ايهم تفضل ولماذا
سؤال جميل
فى البداية تعال نشبه الامر بـ ببناء منزل
ايهم تفضل ان يعطيك شخص بيت جاهز ومجهز من كل شئ
ولاتمام التجهيز او تغيير اى شئ عليك من التكسير والهدم حتى تعمل ما تريد
لست مضطر إلى التكسير والهدم
لأنه ببساطة المقاول يقول لك
إذا لم يعجبك البناء !! , أقوم ببناء بيت جاهز وجديد لك ومجهز من كل شيء من جديد.
ام انك تفضل ان يعطيك الشخص المنزل على العظام / الطوب والمحارة
وانت ما عليك ان تقوم بما يحلو لك من الشكل والالوان والترتيبات
في هذة الحالة ( وتقصد عن طريق الكود ) التشبية الأكثر دقة ,
"أم أنك تفضل أن يعطيك أدوات البناء , منشار , مسامير , طابوق , إسمنت , أخشاب , حديد ,
وأنت من تقوم ببناء البيت من الصفر , طوبة طوبة"
تحتاج وقت للوصول لمرحلة الألوان والترتيبات
ولن تبداء من مرحلة العظم !! من قام بنصف العمل هنا ( وهو البيت العظم )
لا يوجد بيت عظم هنا من الأساس, لأنك ستبداء من الصفر.
تخيل المثال ده فى نظام قاعدة البيانات
الادوات تسهل عليك عناء الاستعلام وما غيره
ولكن لا يمكنك من فعل كل ما تريده وهنا يحدث المصاعب لديك فى الاستخدام
خلاف انه يستهلك من موارد الجهاز اكثر من استخدام الاكواد خلاف البطئ وما غير ذلك
أتفق معك في هذة العبارة "ولكن لا يمكنك من فعل كل ما تريده"
حتى بيئة الـ NET. بكامل كائناتها !!! لا تقوم بعمل كل ما تريد
أما موظوع إستهلاك موارد النظام , تعود لسوء إدارة المبرمج لألموارد التي يستخدمها البرنامج
يجب أن يتم التخلص من الكائنات بعد إستخدامها, لا أتوقع ومن غير المتوقع أن يقوم مبرج بعرض 10,000 أو 150,000 سجل مثلاً على الشاشة
أكيد ستجد مشاكل في موارد النظام ومن الممكن أن ينهار البرنامج, لأنها تحمل في الذاكرة العشوائية, ويجب التخلص من أي كائن يستخدم موارد النظام.
البطئ وما غير ذلك : لا يوجد أي بطئ في التعامل مع البيانات عندما نستخدم الـ Wizard في إنشاء كائنات إدارة البيانات
بينما الكود عبارة عن لديك عدد من 1 الى 10 فاذا كنت تريد رقم 5 فقط
فيمكنك استخدامه دون الحاجة لباقى الارقام بينما الادوات يعرض لك الجميع
لتستخدم بالنهاية رقم المطلوب فقط
غير متفق :
لابسط المثال اكثر
تخيل ان امامك مكتبة وقلت لك ابحث عن كتابة باسم شخص ما
والمكتبة كبيرة وتحتوى على الكثير من الكتب فما سيكون جهدك فى البحث
لم يحالفك الحظ في هذا التشبية ,
من يقراء كلامك يعتقد أن جميع كائنات الـ NET. تعمل عند عملية البحث
وأن النظام يحاول جاهداً البحث عن الكائن المسؤول عن العملية المطلوبة ليقوم بتنفيذها
في الحقيقة هي Straightforward Process ( عملية مباشرة )
طيب لو اعطيت لك كتاب خمس كتب
وقلت لك اريدك ان تبحث عن كتاب باسم شخص
لاحظ الجهد من بين التشبيه الاول
والثاني اهو الادوات مثل المكتبة والجهد هو موارد الجهاز
من حيث امكانيات الجهاز
فالكود انت من تقوم بتوزيعه والتعامل معه كما تشاء
متى يعمل ومتى يتوقف ومتى يستعد لتنفيذ الامر
حتى الأدوات أنت من يتحكم بها بالكامل
متى يعمل ومتى يتوقف ومتى يستعد لتنفيذ الامر
بينما الادوات يبقي يعمل ومجهز دائماً اذا كنت على عمل بالبرنامج او بدون
طوال ما البرنامج شغال حتى يتم اغلاقه
أكيد فية سوء فهم
اتمنى الوصف والشرح وصل لك الفكرة كاملاً لايهم افضل
تحياتى لك
وتمنياتى لك التوفيق
صدقني أخي الجوكر لم اذكر هذة التفاصيل إلى من واقع تجربة تزيد عن 10 سنوات ( في إستخدام الأدوات والربط بواسطة الـ wizard )
بعد ما نزلت هذة الأدوات في الإصدارة 2005 لم أتحمس لها كثيراً لأنني لا أعرف عنها شيء أبداً , وتعلمها كان صعب لقلة الشروحات عنها
ولكن بعدها بثلاث سنوات تقريباً في سنة 2008 أجبرت على التعامل معها وتعلمها , سياسة العمل
بعد فترة من التعلم والقراءة المعمقة عن هذة الأدوات
إكتشفت أنها كنز أزاح عن كاهلي عمل شاق كنت أقوم به في السابق.
كل الذي كنت أكتبة بشكل يدوي متوفر وجميع الإجراءات التي أحتاجها تقريباً موجودة وبشكل جميل
مستوى المشاريع التي أقوم بها صغيرة ومتوسطة
لم أقم بمشروع ضخم في حياتي ( ببساطة ليسة لدي القدرة على هذا النوع من المشاريع )
لأنني SOLO DEVELOPOER
أعمل بشكل منفرد على المشروع
ليس مثل الشركات الكبرى الذين يعملون على شكل فريق عمل
الـ wizard طريقة فعالة جداً جداً
لا أحتاج إلى الربط بالكود
والله لا أبالغ كانت تختصر أكثر من ما يقارب الـ 4000 سطر من الأكواد التي تكتب يدوياً.
أعجبت بها أكثر فأكثر
فتزوجتها