Linq to Dataset - سي شارب - مقـــالات - Top Coder
Welcome to our Site
الدخــول Or تسجـــيل
الثلاثاء
2016-12-06
1:10 PM
تسجــــيل | دخـــول
الرئيسية » مقالات » سي شارب

Linq to Dataset
Linq to Dataset

الهدف من المثال
1. حفظ بيانات DataSet في ملف xml واستعادتها منه والتعامل معها بدون الحاجة لوجود قاعدة بيانات
2. الاستعلام من الـ DataSet باستخدام Linq ومن أكثر من جدول وإدخال بعض الحسابات في جملة الاستعلام واستخدام عبارة Join لمنع التكرار الخاطئ للبيانات
3. استخدام Lambda Expressions للقيام بالحسابات من أجلنا والاستفادة من ميزة رفع المتغيرات
4. إظهار نتيجة استعلام Linq في DataGridView مباشرة
من أجل ترك الموضوع عام وبما أن مجموعة البيانات DataSet يمكن ربطها مع أي قاعدة بيانات سأقوم بالعمل على مجموعة بيانات غير مربوطة مع قاعدة بيانات حيث يمكنك تطبيق الأفكار الواردة هنا على أي قاعدة بيانات يمكن ربطها مع أي DataSet وسيكون مثالي الذي سنسير عليه هنا معتمد على خدمة مصرفية تدعى بالودائع لأجل
 
افتح أي إصدار من فيجول ستوديو 2008 وأنشئ مشروعا جديدا من نوع Windows Forms Application ثم من قائمة Project اختر الأمر Add New Item وأضف DataSet للمشروع وقم بتسميتها MyDataSet
في محرر التصميم الرسومي لمجموعة البيانات انقر بزر الفأرة اليميني واختر الأمر DataTable من قائمة Add في قائمة السياق ثم قم بإعادة تسميته ليصبح اسمه Customers
أضف للجدول Customers الحقول التالية مع الخصائص الموضحة
الحقل ID الخاصية AutoIncrement بالقيمة True والخاصيتان AutoIncrementSeed و AutoIncrementStep كلتاهما إلى القيمة 1 و نوع البيانات System.Int32 ثم انقر بزر الفأرة اليميني على الحقل ID واختر الأمر Set Primary Key من قائمة السياق لتحديد الحقل كمفتاح أساسي
الحقل CustomerName نوع البيانات System.String و MaxLength بالقيمة 25
الحقل CurrentAccountNumber نوع البيانات System.String و MaxLength 25
حيث أن الحقل ID هو معرف الزبون و CustomerName هو اسم الزبون والحقل CurrentAccountNumber هو رقم الحساب الجاري لدى المصرف
أضف جدول آخر لمجموعة البيانات باسم Wadaeaa وأضف له الحقول التالية
الحقل WadeaaNumber بنوع بيانات String
الحقل CustomerID بنوع بيانات Int32
الحقل InterestRate بنوع بيانات Decimal و NullValue مساوية لـ 7.5
الحقل WadeeaPeriod بنوع بيانات Int16 و BullValue مساوية لـ 3
الحقل StartDate بنوع بيانات DateTime
الحقل WadeaaAmount بنوع بيانات Int32 و NullValue بقيمة 10000
حيث WadeaaNumber هو رقم الوديعة و CustomerID هو حقل مرتبط بجدول الزبائن و InterestRate نسبة الفائدة و WadeeaPeriod فترة الوديعة بالأشهر و StartDate تاريخ فتح الوديعة و WadeaaAmount قيمة الوديعة

سنضيف الآن علاقة بين الجدولين: انقر بزر الفأرة اليمني على الجدول Customers ومن القائمة الفرعية Add اختر Relation ثم اضبط Parent Table إلى Customers و Child Table إلى Wadaeaa ثم اختر Key Columns ليضم الحقل ID فقط و Foreign Key Columns ليضم الحقل CustomerID فقط ثم اختر الخيار Both Relations And Foreign Key Constraint ثم اضغط Ok من أجل حفظ العلاقة ثم اختر الأمر Save All من القائمة File


انتقل إلى محرر النماذج الخاص بـ Form1 واجعل مساحة Form1 كبيرة كفاية لتتسع لـ 2 × DataGridView مع شريط أدوات وبعض التحكمات الأخرى التي سنضيفها لاحقا ثم انتقل لنافذة Data Sources واسحب الجدول Customers ثم ألقه على سطح Form1 فيتم إضافة DataGridView و شريط أدوات للنافذة

