الرئيسية - الاستضافة - التصميم - حجز دومين - إشهار - حماية - اتفاقية الاستخدام - عن الموقع - طرق الدفع - اتصل بنا

  

  

روابط مفيدة  :  استرجاع كلمة المرور | طلب كود تفعيل العضوية | تفعيل العضوية | مركز رفع الصور والملفات | قوانين المنتدى

 
العودة   منتديات السعودية هوست > قسم البرمجة والتطوير > لغات مواقع الانترنت البرمجية > VB.NET
التسجيل البحث مشاركات اليوم اجعل كافة الأقسام مقروءة
 

رد
 
LinkBack أدوات الموضوع طرق مشاهدة الموضوع
قديم 03-31-2008, 10:38 AM   رقم المشاركة : 1
معلومات العضو
المحترف 1
عضو جديد
 
الصورة الرمزية المحترف 1
 

 

 

إحصائية العضو






 

المحترف 1 غير متواجد حالياً


افتراضي تعلم ربط الفيجول بيسك دوت نت 2005 مع قواعد البيانات

هذه اول مشاركة لي في هذا المنتدى وسوف اقوم بتنزيل دروس عن كيفية الربط الفيجول بيسك دوت نت 2005 مع اي قاعدة بيانات يعني
1/ الاكسس
2 الاسكيوال سيرفر



وبعد التعرف عن كيفية الربط سنقوم بشرح برنامج بسيط مثلا لفندق او مبيعات معينة مع اي قاعدة بيانات من اضافة وحذف وتعديل وبحث

اما الان فدعونا نلقي الضوء على هذا الموضوع

ملاحظة اغلب هذا الموضوع منقول من منتدى الفريق العربي للببرمجة

نبدى

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..


