حقول الهوية : بين الفئات البرمجية وحقول SQL Server :

23 08 2009

يوجد الكثير من الطرق التي لعمل حقول هوية مميزة Identity fields او ما يعرف بالمفتاح الأساسي Primary Key Filed ، من اشهرها على الاطلاق حقل الـ Autoincrement او الترقيم التلقائي ، والتي يتم فيها توليد رقم تلقائي يزيد عن اخر رقم في العداد الخاص بقيمة تكون في اغلب الاحيان 1 ، تتميز بالخفة والنحافه ، وبالتالي فنحن نتوقع منها الاداء المتميز كونها تحمل قيمة رقمية صغيرة تبدأ من 1 وتصل للآلاف لكنها قد تصل الملايين كلما كبر حجم البرنامج وزاد استخدامه ، وان يكن ، فهي لاتزال ارقام صحيحه integers قد تكون مثلا 99999999999953424 وماذا يعني ذلك ؟ فلا يوجد مشاكل حتى اللحظه فما احلاها !

ولكن ما يعيب هذا الاسلوب هو افتقادها إلى شيء مهم للغاية ، حيث اننا في التطبيقات الكبيرة نوعا ما ، يكون اغلب اعتمادنا على الوضع المنفصل فقد نستخدم Dataset,LINQtoSQL,Entity Framework,…etc ونضيف سجلات Records وقد يتم تعديلها حتى قبل ان ترسل إلى قاعدة البيانات database ، والمشكلة التي ستحدث هنا ، ان كائنات البيانات التي بحوزتنا لن تستطيع اسناد قيمة لحقل المفتاح الأساسي ، حيث ان اصدارها يتم حكرا على قاعدة البيانات فقط ، ولن نستطيع معرفة قيمتها الا بإضافة السجلات إلى قاعدة البيانات وهنا تمكن المشكلة ، ففي التطبيقات التجارية والتطبيقات التي تعتمد على تعدد الطبقات n-tier applications ، يتم اضافة العديد من السجلات وحزمها كلها في حزمة واحده لإرسالها دفعة واحدة إلى قاعدة البيانات ، كما يتم قبل ذلك كله تبادل البيانات بين طبقتي العرض والاعمال ، ناهيك عما يدور خلف الكواليس من عمليات تحقق وسين وجيم !

أقرأ باقي الموضوع »





3- استخدام الـ Entity Framework لتطوير نوافذ من النوع MasterDetails:

10 08 2009

عندما نكون قد وصلنا إلى هذه المرحلة ، اعتقد انه قد حان الوقت لنكون قد انتهينا من الحاجه في اظهار الكثير من الخطوات ! حيث انني اود عرض الاختلافات فقط !

نقوم بداية بإضافة فئة جديدة من النوع ADO.NET Entity data Model ونسميها مثلا CustomerOrdersModel ثم يظهر امامنا المعالج طالبا منا تحديد كيفية تصميم مصدر البيانات لنطلب منه توليد النموذج بكرم من قاعدة البيانات :

الخطوة التالية ، يطلب منك المعالج تحديد قاعدة البيانات ، قم بتحديد قاعدة البيانات Northwind بنفسك ، ثم انتقل إلى الخطوة التي بعدها وحدد الجدولين Customer,Orders ، وفي خانة الـ Namespace اكتب اسم دلالي مميز سنحتاجه لاحقا وليكن Entities ، انه المعالج بعدها ، لتفتح لك نافذة جديدة وهي نافذة الـ ModelDesigner ، طبعا لا حاجه لك في تعديل أي شيء هناك :

 

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

الآن توجه إلى النافذة الجديدة Form1 لنقوم بتطوير نافذة Master Details من النوع Full Details ، سنحتاج اولا إلى اضافة الـ DataSource ، وهنا تشترك الطريقتان LINQ-to-SQL و EntityFramework في كون الطريق هي نفسها ، حيث تختار ان يكون مصدر البيانات هو كائن Object ثم تحدد الفئة Customer وتنهي المعالج كالعادة لتجد الفئات قد وجدت على شكل جداول في النافذة Datasources ، قم بعدها بسحب الجدول Customer على شكل Details إلى النافذة from1 ثم الجدول Orders الفرعي التابع له النافذة ايضا ! بعدها انتقل مباشرة إلى نافذة محرر الاكواد حيث اننا سنحتاج إلى كتابة سطيرات برمجي بسيطة :

Public Class Form1
   
Dim ent As New Entities

    Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load

        Me.CustomersBindingSource.DataSource = ent.Customers.Include("Orders")

    End Sub

    Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles CustomersBindingNavigatorSaveItem.Click
       
Me.CustomersBindingSource.EndEdit()
       
Me.ent.SaveChanges()

    End Sub