من نافذة Data Sources انقر إشارة + بجانب الجدول Customers لتظهر لك قائمة بالحقول الخاصة به كما نلاحظ وجود نسخة من الجدول Wadaeaa كجدول فرعي ضمن Customers وذلك بسبب العلاقة التي قمنا بإنشائها بين الجدولين الآن قم بسحب الجدول Wadaeaa الموجود كجدول فرعي لـ Customers وليس الجدول الخارجي إلى سطح Form1 ليتم إنشاء DataGridView أخرى على النافذة ثم قم بتنسيق النافذة بشكل جيد وتأكد من أن الـ DataGridView الخاصة بـ Customers في الأعلى و الأخرى في الأسفل


اختر CustomersDataGridView وانقر على السهم الصغير الذي يظهر في زاويتها اليمينية العليا واختر الأمر Edit Columns واضبط الخاصية Visible للحقل ID إلى False ثم كرر العملية بالنسبة للحقل CustomerID في WadaeaaDataGridView


في شريط الأدوات في الأعلى انقر بزر الفأرة اليميني على زر الحفظ – يمتلك أيقونة قرص – واختر الأمر Enabled لتفعيله ثم انقر عليه نقرا مزدوجا لننتقل إلى محرر الكود ثم أدخل الكود التالي في حدث النقر على زر الحفظ حيث نستخدم الوظيفة WriteXml لتخزين محتويا مجموعة البيانات في ملف xml
كود
 
نشئ إجراء لمعالجة الحدث Load للنموذج وأدخل فيه الكود التالي الذي سيقوم بتحميل البيانات من ملف xml لاحظ ظهور رسالة خطأ عند تشغيل البرنامج لأول مرة وقبل حفظ البيانات حيث أن ملف البيانات لم يتم إنشاؤه بعد وهذا السبب في استخدام بلوك Try … Catch من أجل اصطياد الخطأ وتجنب إفشال عملية بدء البرنامج وقد استخدمنا الوظيفة ReadXml لتحميل البيانات من ملف xml إلى مجموعة البيانات
 
 


شغل البرنامج وأدخل فيه بعض البيانات في كلا الـ DataGridView وتأكد من أنك قد قمت بتعبئة جميع الحقول في كلتا شبكتي البيانات وقم بالحفظ وأغلق البرنامج ثم أعد فتحه من جديد للتأكد من أن عملية الحفظ قد تمت بشكل صحيح وانتبه إلى أن الحقل WadeeaPeriod هو عبارة عن عدد أشهر فترة الوديعة لذا حاول الالتزام بالقيم 1 أو 3 أو 6 أو 12 كقيمة لهذا الحقل من أجل تجربة إجرائية الاحتساب لاحقا


نريد الآن إظهار قيم الاحتسابات الخاصة بكل وديعة عند المرور عليها وكذلك تاريخ استحقاق هذه الوديعة
أضف أربعة حقول نصية للنافذة ورتبها أسفل شبكتي البيانات وأعطها الأسماء التالية txtEndDate لتاريخ الاستحقاق و txtInterest لقيمة الفائدة و txtRayaa لضريبة الريع و txtIdara لضريبة الإدارة المحلية

أضف الاستيراد التالي في بداية ملف الكود الخاص بـ Form1 من أجل تمكيننا من استخدام الوظائف الموجودة به
using Microsoft.VisualBasic;

أضف ال class التالى فى بداية الكود الخاص بـ Form1 من أجل تمكيننا من استخدام Lambda Expressions فى ال c#
 
ثم أضف الإجراء التالي كإجرائية للاحتساب
 
حيث استخدمنا في البداية الدالة DateDiff للحصول على عدد أيام الفترة التي سنقوم بالاحتساب عنها وكنا قد مررنا قيم المبلغ و تاريخ البداية وتاريخ النهاية ونسبة الفائدة كمحددات لإجرائية الاحتساب ثم عرفنا تعبير لمدا يقوم باحتساب قيمة ضريبة الريع Rayya_Calc بناء على مبلغ الفائدة الممررة له وفي تعبير لمدا والضريبة الأخرى لم نمرر لها قيمة ولكنها استخدمت متغير محلي من أجل الاحتساب وتعبير لمدا الأخير Intrst_Calc يستخدم أيضا خاصية رفع المتغيرات ولكنه هنا يستخدم المحددات الممررة للإجراء كمتغيرات مرفوعة ثم نقوم باستخدام هذه التعابير للاحتساب ثم نظهر القيم في صناديق النصوص المناسبة

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