=============
اليوم أقدم لأخواني درس يتناول التعامل مع قواعد البيانات باستخدام ADO.NET من الصفر إلى الاحتراف . والله الموفق ..
=============
وقبل أن أبداء في الدرس أحب أن نغرس في أنفسنا مبدأ يجب أن يتمسك به كل مسلم وهو حب نشر العلم تقرباً لله تعالى ، وذلك أن العلم أمانه يجب أن تصل إلى أصحابها وهم اللذين لا يعلمون ، وكل مسلم سوف يسأل عن علمه ماذا عمل به ، وأن نتذكر قول النبي صلى الله عليه وسلم : ( إذا مات ابن آدم انقطع عمله إلا من ثلاث : صدقة جارية , أو علم ينتفع به من بعده أو ولد صالح يدعو له ) .
=============
وأحب أن يعرف الجميع أني لست متخصص في البرمجة ، أنا من الهواة وسبقني الكثير من الأخوان الأفاضل والأكثر مني علماً وخبرة ولذلك سوف استخدم مجموعة من المراجع والدروس وألخصها وأنقل ما فهمته منها ، ولا تستغربوا إن وجدتم أخطاء في الدرس هنا أو هناك والمطلوب من وجد معلومة خاطئة أن يصححها و يوضحها لنا مشكوراً ...
=============
لقد احترت كثيراً في الكيفية التي سوف أبدأ بها كتابة هذا الدرس فانا لست بارع في هذا المجال ( الكتابة ) ، وهذا الموضوع بالذات كثر فيه الجدل لأنه متشعب ، ولكي نجعل الموضوع سهل للجميع سوف نأتي بالزبده ( الخلاصة ) ونبتعد عن التفاصيل المملة التي لا يحتاجها المبتدئ والتي يمكن الرجوع إليها في الكتب المتخصصة في ذلك .
و قبل كل شيء أحب أن أوضح أنه من المهم أن نتحد في الإصدار الخاص بـMicrosoft.NET فأنا أستخدم الإصدار 2005 ، وأتعامل مع قواعد البيانات المصممة بواسطة برنامج Microsoft Office Access 2003 ، ولا أريد أن يغضب مني أخواني الذين يستخدمون SQL Server ، فانا لم أتعامل معه بشكل مباشر غير أني قرأت عنه قليلاً ولا أحتاجه في تطبيقاتي حتى الآن . ولكن هذا لا يعني أن الأخوان الذين يعملون على SQL Server لن يستفيدوا من هذا الدرس لان إستراتيجية التعامل مع قواعد البيانات في ADO.NET تقريباً موحدة في مختلف برامج قواعد البيانات سواء المصممة بواسطةMicrosoft Office Access أو SQL Server أو Oracle ، المهم أن نستخدم سلسلة الاتصال المناسبة ، بالإضافة إلى فضاء ( مجال ) الأسماء المناسب والكائنات التابعة له ، وكذلك اختيار طريقة الاتصال المناسبة لاحتياجاتنا ، والتي سوف نتعرف عليها فيما بعد ,,,
=============
تتلخص أهدفنا في التعامل مع قواعد البيانات في النقاط التالية :
1- الاتصال بمصدر قاعدة البيانات .
2- قراءة البيانات التي بها وعرضها بطرق شتى من خلال الأدوات المتوفرة في بيئةMicrosoft.NET .
3- معالجة البيانات وتحديثها من خلال تعديل قيم هذه البيانات أو إضافة بيانات جديدة أو حذف بيانات غير مرغوب فيها .
4- حفظ البيانات المحدثة .
5- الإبحار في البيانات من خلال الانتقال للسجل التالي أو ألعودة للسجل السابق أو الانتقال للسجل الأول أو الانتقال للسجل الأخير .
6- البحث عن البيانات بسهولة ويسر من خلال وضع فلاتر للترشيح .
7- ربط البيانات ذات العلاقة في أكثر من جدول وعرضها ومعالجتها .
8- طباعة التقارير الملخصة للبيانات .
=============
البداية :-
* نبذه عن ADO.NET:
هي مجموعة من الفئات مشمولة في مجال الأسماء System.Data غرضها الوصول إلى مصادر البياناتData Sources والتي تمثل بيانات محفوظة تحت أنظمة قواعد بيانات متعددة الأنواع ( مثل Microsoft Office Access أو SQL Server أو Oracle ) مما يعني قدرتك على الوصول إلى أي قاعدة بيانات مهما كانت الشركة المنتجة لها . ( أ. تركي العسيري) .
وتقوم ADO.NET باستخدام مزودات البيانات للاتصال بمصادر البيانات ومن ثم استرجاع هذه البيانات وتعديلها وإعادتها لمصادرها وحفظها هناك ( أ. خالد الجديع ) .
* الاتصال بقواعد البيانات:-
للوصول إلى البيانات المخزنة في قاعدة البيانات ( والتي سوف تكون في درسنا هنا عبارة عن ملف من نوع MDB الخاص ببرنامج Microsoft Office Access ) والقراءة منها أو الكتابة فيها يجب أن نكوّن اتصال ناجح معها ، وذلك يتم من خلال كائن الاتصال المسمى Connection ، ولتجهيز هذا الكائن نحتاج إلى أعطائه معلومات عن ملف قاعدة البيانات الذي نريد أن نتصل به ( من أهمها على سبيل المثال مزود البيانات وخادم البيانات واسم ومكان قاعدة البيانات و كلمة المرور مع كلمة السر إن وجدت ) ، وهذه المعلومات تكوّن لنا بما يسمى سلسلة الاتصال ( Connection String ) وهي عبارة عن أحد خصائص كائن الاتصال .
* سلسلة الاتصال :
وهي عبارة عن مجموعة من العوامل ( Parameters ) الضرورية للاتصال بقواعد البيانات ، وتختلف هذه العوامل بناءً على نوع مزود البيانات الذي سوف نتحدث عنه بالأمثلة في السطور التالية ، ومن أهم ما يهمنا من هذه العوامل ما يلي :
- Provider : وهو عبارة عن اسم مزود البيانات وسوف نذكر هنا نوعين الأكثر انتشاراً ، النوع الأول Microsoft.Jet.OLEDB.4.0 وهو للتعامل مع قواعد بيانات برنامج Microsoft Office Access ، والثاني SQLOLEDB وهو مخصص للتعامل مع قواعد بيانات برنامج SQL Server .
- DataSource : وهو اسم خادم البيانات ( أللذي يحتوي على جداول البيانات التي نريد أن نتصل بها ) ، ونجد أن خادم البيانات في برنامج Microsoft Office Access هو اسم ملف قاعدة البيانات الذي يحمل امتداد MDB ، بينما برنامج SQL Server فهو عبارة عن اسم الـ Server المثبت على الجهاز .
- Intial Catalog : وهو عبارة عن اسم قاعدة البيانات الموجوده في الخادم بالنسبة لبرنامج SQL Server .
- UserID/Password : وهو عبارة عن اسم المستخدم وكلمة المرور لقاعدة البيانات في حالة وجود قيود أمنية عليها .



سلسة اتصال بملف قاعدة بيانات برنامج Microsoft Office Access ..
مثال 1 :

كود PHP:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=cMymdbFile.mdb;User ID=Admin;Jet OLEDB:Database Password=YourePassword

قاعدة البيانات الثانية وهي الاسكيوال سيرفل طريقة ربطها كاالتالي


مثال 2 :
سلسة اتصال بملف قاعدة بيانات برنامج SQL Server ..

كود