حيث نقوم اولا بتعريف كائن جديد من النوع Entities وهي الفئة التي تحضن باقي فئات الجداول في الـ Entity Framework ، وفي حدث التحميل نقوم باسناد قيمة إلى الكائن BindingDataSource ولكن هنا لدي ملاحظه مهمه جدا ، وهي ضرورة استخدام الطريقة Inculde وارسال إسم الجدول المرتبط معها ، حيث لو كتبت ent.Customers فإن سجلات الجدول الفرعي Orders لن تظهر وانما ستظهر البيانات الاساسية فقط من الجدول الاب Customers .

وبالنسبة لحفظ التعديلات فكما نلاحظ فإننا لا نحتاج إلا إلى مناداة الطريقة SaveChanges حتى يتولى عنك خلفان وعباس وحمدان القيام بالباقي !

بالنسبة لتطوير نموذج من النوع Lookup List فلا اعتقد انك ترغب في اعادة كل السطور من الدرسين الماضيين وتغيير كلمه واحده فقط في كل مره !





Master Details – الجزء الثاني : استخدام Dataset

31 07 2009

1- استخدام الـ Dataset :

سافترض بانك تعرف كيفية اضافة مصادر البيانات فلن اضع صورا هنا ، سنقوم اولا باضافة مصدر البيانات من خلال القائمة Data | Add New Data Source ومن هناك نحدد قاعدة البيانات Northwind ونختار الجدولين Customers و Orders فقط ثم ننهي المعالج .

عمل الـ Full Details Form :

نتوجه بعدها إلى النافذة Form1 لنقوم بالعمل عليها ، وارجو منكم التركيز جيدا هنا .

1- توجه إلى القائمة Data | Show Data Sources او اضغط على shift+alt+d ستظهر لك النافذة بالشكل التالي :

 

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

من اهم الامور هنا هو وجود الجداول المتربطة بشكل متداخل ، فلاحظ من الصورة السابقة وجود الجدول Orders مرتين ، الاولى بشكل تابع للجدول Customers والثانية بشكل مستقل عنه ، تبعية الجدول Orders للجدول Customers من خلال العلاقة التي بينهما ( One-to-Many ) يعني امكانيه عرض السجلات التابعة لكل سجل بشكل سهل جدا . هذا ما سنشاهده بعد قليل فلا تخف.

قم بالضغط على الجدول Customers وستنبثق لك قائمة صغيرة لتحدد طريقة العرض اختر منها details كما بالشكل التالي :

 

 

الآن الخطوة الاكثر اثارة واهمية ، وهي سحب الجدول Custometrs إلى النافذة form1 وتركه هناك ، سيقوم Visual Studio بتوليد كل الادوات والاكواد المطلوبة لعرض البيانات وربطها والتنقل بينها … الخ كما بالصورة التالية :

لو قمت بتشغيل التطبيق الآن ، ستلاحظ ظهور البيانات بشكل جميل ومرتب مع امكانية التنقل بين السجلات بسهولة ، فضلا عن امكانيه الاضافة والحذف والحفظ ايضا .

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

لو قمت الان بتجربة البرنامج ، ستجده يعمل بالشكل المطلوب تماما ، فبمجرد عرض سجل من الجدول customers في الاعلى ، يتم عرض السجلات المرتبطة به من الجدول Orders مباشرة في الاداة DataGrid في الاسفل مباشرة .

اذا كنت تستخدم الاصدار 2008 فقد اتممت كل الامور الضرورية المطلوبة ، اما في الاصدار 2005 و .net framework 2.0 فأنت بحاجه إلى اضافة بعض السطور في كود الحفظ من الـ BindingNavigator فهنا يتم تحديث كل جدول على حده للأسف ، لذلك ستجد كودا مثل :

Me.Validate()
       
Me.CustomersBindingSource.EndEdit()
       
Me.CustomersTableAdapter.Update(CustomerOrdersDataset.Customers)

وهذا يعني تحديث بيانات الجدول Customers فقط دون الجدول Orders المرتبط به ، لذلك اضف بعض السطور ليصبح الكود النهائي بالصورة التالية :

Me.Validate()
       
Me.CustomersBindingSource.EndEdit()
       
Me.CustomersTableAdapter.Update(CustomerOrdersDataset.Customers)
       
Me.OrdersBindingSource.EndEdit()
       
Me.OrdersTableAdapter.Update(CustomerOrdersDataset.Orders)

بينما في الاصدارات الاحدث من اطار العمل وكذلك فيجوال ستوديو ، يتم توليد الفئة TableAdapterManager يقوم بإدارة كل الكائنات من النوع tableAdapter والعمل عليها دفعة واحدة ! فكود الحفظ سيكون مولدا تلقائيا بالشكل التالي :

Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
CustomersBindingNavigatorSaveItem.Click
       