في البداية قمنا بإنشاء استعلام Linq للحصول على القيم الخاصة بالوديعة التي نقف عليها حيث أن المتغير a مرتبط بالجدول Wadaeaa ثم في قسم Where ضبطنا الشرط بحيث يجلب الاستعلام فقط الودائع الخاصة بزبون معين عن طريق التأكد من أن قيمة الحقل CustomerID مساوية لقيمة ID الخاصة بالزبون من خلال قراءة قيمة الخلية المناسبة في السطر الحالي وتتمة للشرط وبنفس الطريقة قمنا بضبط الشرط كي يجلب الوديعة ذات الرقم المراد ثم يأتي قسم Select لنحدد فيه قائمة الحقول التي نريد الحصول عليها لاحظ وجود الحقل المحسوب EndDate الذي يتم حساب قيمته من الحقول المعادة من الاستعلام باستخدام الوظيفة DateAdd التي تضيف فترة زمنية معينة حسب المحددات الممررة لها إلى تاريخ ممرر لها وتعيد قيمة التاريخ الجديد وتعاد قيمته مع قائمة الحقول التي يعيدها الاستعلام وبعد الاستعلام نتأكد من أنه قد جلب نتائج فعلا بالتحقق من قيمة الخاصية Count ثم نستدعي الوظيفة DisplayWaeaaCalcs للقيام بالحسابات وإظهار النتائج

شغل البرنامج ولاحظ ظهور قيم الاحتسابات في مربعات النصوص عند التنقل في كلا شبكتي البيانات إذا كانت لديك بيانات قمت بحفظها كما طلبت منك سابقا


من أجل إظهار الودائع التي تبدأ بتاريخ معين وإظهارها أضف نموذج آخر للمشروع باسم Form2 ثم أضف DataGridView له واضبط الخاصية Dock للقيمة Fill لجعل شبكة البيانات تملأ كامل مساحة النموذج ثم نسق النموذج بحيث يكون كبيرا كفاية لعرض البيانات الناتجة عن الاستعلام


أضف زرا للنموذج From1 واجعل إجراء معالجة حدث النقر عليه يماثل الكود التالي
 
 
لاحظ أنني استخدمت ميزة في فيجول ستوديو تمكنني من حذف محددات إجراء معالجة حدث ما إن كنت على يقين أنني لن أحتاج لاستخدامها
في جملة الاستعلام تلاحظ أنني استخدمت Join للربط بين الجداول عند عملية الاستعلام كي نتجنب مشكلة ظهور بيانات مكررة من أحد الجداول من أجل جميع سطور الجدول الآخر حيث استخدمنا نفس أسلوب العلاقة التي قمنا بإنشائها في البداية بين الجدولين من حيث ربط الحقل CustomerID في الجدول Wadaeaa بالحقل ID في الجدول Customer و استخدمنا في قسم Where شرط لتصفية نتائج الاستعلام بحيث نحصل على الودائع التي تبدأ بتاريخ معين ثم نستخدم عبارة Select لتحديد الحقول التي نريد إظهارها كنتائج الاستعلام
ومن أجل إظهار النتائج في Form2 قمنا بإنشاء متغير من نوع تلك النافذة ثم ضبطنا قيمة DataSource لشبكة البيانات الموجودة على ذلك النموذج إلى النتيجة المعادة من الاستعلام مستخدمين الطريقة ToList لتحويل النتائج إلى شكل يمكن إظهاره في شبكة البيانات
ومن أجل الحصول على الودائع التي تنتهي بتاريخ معين يمكننا استخدام نفس الكود السابق بعد تعديل بسيط في قسم Where بحيث يصبح الكود كما يلي
 
المصـــــــــــدر
تحميل المشروع
 Written by :  Mohammed Mahmoud
الفئة: سي شارب | أضاف: ham_mody2000 (2011-08-15 9:18 PM)
مشاهده: 1803 | الترتيب: 0.0/0


أترك تعليقك من خلال حسابك على الفيس بوك

تعليقات مشتركي الموقع

مجموع المقالات: 0
إضافة تعليق يستطيع فقط المستخدمون المسجلون
[ التسجيل | دخول ]
طريقة الدخول
بحث
Our Facebook community

تم إطلاق صفحة توب كودر على الفيس بوك

Advertisment
الأحـــدث
hitstatus
Copyright Mohammed Mahmoud © 2016
إنشاء موقع مجاني с uCoz