كود:
Provider=SQLOLEDB;Data Source=SQL Server DB;Initial Catalog=Northwind;User ID=You'reUserName;Password=You'rePassword


بعد التعرف على سلسلة الاتصال يجب أن نتعرف على نوعيّ طريقة الاتصال بقاعدة البيانات ..
* نوعيّ طريقة الاتصال بقواعد البيانات :
من الجدير بالذكر أننا لو أردنا أن نتصل على قاعدة البيانات بواسطة ADO.NET يجب أن نختار طريقة الاتصال المناسبة لاحتياجاتنا ، فلدينا طرقتين للاتصال وهما الاتصال المتصل ( Connection Oriented ) و الاتصال المنفصل ( Connectionless Oriented ) . ولكل منهما امتيازاته وعيوبه و إستراتجياته الخاصة به في العمل ، غير أن الأخير يعتبر الأمثل في التعامل مع قواعد البيانات ، وهنا بالتحديد يضيع أغلب من يرغبون تعلم برمجة قواعد البيانات من خلال ADO.NET .
** هنا ينتهي حديثنا اليوم وذلك لأن المشوار ما زال طويل ولا يمكن استيعابه في مشاركة واحدة ، ولكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس وذلك في المشاركات القادمة ..
((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))






آخر تعديل صـقـــــرٍ يوم 03-31-2008 في 02:48 PM.

رد مع اقتباس
قديم 03-31-2008, 11:35 AM   رقم المشاركة : 2
معلومات العضو
 

إحصائية العضو






 

عبدالوهاب يحي أل يحي غير متواجد حالياً


افتراضي

غفر الله لك اخي محترف وزادك الله من علمة ومنتظرين بقية الدروس وكذالك انا على اتم الاستعداد للمشاركة






التوقيع

اللهم انفعني بما علمتني وزدني خير منه

رد مع اقتباس
قديم 03-31-2008, 03:23 PM   رقم المشاركة : 3
معلومات العضو
وع...ـد ألهوى
صاحب دار
 
الصورة الرمزية وع...ـد ألهوى
 

 

 

إحصائية العضو







 

وع...ـد ألهوى غير متواجد حالياً


إرسال رسالة عبر مراسل MSN إلى وع...ـد ألهوى

افتراضي

تسسسسسسلم ـآخوٍي


تقبل مروري







آخر تعديل Master يوم 04-02-2008 في 08:40 AM.

رد مع اقتباس
قديم 04-01-2008, 05:35 AM   رقم المشاركة : 4
معلومات العضو
محمد جعدان
مشرف منتديات البرمجة
 
الصورة الرمزية محمد جعدان
 

 

 

إحصائية العضو






 

محمد جعدان غير متواجد حالياً


افتراضي جميل جدا

مشكور أخي محترف وفعلا شرحك جميل ورائع وذو ميزه خاصه
وانشاء الله إلى الأمام دوما وزادك الله من علمه
وانا على اتم الاستعداد على المشاركه
وشكرا






آخر تعديل Master يوم 04-02-2008 في 08:40 AM.

رد مع اقتباس
قديم 04-02-2008, 06:53 AM   رقم المشاركة : 5
معلومات العضو
المحترف 1
عضو جديد
 
الصورة الرمزية المحترف 1
 

 

 

إحصائية العضو






 

المحترف 1 غير متواجد حالياً


افتراضي درسنا الثاني

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..

قبل الشرح غفر الله لاخي ياسر الشيخ من منتدى المبرمج العربي
فلو له لما كنا نقراء هذه الدروس الان وبهذه البساطه واليسر

بسم الله نبدى


* الاتصال المنفصل ( Connectionless Oriented ) :

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

وتتلخص فكرته في أن نقوم بإجراء اتصال بقاعدة البيانات ، وذلك بواسطة كائن الاتصال Connection كما ذكرنا في الدروس السابقة ، وبعد قبول الاتصال نقوم بأخذ نسخة من البيانات المخزنة في مصدر البيانات "Data Sources" ( مصدر البيانات هنا هو ملف قاعدة البيانات بالنسبة لـ Microsoft Office Access أو السيرفر بالنسبة لـ SQL Server ) ، ثم نقوم بتخزينها في الذاكرة ، وذلك من خلال كائن يكون بمثابة مستودع للبيانات ويسمى DataSet ( مجموعة البيانات ) ، ولكي تتم هذه العملية يحتاج هذا الكائن إلى كائن أخر يسمى DataAdapter ( موفّق البيانات ) يكون بمثابة وسيط بين مجموعة البيانات "DataSet " ومصادر البيانات "Data Sources" ، حيث يقوم DataAdapter بعملية فتح الاتصال بقاعدة البيانات و استيراد وتصدير البيانات من و إلى مصدرها الأساسي ، وبعد تخزين البيانات في DataSet ، فإنها تصبح منفصلة عن مصدر البيانات ، لان الكائن DataAdapter يقوم بشكل تلقائي أيضاً بقطع الاتصال بقاعدة البيانات ، وهذا الانفصال والاستقلال هو السبب في تسمية هذه الطريقة بالاتصال المنفصل أو الوضع المنفصل ، وهو السر في تفوقه على الوضع المتصل ، لأنه يتغلب على جمع عيوبه ومشاكله .