Me.Validate()
       
Me.CustomersBindingSource.EndEdit()

        Me.TableAdapterManager.UpdateAll(Me.CustomerOrdersDataset)

    End Sub

حركة اخيرة احبها في هذا النوع من النوافذ وهو استخدام عجلة الفأرة MouseWheel للانتقال بين السجلات حيث نضيف الكود التالي في حدث الـ MouseWheel التابع للنافذة Form مباشرة :

 

Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)   Handles Me.MouseWheel
       
If e.Delta > 0 Then
           
Me.CustomersBindingSource.MovePrevious()
       
ElseIf e.Delta < 0 Then
           
Me.CustomersBindingSource.MoveNext()
       
End If
   
End Sub

بهذا نكون قد انهينا نافذة من النوع Detail view .

بناء نافذة من النوع Lookup :

هنا قم بإضافة نافذة جديدة فارغة إلى مشروعك ، وتوجه إلى نافذة الـ Datasources وحدد الجدول Customers وقم بتحديد النوع None لكل الحقول ، فلا نريد عرض سوى حقل واحد وهو ContactTitle حيث نريد عرض اسم الـ contact فقط ، وبالنسبة لهذا الحقل ، اختر الاداة ListBox :

 

الآن قم بسحب الجدول customers عن بكرة أبيه إلى النافذة Form ، ستلاحظ توليد الـ BindingNavigator وكل المكونات الاخرى ، وتوليد اداة ListBox فارغة ، قم بالنقر في الزر العلوي منها كما بالشكل التالي :

 

قم بتفعيل الخيار Use data bound items ، وستتغير تلك النافذة الصغيرة لتظهر عدة خيارات اضافية بها ، يهمنا منها الخاصية Datasource ، اختر منها CustomerBindingSource كما بالشكل التالي :

 

وبالنسبة للخاصية DisplayMember اختر الحقل ContactName التابع للـ customerBindingSource دون غيره :

 

الآن قم بتعيين قيمة الخاصية dock التابعة للاداة Listbox لتكون Left حيث اننا نود عرضها بالجانب الايسر في هذه الحالة – وفي حالة كون التطبيق باللغة العربية اجعله Right لاتنسى رجاءا ! – بعدها توجه مرة اخرى إلى النافذة DataSources وقم بسحب الجدول Orders الفرعي – التابع لـ Customers – إلى النافذة مباشرة وقم بضبط الخاصية Dock لها لتكون fill ، شغل بعدها البرنامج مباشرة وشاهد النتيجة بنفسك :

 

حيث يظهر لك في الاداة ListBox الحقل ContactName وبمجرد اختيار احد القيم من هناك يتم عرض البيانات الفرعية التابعة له من الجهة اليمنى في الاداة DataGridView .

تبقى فكرة الحفظ نفسها التي طبقناها في المرة السابقة مع النوع الاخر من النوافذ وذلك في حالة كونك تستخدم VS2005,.net 2.0 .

بهذا نكون انتهينا من عرض طريقة استخدام الـ Dataset في انشاء نوافذ تعرض البيانات بطريقة Master Details .





Master Details اختلفت مصادر البيانات والنتيجة واحدة !

27 07 2009

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

أقرأ باقي الموضوع »





هل تعلم ما هو اطار عمل كيان البيانات Entity Framework ؟

22 07 2009

في إحدى الرسائل التي وصلتني إلى بريدي من فترة ، رسالة من احد الإخوة يقول فيها : " السلام عليكم أبو تقنيات جديدة ! " ضحكت كثيرا عندما قرأتها ، فقد كانت مضحكه جدا ، ودفعني إلى مراجعة مقالاتي ومدوناتي التي كتبتها، فوجدت ان اغلبها يتحدث عن التقنيات الجديدة التي تظهر بين الفينة والاخرى ! فأجبته قائلا : نعم اذا كنا سنعتمد على تقنيات من انتاج شركة مايكروسوفت ، فاعلم انه يتوجب علينا اللهث وراء تلك التقنيات لأنها تظهر بشكل أسي بالمعادة F(x) = e^x ههههه .

أقرأ باقي الموضوع »





هل استخدم Dataset ام LINQtoSQL ؟

27 06 2009

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

من هذه الامور هو استخدام Dataset او LINQtoSQL ، فبعد ظهور LINQtoSQL صار علينا التفريق في استخدامهما ومعرفة الحالات التي تقتضي افضلية ايهما !

في الحقيقة هذا يعتمد على السيناريوهات التي تود تحقيقها ، وانت حر بطبيعة الحال في السيناريو الذي تريد .

بالنسبة للـ Dataset :
- الـ Dataset سهل التعريف ، والتسلسل Serialize ، ويسهل فصل الكود فيها عن تصميمه في المشاريع المتعددة الطبقات خصوصا بما يتعلق بالـ TableAdapter المضمنه فيه .
- الـ Dataset يحتوي على متتبع للتغيرات التي تطرأ على البيانات المضمنه فيه، ويدعم التغيير دفعه واحده Batch Editing وكذا بالنسبة للتصفيه والعرض ، كما انه يتعامل بشكل تلقائي مع العلاقات المركبة Complex Relationships .
- يسهل استخدام Dataset عندما نرغب في عمل ربط بيانات DataBinding بشكل متقدم ومعقد .
- يصعب استخدام Dataset عندما نرغب بعمل بعمل عمليات تحقق متقدمة على البيانات .
- يجب تجنب استخدام Dataset عندما تقوم ببناء تطبيق موزع ليس كل العملاء Clients فيه مبنية على net.

بالنسبة لـ LINQtoSQL :

-  يقدم لك LINQtoSQL دعم تحكم كامل بالتحقق Validation, السلوك Behavior ، منطق الأعمال BusinessLogic ، كما انها سهله التوريث للفئات الاخرى ، هذا يعني امكانيه عمل طبقات ام وطبقات مشتقة للاعمال بكل سهولة .
- يمكن عمل تسلسل Serialization لفئات LINQtoSQL على شكل مصفوفات Arrays لغير عملاء net.
- بمجرد ايقاف الاتصال بين LINQtoSQL والـ DataContext ، تكون عملية ال Databinding وتعقب التغييرات على البيانات عملية صعبة ويجب عليك القيام بكل ذلك بنفسك !





استخدام Parameters في ADO.NET لتبادل البيانات مع قاعدة البيانات – الجزء الثاني

26 09 2008

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

أقرأ باقي الموضوع »





سلسلة فيديو LINQ مع الاكواد من مايكروسوفت

4 07 2008

اذا كنت قد سمعت بهذه التقنية ام لم تسمع بها بعد ، وحتى ان كنت من النوع الذي قد وضع ” رجل على رجل ” كما يقولون او بطيخه صيفي في بطنه وهضمتها واستخدمتها فعليا ، فهذا لا يعني انك تعرف كل شيء عن هذه التقنية !!- انا هنا لست بصدد الحديث عن هذه التقنية وعن كيفية استخدامها ومزاياها وغيرها من الامور- ولكنني بصدد إحالتك الى المدعوة Beth Massi من مايكروسوفت والتي ستقدم لك دروس فيديو مجانية ! لشرح هذه التقنية مع امثلة تطبيقية في الفيديو و sample codes .

للوصول الى الـ videos ، انقر هنا ، لتحميل الـ Sample Codes انقر هنا

نلتقي لاحقا





مقدمة إلى تقنية LINQ مع أمثله مقابله لجمل SQL مختلفة

23 08 2007

اقدم لكم هذا الموضوع الذي قد يجده البعض سابقا لأوانه ، وهو يتحدث عن تقنية LINQ التي يحملها اوركاس الينا ( الاصدار 2008 من Visual Studio ) ولكن في الحقيقة انه استغلال للوقت وتعلم لشيء جديد سيجعلنا قادرين على العمل معه فور صدور الاصدار النهائي من Visual Studio 2008 والملقب بـ Orcas .هذا المقال مقال مترجم وهذا مصدره للأمانه ، ولا تنسوا ان الترجمه هي مصدر رئيسي للمعلومات ادت الى تفوق امتنا الاسلامية العربية في قديم الزمان وهي الوسيلة التي جعلت الغرب اليوم يعيش في هذه الثورة العلمية العظيمة التي يشهدها العالم اليوم .اولا : ما هي تقنية LINQ ؟
لقد تحدثت في هذا الموضوع :تعرف على Microsoft Visual Studio 2008 Code Name Orcas عن هذه التقنية بشكل مختصر وهناك تجد جواب هذا السؤال فلا داعي للتكرار

ثانيا : ما هي LINQ to SQL ؟
هي عباره عن اداه تتوفر في أوركاس ، تقوم هذه الأداة بعرض قاعدة البيانات التي تتصل بها على هيئة فئات net. مما يساعدك على استخدام تقنية LINQ وما تتضمنه من امكانيات مختلفه كعرض البيانات وتعديلها وحذف البيانات واضافه بيانات جديده وغيرها من الاوامر التي تمكننا لغه SQL سابقا من القيام بها . ويجب ان نعلم ايضا ان هذه الاداة لا تغفل مكونات قاعدة البيانات الاخرى كالـ Views, Transictions and Stored Procedures .

أقرأ باقي الموضوع »