ومن ذلك نستطيع أن نقول أن الكائنات الأساسية في الوضع المنفصل هي : Connection ، DataSet ، DataAdapter .

وهناك أيضاً كائنات أخرى ليست فرعية ولكنها خدمية إن صح التعبير ،على سبيل المثال "

كود PHP:
DataTable ، DataRow ، DataColumn ، DataRelation ، OleDbCommandBuilder ، BindingManagerBase ، CurrencyManager ، BindingSource " ، 
ويأتي دورها في الغالب بعد وصول البيانات ( الجداول ) القادمة من مصادر البيانات إلى DataSet ( مجموعة البيانات ) . وسنُناقش بعضها ( أو كلها إذا وجدنا الوقت الكافي لذلك ) وما يهمنا منها بإيجاز غير مخل إن شاء الله ..

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

1 - الكائن Connection :-
لقد تحدثنا عنه في الدروس السابقة بما فيه الكفاية .

2 – DataSet :-
يمكن تعرف مجموعة البيانات Dataset بأنها مستودع أو ذاكرة وسيطة لتخزين البيانات التي تم إحضارها من مصادر البيانات ، ويريد أن يستعملها التطبيق .

من كان قد برمج قواعد البيانات باستخدام الإصدار السابق من ADO في VisualBasic6 فهو يعرف تماماً الكائن Recordset حيث يعتبر نقطة التفاعل الرئيسية لبرنامج ما مع قاعدة البيانات ، ويعالج هذا الكائن السجلات في جدول واحد أو السجلات المختارة بواسطة استفسار ( جملة استعلام بنيوية ) واحد . بينما نجد أن الكائن DataSet في الإصدار الجديد من ADO.NET يمكنه تمثيل النتائج المتولدة عن عدة جداول و تتبع العلاقات بين هذه الجداول ، أو تمثيل النتائج المتولدة عن استفسارات عديدة . وبذلك نستطيع أن نقول أنه إذا كان Recordset يشكل جدول قاعدة بيانات ، فإن DataSet يشكل قاعدة بيانات كاملة تجلس في الذاكرة . ولعل ما في هذه النبذة ، ما يعطي القارئ تصور عام عن الكائن DataSet ، و يزيل الجدل حول Recordset و DataSet وأيهما أفضل .

وألان سون نتطرق لبعض خصائص DataSet :

* الخاصية Clear :
تزيل هذه الخاصية كل البيانات من جميع جداول DataSet ، بينما تبقي تعريفات الجداول وأي تقييدات معرفه من قبل DataSet ...

كود PHP:
MyDs.Clear 
فإذا أردنا إزالة الجداول والتقييدات ، نقوم بإعادة إنشاء DataSet كما في الكود التالي ..
كود PHP:
MyDs = New DataSet 
الخاصية HasChanges :
إن DataSet يتتبع فيما إذا كان هناك أي تغييرات قد أجريت على بياناته ، ويمكن استدعاؤها بكل بساطه من خلال الكود التالي ..

كود PHP:
MyDs.HasChanges 
وتعيد هذه الخاصية القيمة true إذا كانت البيانات قد حدثت إما لتغيير أو إضافة أو حذف ، فإذا حمل برنامج ما بشكل أولي بيانات إلى DataSet ، فإن البيانات لم تغيّر بعد وستعيد هذه الخاصية عندئذ القيمة False وعندما يُحَدِّث المستخدم أي بيانات للجداول فإن هذه الخاصية سوف تعيد القيمة true . وإذا قام المستخدم بحفظ بياناته المحدثة ، فإنها تعيد القيمة False من جديد ..
فلنتأمل هذا الكود ..

كود PHP:
   If MyDS.HasChanges True Then
      
' نقوم بكتابة أي إجراء في حالة إذا كان هناك أي تغييرات قد أجريت على الـ  DataSet .
   Else
     ' 
نقوم بكتابة أي إجراء في حالة إذا لم يكن هناك أي تغييرات قد أجريت على الـ DataSet .
End If 
ويمكن أن تأخذ هذه الخاصية وسيط اختياري يسمى DataRowState ، يشير إلى نوع التغييرات التي قد حدثت ، حيث يمكن استخدام هذه الطريقة لرؤية فيما إذا كانت هناك سجلات قد أضيفت ، أو عدلت ، أو حذفت ، أو لم يقع عليها أي تغيير ، وذلك من خلال القيم التي يحملها هذا الوسيط وهي على النحو التالي ..

- Added : ويشير إلى الصفوف التي أضيفت إلى الـ DataSet .
- Deleted : ويشير إلى الصفوف التي قد حذفت من الـ DataSet .
- Modified : ويشير إلى الصفوف التي قد غيرت قيم بياناتها من الـ DataSet .
- Unchanged : ويشير إلى أن الصفوف لم تتغير من الـ DataSet .
ولكي يتضح الشرح نتأمل هذا الكود ...

كود PHP:
If MyDataSet.HasChanges(DataRowState.AddedThen
      
' نقوم بكتابة أي إجراء في حالة إذا كان هناك صفوف جديدة قد أضيفت. 
ElseIf MyDataSet.HasChanges(DataRowState.Deleted) Then
      ' 
نقوم بكتابة أي إجراء في حالة إذا كان هناك صفوف قد حذفت 
ElseIf 
MyDataSet.HasChanges(DataRowState.ModifiedThen
      
' نقوم بكتابة أي إجراء في حالة إذا كان هناك صفوف قد تغيرت قيمها 
ElseIf MyDataSet.HasChanges(DataRowState.Unchanged) Then
      ' 
نقوم بكتابة أي إجراء في حالة إذا لم يحدث أي تغيير على الصفوف .
End If 
الخاصية AcceptChanges :
تقوم هذه الخاصية بإعادة وضع الـ DataSet الذي تم التعديل لبياناته ، ليشير إلى أن البيانات لم تعدل . جاعلاً الاستدعاءات المستقبلية للخاصية HasChanges تعيد القيمة False . إنه من الهام جداً إدراك أن AcceptChanges لا تقوم بالواقع بتحديث قاعدة البيانات ، إنها فقط تعيد وضع الـ DataSet المعدل . وبشكل نموذجي فإن أي برنامج سيقوم بتخزين أية تغييرات إلى قاعدة البيانات ، ومن ثم يستدعي AcceptChanges بعد ذلك مباشرة .
كود PHP:
كود تصدير البيانات المحدثة من مجموعة البيانات إلى مصدر البيانات باستخدام موفّق البيانات  
MyDs
.AcceptChanges 
الخاصية RejectChanges :
تقوم هذه الخاصية بإلغاء أية تغييرات قد أجريت على البيانات في الـ DataSet منذ تحميلها ، أو منذ أخر استدعاء لها ، بمعنى أنها تلغي أية أسطر مضافة حديثاً ، وتستعيد أسطراً حذفت أيضاً حديثاً ، وتعيد وضع الأسطر المعدلة إلى قيمتها السابقة ، كما أنها تقوم بإعادة وضع الـ DataSet الذي تم التعديل لبياناته ، ليشير إلى أن البيانات لم تعدل . جاعلاً الاستدعاءات المستقبلية للخاصية HasChanges تعيد القيمة False .
كودMyDs.RejectChanges

ملاحظة :
تقوم الخاصية AcceptChanges بإزالة المعلومات حول الحالة السابقة للبيانات ، وبالتالي لا يمكن استخدام RejectChanges لاستعادة آخر قيم للبيانات ، هذا يعني أن RejectChanges سيؤدي إلى استعادة البيانات بالحالة التي كانت عليها بعد آخر استدعاء للخاصية AcceptChanges .

الخاصية GetChanges :
تساعدنا هذه الخاصية في إنشاء كائن DataSet جديد بنفس بنية الكائن الأصلي ، ولكنه يحتوي فقط على سجلات تمثل التغييرات التي حدثت للبيانات ، وله أيضاً وسيط إختياري DataRowState ( الذي تحدثنا عنه في الخاصية HasChanges ) يخبر GetChanges فيما إذا يتوجب عليها إحضار السجلات التي أضيفت أو عدلت أو حذفت أو تركت دون تغيير . وبالإمكان جمع قيم DataRowState لاختيار أكثر من نوع واحد من التغييرات التي حدثت للبيانات داخل الكائن DataSet .
ولها استخدامات كثيرة منها :
1- قلنا سابقاً ، نحن في الوضع المنفصل نستخدم الكائن DataAdapter لإعادة تخزين التغييرات الموجودة في DataSet إلى مصدر قاعدة البيانات . وذلك يتم من خلال الخاصية Update التابعة للكائن DataAdapter الذي سوف نتحدث عنه فيما بعد ، ما يهمنا هنا هو أن هذه الخاصية تبحث خلال DataSet عن تغييرات وتخزنها واحداً تلو الآخر . ويكون تخزين التغييرات أسرع إذا جُمعت في مجموعات حسب نوعها ، وبكلمات أخرى فإن الخاصية Update ستعطي إنجازاً أفضل ، إذا حفظت كل التعديلات أولاً ، ثم بعد ذلك كل الإضافات وأخيراً كل المحذوفات .
2- أحياناً يحتاج برنامج ما تخزين تغييرات في ترتيب معين ، ليفي بمتطلبات التقييدات العلائقية لجداول قاعدة البيانات .

ولكي نفهم طريقة هذه الخاصية ، فلنتابع سوياً هذه الأمثلة ..

مثال 1 : ( إخبار المستخدم عن عدد السجلات الجديدة )
في هذا المثال نقوم بالتصريح عن كائن DataSet جديد ، ثم نختبر فيما إذا كان الكائن الأصلي يحتوي على أي تغييرات عليه ، وفي حالة وجود أي تغيير نستخدم الخاصية GetChanges لتأهيل الكائن الجديد بنفس بنية الكائن الأصلي ، ويحتوي فقط على السجلات التي أضيفت ، وقبل أن نخبر المستخدم عن عدد السجلات الجديدة نختبر الكائن الجديد لنتأكد من احتوائه على بيانات ، وفي حالة وجود بيانات نخبر المستخدم بذلك ..
كود PHP:
Dim ds_added As New DataSet
   
If MyDS.HasChanges Then
       ds_added 
MyDS.GetChanges(DataRowState.Added)
       If (
Not (ds_addedIs NothingThen
           MsgBox
(ds_added.Tables(0).Rows.Count " Records Added ")
       
End If
End If 
ويمكن قياس هذا المثال على باقي القيم (Deleted ، Modified ، Unchanged )

مثال 2 : (جمع قيم DataRowState لاختيار أكثر من نوع واحد من التغييرات التي حدثت للبيانات داخل الكائن DataSet )
في هذا المثال نقوم بالتصريح عن كائن DataSet جديد ، ثم نختبر فيما إذا كان الكائن الأصلي يحتوي على أي تغييرات عليه ، وفي حالة وجود أي تغيير نستخدم الخاصية GetChanges لتأهيل الكائن الجديد بنفس بنية الكائن الأصلي ، ويحتوي فقط على السجلات التي أضيفت أو حذفت ، وقبل أن نخبر المستخدم عن عدد السجلات الجديدة أو المحذوفة ، نختبر الكائن الجديد لنتأكد من احتوائه على بيانات ، وفي حالة وجود بيانات نخبر المستخدم بذلك ..
كود PHP:
   Dim ds_AddedOrDeleted As New DataSet
   
If MyDS.HasChanges Then
       ds_AddedOrDeleted 
MyDS.GetChanges(DataRowState.Added Or DataRowState.Deleted)
       If (
Not (ds_AddedOrDeletedIs NothingThen
           MsgBox
(ds_AddedOrDeleted.Tables(0).Rows.Count " Records Added or Deleted ")
       
End If
End If 
مثال 3 : ( تحديث التغييرات حسب نوعها ، لتخزين البيانات بشكل أسرع )

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

في هذا المثال نقوم بالتصريح عن كائنين DataSet جديدين ، وكائن أخر يسمى باني الأوامر CommandBuilder .

ملاحظة : الكائن CommandBuilder يقوم ببناء الأوامر الخاصة بتحديث البيانات من تعديل وإضافة وحذف ، والتي يحتاجها الكائن DataAdapter في عملية التحديث .

وخلال ذلك التصريح نقوم بربط كائن CommandBuilder بـالكائن DataAdapter ، ثم نقوم بإيقاف التحديث للبيانات الموجودة في الـ DataSet وقبول التحديثات الحالية من أجل حفظها ونقلها من الـ DataSet إلى مصدر البيانات ، ثم نختبر فيما إذا كان الكائن Dataset الأصلي يحتوي على أي تغييرات عليه ، وفي حالة وجود أي تغيير نستخدم الخاصية GetChanges لتأهيل الكائن الجديد ds_Changes بنفس بنية الكائن الأصلي ، و نستخدم أيضاً الخاصية GetChanges لتأهيل الكائن الجديد ds_subset بنفس بنية الكائن ds_Changes ، وجعله يحتوي فقط على السجلات التي عدلت ، وقبل حفظ البيانات ونقلها من الـ DataSet إلى مصدر البيانات باستخدام الخاصية Update التابعة للكائن MyDataAdapter ، نختبر الكائن الجديد ds_subset لنتأكد من احتوائه على بيانات ، وفي حالة وجود بيانات نقوم بعملية النقل . ثم نكرر الجزء الأخير من الشرح بالنسبة لكل من الإضافة والحذف ، وفي الأخير نستدعي الخاصية AcceptChanges لإعادة وضع الـ DataSet الذي تم التعديل لبياناته ، جاعلاً الاستدعاءات المستقبلية للخاصية HasChanges تعيد القيمة False..
كود PHP:
   Dim ds_Changes As New DataSet
   Dim ds_subset 
As New DataSet
   Dim MyCB 
As New OleDbCommandBuilder(MyDataAdapter)
   
Me.BindingContext(MyDS"Information").EndCurrentEdit()
   If 
MyDS.HasChanges Then
      ds_Changes 
MyDS.GetChanges
      ds_subset 
ds_Changes.GetChanges(DataRowState.Modified)
      If (
Not (ds_subsetIs NothingThen MyDataAdapter.Update(ds_subset.Tables(0))
      
ds_subset ds_Changes.GetChanges(DataRowState.Added)
      If (
Not (ds_subsetIs NothingThen MyDataAdapter.Update(ds_subset.Tables(0))
      
ds_subset ds_Changes.GetChanges(DataRowState.Deleted)
      If (
Not (ds_subsetIs NothingThen MyDataAdapter.Update(ds_subset.Tables(0))
      
MyDS.AcceptChanges()
End If 
الخاصية HasErrors :
نفرض أن مستخدماً أدخل القيمة " ADO " في حقل من النوع Integer عندئذ يمكن للبرنامج أن يُعلِّم هذا الحقل في هذا السجل بالذات برسالة خطأ . لاحقاً وقبل أن يقوم البرنامج بتحديث قاعدة البيانات ، فإنه يمكن استخدام خاصية HasErrors الخاصة بـ DataSet لتحديد فيما إذا كانت البيانات تملك أخطاء يتوجب على المستخدم إصلاحها .
ربما يرى البعض أنه من الأفضل أن يخبر البرنامج المستخدم عن وجود أخطاء في البيانات المدخلة مباشرة ، مثل استخدام الأداة ErrorProvider ، ولكن أحياناً يكون من المفيد تأجيل معالجة الأخطاء . كمثال : ربما كانت قيمة أحد الحقول تعتمد على قيمة حقل آخر لم تدخل بعد ، في هذه الحالة فإن البرنامج يجب عليه الانتظار حتى تدخل كلا القيمتين ، قبل أن يقرر فيما إذا كانت هناك مشكلة ما .
وتعيد هذه الخاصية القيمة true إذا كانت البيانات تملك أخطاء يتوجب على المستخدم إصلاحها ، وبالمقابل القيمة False إذا لم توجد أخطاء في البيانات .
مثال :
كود PHP:
If MyDataSet.HasErrors True Then
   
' أدخل الكود الخاص بتصحيح الخطأ
Else
   ' 
أدخل الكود الخاص بحفظ البيانات المدخلة
End 
If 
الخاصية Tables :
نصل من خلال هذه الخاصية إلى الجداول المخزنة في DataSet ومنها إلى الصفوف والأعمدة الموجودة في هذه الجداول ، بل و إلى القيم المخزنة في أي خلية من الخلايا الموجودة في الجدول .
ويتم تحديد اسم الجدول الذي نريد أن نتعامل معه بواسطة هذه الخاصية بطريقتين ، أولاهما هي أن نكتب اسم الجدول ( وهي الأفضل للمزيد من الوضوح ) كما في المثال التالي ..
كود PHP:
MyDS.Tables("Information"
والطريقة الثانية هي أن نرمز للجدول من خلال رقمه داخل الكائن DataSet علماً أن رقم أول جدول داخل الكائن DataSet هو الرقم 0 ، كما في المثال التالي ..
كود PHP:
MyDS.Tables(0
ويمكن أيضاً التحكم في صفوف الجدول المحدد من خلال الخاصية Rows التابعة له ، والخاصية Item التابعة لها ، وكل ذلك يتم بشكل مباشر بدون كائنات خدمية .
وسوف أقوم بطرح مجموعة من الأمثلة ، لعلها تعين على الاستيعاب بشكل أفضل ..

ملاحظة : ما سوف يتم شرحه في السطور التالية من باب العلم بالشيء ، وإلا فإن الكائنات الخدمية
(BindingManagerBase أو CurrencyManager أو BindingSource ) تغنينا عن ذلك وبشكل مختصر جداً وجميل .

لمعرفة عدد سجلات أحد الجداول نقوم بكتابة ما يلي ..
كود PHP:
MyDS.Tables("Information").Rows.Count 
لمعرفة القيمة المخزنة في الخلية الموجودة في الصف الأول والعمود الأول ، وعرضها في مربع رسالة ، نقوم بكتابة ما يلي ..
كود PHP:
MsgBox(MyDS.Tables("Information").Rows(0).Item(0)) 
كما نستطيع أعادة كتابة الكود السابق ، بحيث نحدد فيه عمود محدد ، بكتابة ما يلي ..
كود PHP:
MsgBox(MyDS.Tables("Information").Rows(0).Item("Name")) 
لتغير قيمة الخلية الموجودة في الصف الأول والعمود المسمى Name ، نقوم بكتابة ما يلي ..
كود PHP:
MyDS.Tables("Information").Rows(0).Item("Name")="Yaser" 
لحذف السجل ( الصف ) الأول من الجدول ، نقوم بكتابة ما يلي ..
كود PHP:
MyDS.Tables("Information").Rows(0).Delete() 
للتراجع عن التغيرات التي قمنا بها من تعديل وحذف ، نقوم بكتابة ما يلي ..
كود PHP:
MyDS.Tables("Information").Rows(0).RejectChanges() 
لإضافة سجل جديد ، نخزن البيانات التي نريدها في مصفوفة ، ونسندها للخاصية Add كما في الكود التالي ..
كود PHP:
  Dim MyData() As String = {"Yaser""32""Gizan"}
MyDS.Tables("Information").Rows.Add(MyData
ويمكن تطوير الكود السابق باستخدام الكائن DataRow ، وتأهيله بصف جديد في الجدول المحدد ، وإدخال القيم فيه من خلال الخاصية Item ، ثم نسند الكائن DataRow إلى للخاصية Add التابعة لصفوف الجدول ، كما في الكود التالي ..
كود PHP:
   Dim MyDR As DataRow MyDS.Tables("Information").NewRow
   MyDR
.Item("name") = "yaser mohamed"
   
MyDR.Item("age") = "32"
   
MyDR.Item("City") = "Gizan"
MyDS.Tables("Information").Rows.Add(mydr
سنكتفي بذلك القدر ، وننتقل إلى التنقل بين السجلات ..

لمعرفة رقم موقع السجل الحالي وعرضه في مربع رسالة ، نكتب ما يلي ..
كود PHP:
MsgBox(Me.BindingContext(MyDS"Information").Position
ولمعرفة عدد السجلات الموجودة في الجدول الحالي وعرضها في مربع رسالة ، نكتب ما يلي ..
كود PHP:
MsgBox(Me.BindingContext(MyDS"Information").Count
وللانتقال للسجل الأول في الجدول نكتب ما يلي ..
كود PHP:
Me.BindingContext(MyDS"Information").Position 
وللانتقال للسجل الأخير في الجدول نكتب ما يلي ..
كود PHP:
  Me.BindingContext(MyDS"Information").Position Me.BindingContext(MyDS"Information").Count -
وللانتقال للسجل التالي في الجدول نكتب ما يلي ..
كود PHP:
  Dim MyPosition As Integer Me.BindingContext(MyDS"Information").Position
Me
.BindingContext(MyDS"Information").Position MyPosition +
وللانتقال للسجل السابق في الجدول نكتب ما يلي ..
كود PHP:
   Dim MyPosition As Integer Me.BindingContext(MyDS"Information").Position
Me
.BindingContext(MyDS"Information").Position MyPosition -
** هنا ينتهي حديثنا اليوم ، فما أصبنا من صواب فمن الله وتوفيقه ، وما أصبنا من خطأ فمن أنفسنا والشيطان ، لذلك من وجد أي أخطاء فليصححها لنا مشكوراً ..
ولنأخذ قسطاً من الراحة ، لكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس ، علماً أن موضوع درسنا القادم إن شاء الله هو الكائن DataAdapter ..

((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))






آخر تعديل المحترف 1 يوم 04-02-2008 في 06:57 AM.

رد مع اقتباس
قديم 04-02-2008, 07:11 AM   رقم المشاركة : 6
معلومات العضو
 

إحصائية العضو






 

عبدالوهاب يحي أل يحي غير متواجد حالياً


افتراضي

بصرحة أخ محترف مبدع 100 * 100
متابع موضوعك من البداية واعمل تطبيق لكل الشرح
وبصرحة اشكرك واشكر كل القائمين على هذه المنتدى






التوقيع

اللهم انفعني بما علمتني وزدني خير منه

رد مع اقتباس
رد


أدوات الموضوع
طرق مشاهدة الموضوع

تعليمات المشاركة
لا تستطيع كتابة مواضيع
لا تستطيع كتابة ردود
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة


الساعة الآن 04:56 PM.

 
Powered by vBulletin® Version 3.6.8, Copyright ©2000 - 2008
SEO by vBSEO 3.1.0