الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
صفحة 1 من اصل 1 • شاطر
الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
بسم الله الرحمن الرحيم
الاخوة الاعضاء أهلا وسهلا بكم .....فى هذا الدرس إن شاء الله تعالى سنتعلم سويا كيفية الاتصال بقاعدة بيانات أكسس فى الفجوال بيسك دوت نت ....هذا الدرس بالكامل من شرح أ/ هانى الشايب مدير موقع شبكة أكواد البرمجة على هذا [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] .....فعندما قررت البدء فى شرح هذا الدرس وجدت أننى لن أستطيع أن أخرج هذا الدرس بالشكل الرائع الذى قام به أ/هانى الشايب ....واليكم نص الدرس :أن ما دعاني لبدء هذا الشرح هو التطور المستمر للبرمجة وصعوبة أيجاد شرح وافي لعملية الاتصال ومحاكاة قاعدة بيانات من حفظ واسترجاع وتحديث وبحث .. ألخ . فكل ما نجده هو الأمثله والمشاريع الشخصية الجاهزة وهي مفيدة ولكن لا يكون أثرها كالدرس المشروح فأغلبيتنا يفتقد لأقل معلومه وأسرعها وأن تكون سهلة الفهم لكي يستوعبـــــها المبتدء قبل المحترف كحالي عندما بدءت البرمجه ومن ثم الاحتراف وهذه الكلمة هي لتمييز قدرات الشخص على الابتكار والتفكيـر والأبداع وهي في النهاية تفـــــاوت للمستويات بين الافراد ولكنها ليست بدرجة الكمال لأن الكمال لله وحده سبحانه وتعالــــــــــــى
فالبرمجة بأعتقادي الشخصي بحر شاسع لا حدوده له لتنوعها .. فربما المبتدء يجد فيها ما يتوقف عنده المـــــحترف وهذا هو لب الموضوع
التعاون بأقل معلومة هو الاحتراف بحد ذاته
متطلبات المشروع[1] برنامج Visual Studio .NET
[2] معرفة مسبقة بلغة الفيجول بيسك دوت نت والتعامل مع نماذجه وأداوته
[3] قاعدة بيانات (وهنا سنبدأ مع الأكسس ثم سنحولها إلى قاعدة سيرفر وسنرى الاختلاف)
[4] عليك بكتابة الشيفرات الموجودة في الدرس لكي تخطىء وتعرف أين أخطأت
ملاحظة : اتمنى من الاخوة الاعضاء عند أدراجكم لمشاركاتكم أن تقتصر على الأسئلة والأستفسارات بعكس المدح والشكر .. فكل مانريده هو الأفادة والأستفادة وعدم أكثار الصفحات بدون فائدة .. ومن يريد أبدء أعجابه أو أنتقاده للموضع أن يراسلني برسالة على الخاص .
نبذه عن ADO.NETهي مجموعة من الفئات مشمولة في مجال الأسماء System.Data غرضها الوصول إلى مصادر البياناتData Sources والتي تمثل بيانات محفوظة تحت أنظمة قواعد بيانات متعددة الأنواع مما يعني قدرتك على الوصول إلى أي قاعدة بيانات مهما كانت الشركة المنتجة لها
(أ. تركي العسيري)
الأختلافات الجوهربة بين ADO.NET and ADO
** ADO **
-1 مصمة للعمل في بيئة متصلة بأستمرار مع قاعدة البيانات
-2 يستخدم الكائن RecordSet للأحتفاظ بمجموعة بيانات واحدة
-3 تحتوي على أنواع من المؤشرات Cursors المستخدمة لأغراض مختلفة ولكل مؤشر أمكانياته الخاصة
-4 تخزن البيانات في هيئتها الثنائية مما يصعب أرسالها عبر جدران الحماية . كما أنها غير مفيدة للأنظمة التي لا تدعم ADO
-5 تستهلك قدراً من موارد النظام بسبب اتصالها الدائم بقاعدة البيانات أثناء المعالجة
ADO.NET
-1 مصممة من الأساس للعمل في بيئة غير متصلة (ويمكنها العمل باتصال دائم مع قاعدة البيانات)
2- يستخدم الكائن DataSet للأحتفاظ بعدة مجموعات من البيانات
3- لا تستخدم المؤشرات لأنها تعمل في بيئة غير متصلة .
4- تخزن البيانات في هيئة XML العالمية . وهذه الهيئة مصممة لكي ترسل عبر جدران الحماية وعبر الشبكات دون مشاكل كما يمكن لأي تطبيق قراءة البيانات بهيئة XML بسهولة .
5- تعمل كنظام بيانات منفصل عن قاعدة البيانات فهي لا تتصل بقاعدة البيانات إلا عند الضرورة وبالتالي لن تستهلك مورد النظام الإ عند الضرورة
والأختلافان الأخيران رقم 4 - 5 هما جوهرة الاختلاف وأهمها
معماريةADO.NET :والمقصود هنا الخصائص المزوده والمساعدة في عملية الاتصال لقراءة وتكييف البيانات وهي
[1]- مجموعة البيانات DataSet
وهو الكائن المكافىء للكائن RecordSet ولكن مع الكثير من المزايا والتحسينات حيث يستطيع تخزين أكثر من جدول أو نتيجة أستعلام في نفس الوقت حيث يمثل كل واحد من هذه الجداول كائناً منفصلاً عن الآخر
[2]- مجموعة البيانات DataAdapter يمثل الجسر الذي يربط بين DataSet وقاعدة البيانات ويدعم أوامر Select - Update - Delete - Insert وبالتالي بإمكانه القيام بعمليات مختلفة على البيانتا كما أنه المسؤول عن تحميل كائنDataSet بالبيانات
000]مجموعة البيانات DataReader يستخدم هذا الكائن لقراءة البيانات فقط ويمكنه قراءة كميات ضخمه منها تلك التي لا يمكن تخزينها في الذاكرة مؤقتاً
[4]- مجموعة البيانات DataRelation يستخدم هذا الكائن لتمثيل العلاقات بين الجداول في قاعدة البيانات JOIN
0000]مجموعة البيانات Connection يعمل هذا الكائن بصورة مشابهة للكائن Connection في ADO وهو يمكننا من إنشاء اتصال مع قاعدة البيانات
[6]- مجموعة البيانات Command
يسمح هذا الكائن لكائن DataAdapter بتطبيق الأوامر على قاعدة البيانات ويمكنه أن يتضمن اربعة من هذه الأوامر
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
الدرس الثاني : عملية الاتصال بالقاعدة بأستخدام المعالج
_ لكى تتمكن من عملية الوصول إلى البيانات من خلال ADO.NET على نوع مصدر البيانات و الذى سنقوم بتحديدة من خلال المعالج عن طريق الخطوات التالية :
1_ نقوم بالنقر على Data Sources في الجزء السفلي من مستكشف الحلول في نسخة 2008 كما فى الصورة التالية :

إذا كان لديك VB NET 2010 أو عام 2012 ثم علامة التبويب مصدر بيانات على اليسار، أسفل مربع الأدوات (إذا لم تتمكن من رؤية علامة التبويب، انقر فوق View > Other Windows > Data Sources)

2_ بعد النقر على Data Sources سوف تشاهد شاشة الترحيب بكم في معالج تكوين مصدر البيانات، فقط حدد Database ثم انقر فوق التالي، كما فى الشاشة أدناه:

في الإصدار و 2010 و 2012 من VB NET، سترى هذه الشاشة تظهر كما يلى :

3_بعد تحديد Database والنقر على التالى ستظهر لك الشاشة التالية :

انقر فوق زر New Connection فى المربع الحوارى أعلاه ليظهر لك المربع التالى

4_ كما ترون فى المربع الحوارى السابق فان مصدر البيانات الافتراضى هو SQL Server database ....ولأننا نريد للاتصال إلى قاعدة بيانات Access سنقوم بتغير هذا المصدر و ذلك من خلال النقر على زر Change ليفتح لنا المربع التالى :

من المربع أعلاه سنقوم بتحديد Microsoft Access Database File ثم النقر على زر أوكية ليظهر لنا المربع الحوارى التالى :

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

5_ثم انقر فوق الزر موافق سوف تعاد لك معالج تكوين مصدر البيانات كما يلى :

6_انقر فوق التالي للانتقال إلى الخطوة التالية من المعالج كما يلى :

تأكد من أن هناك وضع علامة في المربع ل "Save the connection"، كما هو ظاهر أعلاه ثم انقر فوق التالي ليظهر لك المربع التالى:

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

ويمكنك النقر على السهم الصغير بجوار مصدر البيانات لتجد الجدوال و الحقول كما فى الشكل التالى :

8_ إضافة حقل الى النافذة .....لإضافة حقل إلى النموذج الخاص بك، انقر على أحد الحقول في القائمة. اضغط باستمرار على زر الماوس الأيسر، واسحب الحقل على النافذة التى تريدها كما يلى :


في الصورة أعلاه، يتم سحب الحقل FNAME على النموذج......و سوف تجد ايضا بعض الكائنات فى اسفل و شريط التنقل بين الحقول و السجلات فى الاعلى ....و لو قمت بتشغيل برنامجك ستجد أنه قد تم الاتصال بقاعدة البيانات و يمكنك بالفعل التنقل بين السجلات باستخدام شريط التنقل كما فى الشكل التالى :

9_ مربع النص هو العنصر الافتراضى الذى يظهر عند سحبك لاحد الحقول على النافذة ليتم عرض بيانات هذا الحقل فى هذا المربع .....لكن يمكنك تغير مربع النص بأحد الادوات الاخرى مثل listbox وذلك من خلال تحديد الحقل ثم من خلال السهم الصغير أختر نوع العنصر الذى تريده أن يظهر بدلا منه كما فى الشكل التالى :
_ لكى تتمكن من عملية الوصول إلى البيانات من خلال ADO.NET على نوع مصدر البيانات و الذى سنقوم بتحديدة من خلال المعالج عن طريق الخطوات التالية :
1_ نقوم بالنقر على Data Sources في الجزء السفلي من مستكشف الحلول في نسخة 2008 كما فى الصورة التالية :

إذا كان لديك VB NET 2010 أو عام 2012 ثم علامة التبويب مصدر بيانات على اليسار، أسفل مربع الأدوات (إذا لم تتمكن من رؤية علامة التبويب، انقر فوق View > Other Windows > Data Sources)

2_ بعد النقر على Data Sources سوف تشاهد شاشة الترحيب بكم في معالج تكوين مصدر البيانات، فقط حدد Database ثم انقر فوق التالي، كما فى الشاشة أدناه:

في الإصدار و 2010 و 2012 من VB NET، سترى هذه الشاشة تظهر كما يلى :

3_بعد تحديد Database والنقر على التالى ستظهر لك الشاشة التالية :

انقر فوق زر New Connection فى المربع الحوارى أعلاه ليظهر لك المربع التالى

4_ كما ترون فى المربع الحوارى السابق فان مصدر البيانات الافتراضى هو SQL Server database ....ولأننا نريد للاتصال إلى قاعدة بيانات Access سنقوم بتغير هذا المصدر و ذلك من خلال النقر على زر Change ليفتح لنا المربع التالى :

من المربع أعلاه سنقوم بتحديد Microsoft Access Database File ثم النقر على زر أوكية ليظهر لنا المربع الحوارى التالى :

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

5_ثم انقر فوق الزر موافق سوف تعاد لك معالج تكوين مصدر البيانات كما يلى :

6_انقر فوق التالي للانتقال إلى الخطوة التالية من المعالج كما يلى :

تأكد من أن هناك وضع علامة في المربع ل "Save the connection"، كما هو ظاهر أعلاه ثم انقر فوق التالي ليظهر لك المربع التالى:

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

ويمكنك النقر على السهم الصغير بجوار مصدر البيانات لتجد الجدوال و الحقول كما فى الشكل التالى :

8_ إضافة حقل الى النافذة .....لإضافة حقل إلى النموذج الخاص بك، انقر على أحد الحقول في القائمة. اضغط باستمرار على زر الماوس الأيسر، واسحب الحقل على النافذة التى تريدها كما يلى :


في الصورة أعلاه، يتم سحب الحقل FNAME على النموذج......و سوف تجد ايضا بعض الكائنات فى اسفل و شريط التنقل بين الحقول و السجلات فى الاعلى ....و لو قمت بتشغيل برنامجك ستجد أنه قد تم الاتصال بقاعدة البيانات و يمكنك بالفعل التنقل بين السجلات باستخدام شريط التنقل كما فى الشكل التالى :

9_ مربع النص هو العنصر الافتراضى الذى يظهر عند سحبك لاحد الحقول على النافذة ليتم عرض بيانات هذا الحقل فى هذا المربع .....لكن يمكنك تغير مربع النص بأحد الادوات الاخرى مثل listbox وذلك من خلال تحديد الحقل ثم من خلال السهم الصغير أختر نوع العنصر الذى تريده أن يظهر بدلا منه كما فى الشكل التالى :
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
الأتصال بقاعدة البيانات عن طريق الأكواد Connection
وهذه الطريقة هي ما أفضلها دائما .. وستجد المتعة في ذلك من خلال تتبعك
معنا لهذه الدروس وسوف يدور الكلام هنا حول الاتصال بقاعدة البيانات من
نوع اكسس Access وذلك لأن الاغلبية يتعامل معها فلنبدأ ...... .
قبل التعامل مع مصدر بيانات، عليك فتح اتصال معها وفي هذا القسم سنعرض الاساليب المتعددة للاتصال بمصادر البيانات.
تعريف كائن الاتصال
نص الاتصال بالقاعدة
سوف نقوم بتعريف متغير من نوع نص ووضع مسار الاتصال بقاعدة البيانات بداخله بهذه الطريقة
أو يمكنك كتابة التعريف بهذا الشكل ايضا
ملاحظة : بدلا من كتابة نص الاتصال كاملا في كل مرة تنوي انشاء كائن اتصال جديد قم بوضع نص الاتصال في متغير عام على مستوى المشروع والقصد ان المتغير يختصر عليك كتابة شفرة الاتصال بهذه الطريقة في كل مرة تريد بها انشاء كائن للأتصال بالقاعدة لتحديث بياناتها .
ولجعل المسار لمجلد القاعدة معروف تلقائيا كما في VB6 مثلاً والقصد هنا استخدام App.Path فقد تغييرت كلمة المسار التلقائي في VB.NET Application.StartupPath إلى وهناك أشكال عدة في استخراج المسارات في الفيجول نت سنذكرها لاحقاً أنشالله . وبهذه الكلمة ستكون شفرة الاتصال بهذه الطريقة:
أما بالنسبة لشفرة الاتصال بقاعدة بيانات من نوع سيرفر SQL Server وستكون بهذا الشكل وهي لا تختلف عن الاكسس سوى في عملية الاتصال حيث أنك ستتعامل مع ال Access كملف لقاعدة بيانات اما SQL Server فأنك تتعامل مع محرك قواعد بيانات
الآن سنأتي على فتح وإغلاق الاتصال بالقاعدة : بعد أن اسندنا نص الاتصال بالقاعدة للمتغير ConnString يمكننا الآن البدء بفتح الاتصال واغلاقه عن طريق هذه الجمل ...
ولمعرفة حالة الاتصال ان كنا متصلين بالقاعدة أم لا سنستخدم الحالة State التابعة لكائن الاتصال والتي سينتج عنها عند الاستفسار ما يلي أن كان الاتصال في الاوضاع التالية :
[1] Open الاتصال مفتوح
[2]Closed الاتصال مغلق
[3]Connecting جاري فتح الاتصال
[4]Executing يتم تنفيذ امر استعلام على الاتصال
[5] Fetching جاري الحصول على بيانات من سجلات مصدر البيانات
وستأتي شفرة التأكد من حالة الاتصال بهذه الطريقة
ويمكنك تغيير الوضع Open إلى إي من الأوضاع السابقة
سنأتي الأن على ذكر كائن الأوامر Command ولتذكير فقط بما سبق ذكره عن الكائن
[6]- مجموعة البيانات Commandيسمح هذا الكائن لكائن DataAdapter بتطبيق الأوامر على قاعدة البيانات
بعد تكوين الاتصال مع قاعد ة البيانات، ستأتي هذه الخطوة وهي ارسال جمل
الاستعلام وهنا بأمكانك حصر البيانات التي تريد استعراضها كما تشاء أن كانت
لديك فكرة في جمل الاستعلام SQL وستكون هذه الشفرة مع شفرة الاتصال وسيكون تعريفا بهذه الطريقة :
أما أذا كانت قواعد البيانات من نوع SQL Server .NET Data Provider فسيكون تعريف الاتصال من نوعSqlConnection و بهذا الشكل :
وستكون شفرة الربط مع اتصال بهذه الطريقة
وهذه الطريقة هي ما أفضلها دائما .. وستجد المتعة في ذلك من خلال تتبعك
معنا لهذه الدروس وسوف يدور الكلام هنا حول الاتصال بقاعدة البيانات من
نوع اكسس Access وذلك لأن الاغلبية يتعامل معها فلنبدأ ...... .
قبل التعامل مع مصدر بيانات، عليك فتح اتصال معها وفي هذا القسم سنعرض الاساليب المتعددة للاتصال بمصادر البيانات.
تعريف كائن الاتصال
- الكود:
Dim Con As New OleDbConnection()
- الكود:
Dim Con As New SqlConnection()
نص الاتصال بالقاعدة
سوف نقوم بتعريف متغير من نوع نص ووضع مسار الاتصال بقاعدة البيانات بداخله بهذه الطريقة
- الكود:
Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =c:\HnHnDB.mdb""
- الكود:
Dim con As OleDbConnection
con = New OleDbConnection(ConnString)
أو يمكنك كتابة التعريف بهذا الشكل ايضا
- الكود:
Dim con As New OleDbConnection(ConnString)
ملاحظة : بدلا من كتابة نص الاتصال كاملا في كل مرة تنوي انشاء كائن اتصال جديد قم بوضع نص الاتصال في متغير عام على مستوى المشروع والقصد ان المتغير يختصر عليك كتابة شفرة الاتصال بهذه الطريقة في كل مرة تريد بها انشاء كائن للأتصال بالقاعدة لتحديث بياناتها .
- الكود:
Dim con As New OleDbConnection "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =c:\HnHnDB.mdb"
ولجعل المسار لمجلد القاعدة معروف تلقائيا كما في VB6 مثلاً والقصد هنا استخدام App.Path فقد تغييرت كلمة المسار التلقائي في VB.NET Application.StartupPath إلى وهناك أشكال عدة في استخراج المسارات في الفيجول نت سنذكرها لاحقاً أنشالله . وبهذه الكلمة ستكون شفرة الاتصال بهذه الطريقة:
- الكود:
Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" & Application.StartupPath & "\HnHnDB.mdb"
أما بالنسبة لشفرة الاتصال بقاعدة بيانات من نوع سيرفر SQL Server وستكون بهذا الشكل وهي لا تختلف عن الاكسس سوى في عملية الاتصال حيث أنك ستتعامل مع ال Access كملف لقاعدة بيانات اما SQL Server فأنك تتعامل مع محرك قواعد بيانات
- الكود:
Dim SQLCon As New SqlConnection() SQLCon.ConnectionString = "Data Source=DEV4ARABS_SERVER;" _
& "User ID= HnHn; Password= _ ";admin
& "Initial Catalog= "القـــاعدة
الآن سنأتي على فتح وإغلاق الاتصال بالقاعدة : بعد أن اسندنا نص الاتصال بالقاعدة للمتغير ConnString يمكننا الآن البدء بفتح الاتصال واغلاقه عن طريق هذه الجمل ...
- الكود:
con.Open () لفتح الاتصال
con.Close () لأغلاق الاتصال
ولمعرفة حالة الاتصال ان كنا متصلين بالقاعدة أم لا سنستخدم الحالة State التابعة لكائن الاتصال والتي سينتج عنها عند الاستفسار ما يلي أن كان الاتصال في الاوضاع التالية :
[1] Open الاتصال مفتوح
[2]Closed الاتصال مغلق
[3]Connecting جاري فتح الاتصال
[4]Executing يتم تنفيذ امر استعلام على الاتصال
[5] Fetching جاري الحصول على بيانات من سجلات مصدر البيانات
وستأتي شفرة التأكد من حالة الاتصال بهذه الطريقة
- الكود:
If (Con.State And ConnectionState.Open) <> 0 Then
'HnHn التعرف إلى حالة الاتصال
MsgBox("تم فتح الاتصال بنجاح")
Else
MsgBox("تم اغلاق الاتصال ")
End If
ويمكنك تغيير الوضع Open إلى إي من الأوضاع السابقة
سنأتي الأن على ذكر كائن الأوامر Command ولتذكير فقط بما سبق ذكره عن الكائن
[6]- مجموعة البيانات Commandيسمح هذا الكائن لكائن DataAdapter بتطبيق الأوامر على قاعدة البيانات
بعد تكوين الاتصال مع قاعد ة البيانات، ستأتي هذه الخطوة وهي ارسال جمل
الاستعلام وهنا بأمكانك حصر البيانات التي تريد استعراضها كما تشاء أن كانت
لديك فكرة في جمل الاستعلام SQL وستكون هذه الشفرة مع شفرة الاتصال وسيكون تعريفا بهذه الطريقة :
- الكود:
Dim cmd As New OleDbCommand()
أما أذا كانت قواعد البيانات من نوع SQL Server .NET Data Provider فسيكون تعريف الاتصال من نوعSqlConnection و بهذا الشكل :
- الكود:
Dim cmd As As New SqlCommand()
وستكون شفرة الربط مع اتصال بهذه الطريقة
- الكود:
'HnHn شفرة الاتصال بالقاعدة بشكل تام
Dim Con As New OleDbConnection(ConnString)
Dim cmd As New OleDbCommand()
Con.Open()
cmd.Connection = Con
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
تابع لعملية الاتصال (فتح الجداول والتعامل معها )

سنحتاج هنا إلى عنصرين رئيسيين لتكملة عملية التعامل مع البيانات وهما ...
[1] - OleDbConnection
[2] - DataSet
وهذا هو تعريفهما مع التعاريف السابقة الموضوعه في حدث Public Class Form1
وستأتي بشكل هذا :
وهكذا نكون كونا المجموعة الأساسية للتعامل مع البيانات بشكل تام وسنبدأ الآن بالاتصال بأحدى جداول القاعدة
[ملاحظة:]
ان كائن الاوامر OleDbCommand لا يصل إلى
مصدر البيانات بشكل مباشر وانما يعتمد على كائن الاتصال والذي بدوره يصل
إلى مصدر بيانات كما في هذه الشفرة والمذكورة لديك في المثال المرفق سابقا .
وللأستفادة من كائن الأمر علينا بناء جمل ة أستعلام مع مراعاة نوعها أن كانت جملة استعلامية تقليدية أو جملة تنفيذية؟ وللمعلومية .... أن الجمل الاستعلامية هي التي لا تؤثر على سجلات قاعدة البيانات وانما تقوم بقراءة محتوياتها ونستخدم لها أمر SELECT
أما الجمل الاستعلامية هي تلك الجمل التي تحدث تغييرا في سجلات جداول القاعدة بشكل التالي
.DELETE أو ،INSERT INTO ،UPDATE
وغالبا ما يستخدم مع الجمل التنفيذية أمر ()ExecuteNonQuery وذلك كنوع من الحصر لعدد السجلات التي تأثرت بالعملية ومثال ذلك العملية التالية ..
الأن سنأتي على عملية الاتصال بجدول البيانات وسحبها منه بشكل التالي
[1] - سنقوم بتعريف متغيير لوضع جملة الاستعلام بداخله كما يلي
لم يتبق الآن سوى أظهار البيانات في الحقول المخصصة لها وستأتي الطريقة بشكل التالي :
TextBox1.Text : الحقل الذي سيرتبط مع الحقل في الجدول
rs.Tables("HnHnEmp"). : اسم الجدول المدرج منه اسم الحقل المرتبط بالتيكس بوكس
Rows(0). : تمثل الصف الخاص بالحقل المرتبط وعند تغيير الرقم الذي بداخله يتم الانتقال لسجل التالي والعكس
Item(0). : تمثل عنصر الوصول إلى الفئات المحضونة من الكائن الرئيسي DataSet
وھي خاصية افتراضية للكائن DataRow لذا يمكنك تجاھلھا ان اردت .
وهكذا مع بقية الحقول بالشكل التالي وفق المثال المرفق ....
عملية التنقل بين السجلات :
في بيئة النت اختلف الأمر واصبحت عملية التنقل بهذا الشكل للسجل التالي
وهذا بشكل عام ولكن في مثالنا سيتم عمل التنقل بين السجلات بالطريقة التالية :
[1] - سنقوم بوضع متغيير على مستوى الفوم وسيكون من نوع رقم لتخزين قيمة او رقم السجل بداخله كما يلي
وسيكون الأجراء بشكل هذا :
[3] - سنقوم الآن بتكوين عملية التنقل للسجلات بشكل التالي
السجل التالي
السجل السابق
السجل الأول
السجل الأخير :
ولتنقل بأكثر أمان سنضع بعض الشروط لتحقق من السجل أن كان في الأول أو في الأخير كما يلي :
الانتقال لسجل التالي
الانتقال لسجل السابق

وفي الختام هناك مثال مرفق لتوضيح كل ما تم ذكره في عملية الاتصال

سنحتاج هنا إلى عنصرين رئيسيين لتكملة عملية التعامل مع البيانات وهما ...
[1] - OleDbConnection
[2] - DataSet
وهذا هو تعريفهما مع التعاريف السابقة الموضوعه في حدث Public Class Form1
وستأتي بشكل هذا :
- الكود:
Dim Con As New OleDb.OleDbConnection() REM HnHn : "تعريف كائن الاتصال "
Dim cmd As New OleDbCommand() REM HnHn : " تعريف كائن أمر لتمرير الاستعلام ثم الاتصال "
Dim Dp As OleDb.OleDbDataAdapter REM HnHn : " تعريف كائن تدفق البيانات بمعنى المصدر أو المزود "
Dim rs As New DataSet() REM HnHn : "تعريف كائن التعامل مع البيانات في الذاكرة "
'Dim ConnString As String REM HnHn : "تعريف متغير لتخزين مسار القاعدة "
وهكذا نكون كونا المجموعة الأساسية للتعامل مع البيانات بشكل تام وسنبدأ الآن بالاتصال بأحدى جداول القاعدة
[ملاحظة:]
ان كائن الاوامر OleDbCommand لا يصل إلى
مصدر البيانات بشكل مباشر وانما يعتمد على كائن الاتصال والذي بدوره يصل
إلى مصدر بيانات كما في هذه الشفرة والمذكورة لديك في المثال المرفق سابقا .
- الكود:
con.Open()
cmd.Connection = con
con.Close()
وللأستفادة من كائن الأمر علينا بناء جمل ة أستعلام مع مراعاة نوعها أن كانت جملة استعلامية تقليدية أو جملة تنفيذية؟ وللمعلومية .... أن الجمل الاستعلامية هي التي لا تؤثر على سجلات قاعدة البيانات وانما تقوم بقراءة محتوياتها ونستخدم لها أمر SELECT
أما الجمل الاستعلامية هي تلك الجمل التي تحدث تغييرا في سجلات جداول القاعدة بشكل التالي
.DELETE أو ،INSERT INTO ،UPDATE
وغالبا ما يستخدم مع الجمل التنفيذية أمر ()ExecuteNonQuery وذلك كنوع من الحصر لعدد السجلات التي تأثرت بالعملية ومثال ذلك العملية التالية ..
- الكود:
Dim SQL As String = "UPDATE Emp SET Slary = 5000 WHERE NoEmp = 10001 "
Dim cmd As New OleDbCommand(SQL, con)
cmd.ExecuteNonQuery()
الأن سنأتي على عملية الاتصال بجدول البيانات وسحبها منه بشكل التالي
[1] - سنقوم بتعريف متغيير لوضع جملة الاستعلام بداخله كما يلي
- الكود:
Dim SQL As String = "SELECT * FROM HnHnEmp"
- الكود:
Dp = New OleDb.OleDbDataAdapter(SQL, Con
- الكود:
Dp.Fill(rs, "HnHnEmp")
- الكود:
Con.ConnectionString = ConnString REM HnHn : "الاتصال بمسار القاعدة"
Con.Open() REM HnHn : فتح الاتصال
SQL = "SELECT * FROM HnHnEmp" REM HnHn : "وضع
Dp = New OleDb.OleDbDataAdapter(SQL, Con) REM HnHn : "تدفق البيانات مع الاتصال في المتحول"
Dp.Fill(rs, "HnHnEmp") REM HnHn : "التعامل مع سجلات الجدول في الدات سيت"
Con.Close()
لم يتبق الآن سوى أظهار البيانات في الحقول المخصصة لها وستأتي الطريقة بشكل التالي :
- الكود:
TextBox1.Text = rs.Tables("HnHnEmp").Rows(0).Item(0)
TextBox1.Text : الحقل الذي سيرتبط مع الحقل في الجدول
rs.Tables("HnHnEmp"). : اسم الجدول المدرج منه اسم الحقل المرتبط بالتيكس بوكس
Rows(0). : تمثل الصف الخاص بالحقل المرتبط وعند تغيير الرقم الذي بداخله يتم الانتقال لسجل التالي والعكس
Item(0). : تمثل عنصر الوصول إلى الفئات المحضونة من الكائن الرئيسي DataSet
وھي خاصية افتراضية للكائن DataRow لذا يمكنك تجاھلھا ان اردت .
وهكذا مع بقية الحقول بالشكل التالي وفق المثال المرفق ....
- الكود:
REM HnHn : اظهار بيانات الجدولفي الحقول المخصصة
TextBox1.Text = rs.Tables("HnHnEmp").Rows(0).Item(0)
TextBox2.Text = rs.Tables("HnHnEmp").Rows(0).Item(1)
TextBox3.Text = rs.Tables("HnHnEmp").Rows(0).Item(2)
TextBox4.Text = rs.Tables("HnHnEmp").Rows(0).Item(3)
TextBox5.Text = rs.Tables("HnHnEmp").Rows(0).Item(4)
TextBox6.Text = rs.Tables("HnHnEmp").Rows(0).Item(5)
TextBox7.Text = rs.Tables("HnHnEmp").Rows(0).Item(6)
عملية التنقل بين السجلات :
في بيئة النت اختلف الأمر واصبحت عملية التنقل بهذا الشكل للسجل التالي
- الكود:
Me.BindingContext(rs.Tables("HnHnEmp")).Position += 1
- الكود:
Me.BindingContext(rs.Tables("HnHnEmp")).Position - = 1
- الكود:
Me.BindingContext(rs.Tables("HnHnEmp")).Position = 0
- الكود:
Me.BindingContext(rs.Tables("HnHnEmp")).Position = Me.BindingContext(rs.Tables("HnHnEmp")).Count - 1
وهذا بشكل عام ولكن في مثالنا سيتم عمل التنقل بين السجلات بالطريقة التالية :
[1] - سنقوم بوضع متغيير على مستوى الفوم وسيكون من نوع رقم لتخزين قيمة او رقم السجل بداخله كما يلي
- الكود:
Dim Rec As Integer
- الكود:
Rows(Rec)
وسيكون الأجراء بشكل هذا :
- الكود:
Private Sub ViewRecord()
REM HnHn : اظهار بيانات الجدولفي الحقول المخصصة
TextBox1.Text = rs.Tables("HnHnEmp").Rows(Rec).Item(0)
TextBox2.Text = rs.Tables("HnHnEmp").Rows(Rec).Item(1)
TextBox3.Text = rs.Tables("HnHnEmp").Rows(Rec).Item(2)
TextBox4.Text = rs.Tables("HnHnEmp").Rows(Rec).Item(3)
TextBox5.Text = rs.Tables("HnHnEmp").Rows(Rec).Item(4)
TextBox6.Text = rs.Tables("HnHnEmp").Rows(Rec).Item(5)
TextBox7.Text = rs.Tables("HnHnEmp").Rows(Rec).Item(6)
'HnHn : Total Record
Label9.Text = Rec & Space(2) & "OF" & Space(2) & rs.Tables("HnHnEmp").Rows.Count
End Sub
[3] - سنقوم الآن بتكوين عملية التنقل للسجلات بشكل التالي
السجل التالي
- الكود:
Private Sub ButtonNavNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNavNext.Click
REM HnHn : Next
Rec = Rec + 1
Call ViewRecord()
End Sub
السجل السابق
- الكود:
Private Sub ButtonNavPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNavPrevious.Click
REM HnHn : Previous
Rec = Rec - 1
Call ViewRecord()
End Sub
السجل الأول
- الكود:
Private Sub ButtonNavFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNavFirst.Click
REM HnHn : First
Rec = 0
Call ViewRecord()
End Sub
السجل الأخير :
- الكود:
Private Sub ButtonNavLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNavLast.Click
REM HnHn : Last
Rec = rs.Tables("HnHnEmp").Rows.Count - 1
Call ViewRecord()
End Sub
ولتنقل بأكثر أمان سنضع بعض الشروط لتحقق من السجل أن كان في الأول أو في الأخير كما يلي :
الانتقال لسجل التالي
- الكود:
Private Sub ButtonNavNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNavNext.Click
REM HnHn : Next
Rec = Rec + 1
'HnHn : التحقق من المتغيير اذا كان اكبر من مجموع عدد السجلات الكلي واعادة تخزين اخر قيمة
If Rec > rs.Tables("HnHnEmp").Rows.Count - 1 Then
MsgBox("لا توجد سجلات للأنتقال إليها")
Rec = rs.Tables("HnHnEmp").Rows.Count - 1
Exit Sub
Else
Call ViewRecord()
End If
End Sub
الانتقال لسجل السابق
- الكود:
Private Sub ButtonNavPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNavPrevious.Click
REM HnHn : Previous
Rec = Rec - 1
'HnHn : التحقق من المتغيير اذا كان اقل من الصفر واعادة تخزين اخر قيمة
If Rec < 0 Then
MsgBox("لا توجد سجلات للأنتقال إليها")
Rec = 0
Exit Sub
Else
Call ViewRecord()
End If
End Sub

وفي الختام هناك مثال مرفق لتوضيح كل ما تم ذكره في عملية الاتصال
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
عملية الأضافة والتحديث
الأضافة
سأتحدث هنا بطريقتين لأتمام عملية الاضافة وهما
[1] استعمال خاصية DataRow
[2] استعمال جملة استعلام INSERT INTO
---
DataRow حيث انها تمثل سجل كامل من سجلات الجدول ولن نستطيع التعامل معها بإنشاء كائن باستخدامNew من الفئة DataRow بمعنى ان تعريف المتغير بهذه الطريقة الخاطئة لن يفيد في عملية التعامل مع الفئة
- الكود:
Dim dRow As New DataRow
وأنما يتم ذلك بطريقتين :
[1] - بتعريف سطر جديد NewRaw()
[2] - تعريف مصفوفة من النوع Object
ولن اشرح سوى طريقتين كما ذكرت سابقا وهما الأكثر استخداما في اعتقادي وايضا لكي لا تتشعب الامور بتفاصيل اكثر حيث اني احاول ان اركز على الامور الاكثر فائدة وتدول وكلن له طريقته ......اذا سنشرح
الطريقة الأولى باستخدام NewRaw() التابعة للفئة DataRow
- الكود:
Dim dRow As DataRow = NameTabel.NewRow()
- الكود:
REM : HnHn كائن للإضافة سطر جديد لمجموعة البيانات
Dim dRow As DataRow
REM : HnHn اضافة سطر جديد في الجدول لتخزين البيانات فيه
dRow = rs.Tables("HnHnEmp").NewRow()
REM : HnHn : عملية نقل البيانات من الحقول إلى حقول الجدول
'أما عن طريق تحديد اسماء الحقول التي في الجدول إو عن طريق الفهرسة
REM : HnHn : dRow.Item("LastName") = TextBox2.Text
REM : HnHn : OR Index
dRow.Item(1) = TextBox2.Text
dRow.Item(2) = TextBox3.Text
dRow.Item(3) = TextBox4.Text
dRow.Item(4) = TextBox5.Text
dRow.Item(5) = TextBox6.Text
dRow.Item(6) = TextBox7.Text
الطريقةالثانية باستخدام INSERT INTO
جمل ال SQL هي احدى طرق عملية الاضافة وستكون شفرة الاضافة مسنودة إلى متغير من نوع كوماند OleDbCommand
وقد قلنا سابقا أن هذه الفئة تؤدي مهمة تطبيق الاوامر على القاعدة وها نحن
نستخدمها الآن في تطبيق جملة SQL من آجل عملية الأضافة حيث سنحتاج منها
العنصر CommandText وستكون الشفرة على سبيل المثال كما يلي ..
- الكود:
'Rem HnHn : تعريف متغير واسناده إلى كوماند ليقوم بعملية الحفظ لجملة الاضافة
Dim SavInto As New OleDb.OleDbCommand
REM HnHn : INSERTجملة الاضافة بـ
SavInto.CommandText = "INSERT INTO HnHnEmp (NameField) values ('" & TextBox1 & "') "
حيث NameField = سنكتب بدلا عنه اسماء الحقول الموجودة في الجدول وتفصل بينهما الفاصلة (,)وسنكتب نظيرها من الحقول اللي على الفورم بنفس التسلسل TextBox2 , TextBox1 وهكذا ...مع مراعاة علامات التنصيص ' أذا كان الحقل في الجدول من نوع نص وبدون علامات تنصيص أذا كان نوع الحقل رقم وعلامة # اذا كان نوع الحقل تاريخ وبناء على المثال المرفق لديكم سنكتب الشفرة كما يلي ...
- الكود:
'Rem HnHn : تعريف متغير واسناده إلى كوماند ليقوم بعملية الحفظ لجملة الاضافة
Dim SavInto As New OleDb.OleDbCommand
REM HnHn : INSERTجملة الاضافة بـ
SavInto.CommandText = "INSERT INTO HnHnEmp (LastName,FirstName,BirthDate,Address,Mobail,Notes) values ('" & TextBox2.Text & "','" & TextBox3.Text & "',#" & TextBox4.Text & "#,'" & TextBox5.Text & "'," & TextBox6.Text & ",'" & TextBox7.Text & "') "
تحديث البيانات
وهكذا عرضنا ثلاثة طرق لعملية الاضافة والموضوع لم ينتهي بعد حيث لابد من
بعد عملية الاضافة تأتي عملية تحديث البيانات وهذا ما سنشرحه الآن مع كل
طريقة من الطرق السابقة كيف سيتم تحديث البيانات فيها وسنبدأ بــــــ
تحديث بيانات الطريقة الأولى : NewRaw() الخاصة بالفئة DataRow
وستأتي عملية تحديث البيانات هنا بتعريف متغير من نوع الفئة DbCommandBuilder الخاص بالعمليات التي تحدث على السجلات من جمل الاستعلام SQL ثم يتم اسناد الكائن للمحول DataAdapter
ومن ثم فتح الجدول وأضافة سجل فيه مدرج في حقوله البيانات المسنده له ومن
ثم اسناد السجل بحقوله للمحول في عملية تحديث للبيانات وتأتي الشفرة
النهائية في هذه المرحلة من عملية الاضافة بهذه الطريقة كما يلي ...
- الكود:
Dim CmdB As New OleDb.OleDbCommandBuilder(Dp)
'------------------------
REM : HnHn كائن للإضافة سطر جديد لمجموعة البيانات
Dim dRow As DataRow
REM : HnHn اضافة سطر جديد في الجدول لتخزين البيانات فيه
dRow = rs.Tables("HnHnEmp").NewRow()
REM : HnHn : عملية نقل البيانات من الحقول إلى حقول الجدول
'أما عن طريق تحديد اسماء الحقول التي في الجدول إو عن طريق الفهرسة
REM : HnHn : dRow.Item("LastName") = TextBox2.Text
REM : HnHn : OR Index
dRow.Item(1) = TextBox2.Text
dRow.Item(2) = TextBox3.Text
dRow.Item(3) = TextBox4.Text
dRow.Item(4) = TextBox5.Text
dRow.Item(5) = TextBox6.Text
dRow.Item(6) = TextBox7.Text
REM HnHn : اضافة السجل للجدول
rs.Tables("HnHnEmp").Rows.Add(dRow)
REM HnHn : عملية التحديث في قاعدة البيانات
Dp.Update(rs, "HnHnEmp")
MsgBox("تمت عملية الاضافة والحفظ في قاعدة البيانات بنجاح")
تحديث بيانات الطريقة الثانية : INSERT INTO ...وفي هذه المرحلة تتم عملية تحديث البيانات بالخطوات التالية
[1] - تعريف المتغير من نوع أمر [OleDbCommand]
[2] - تحديد مسار الاتصال واسناده للمتغير
[3] - تحديد نوع الامر وسيكون من نوع نص .. لأننا نحن من سيقوم بكتابة الاستعلام يدويا
[4] - كتابة جملة الاستعلام لأضافة الحقول للجدول
[5] - فتح الاتصال لأتمام العملية النهائية
[6] - حصر السجلات التي ستتأثر بعملية الأضافة
[7] - اغلاق الاتصال
والشفرة ستكون كالتالي ....
- الكود:
REM HnHn : تعريف متغير واسناده إلى كوماند ليقوم بعملية الحفظ لجملة الاضافة
Dim SavInto As New OleDb.OleDbCommand
REM HnHn : تحديد مسار الاتصال للمتغير
SavInto.Connection = Con
REM HnHn : تحديد نوع الأمر وسيكون من نوع نص لأننا سنقوم بكتابة الاستعلام يدوي
SavInto.CommandType = CommandType.Text
REM HnHn : INSERTجملة الاضافة بـ
SavInto.CommandText = "INSERT INTO HnHnEmp(LastName,FirstName,BirthDate,Address,Mobail,Notes) values ('" & TextBox2.Text & "','" & TextBox3.Text & "',#" & TextBox4.Text & "#,'" & TextBox5.Text & "'," & TextBox6.Text & ",'" & TextBox7.Text & "') "
REM HnHn : فتح الاتصال لعملية الاضافة
Con.Open()
REM HnHn : لحصر عدد السجلات التي تأثرت بعملية الاضافة
SavInto.ExecuteNonQuery()
REM HnHn : اغلاق الاتصال
Con.Close()
MsgBox("تمت عملية الاضافة والحفظ في قاعدة البيانات بنجاح")
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
جزالك الله خيرا اخى احمد
VB.NET- المراقبين
- تاريخ التسجيل : 18/02/2011
المساهمات : 121
النقاط : 189
التقيم : 6
الدولة :
الجنس :
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
جزاك الله خير درس رائ ومفيد
أيمن الإبراهيم- ........
- تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 398
التقيم : 1
الدولة :
الجنس :
LAHROUCHI MOHA- .
- تاريخ التسجيل : 21/03/2017
المساهمات : 1
النقاط : 1
التقيم : 0
الدولة :
الجنس :
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
السلام عليكم
أود من حضراتكم إرشادى إلى مكان بقية هذه المقالة الرائعة
أفضل ما وجدت من شروح لأوامر ado
أود من حضراتكم إرشادى إلى مكان بقية هذه المقالة الرائعة
أفضل ما وجدت من شروح لأوامر ado
kemas- .
- تاريخ التسجيل : 07/04/2018
المساهمات : 1
النقاط : 1
التقيم : 0
الدولة :
الجنس :
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
جزاكم الله خير استاذنا
بنت البلد- .....
- تاريخ التسجيل : 18/02/2011
المساهمات : 85
النقاط : 160
التقيم : 11
الجنس :
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
لك الشكر والتحــية
بعد تطبيقي للخطوات أعــلاهـ تظهر رسالة خطأ (التحويل من النوع 'DBNull' إلى النوع 'String' غير صالح.) عند عملية التنقل بين السجلات علماً بانها (9) سجل بالقاعدة.
بعد تطبيقي للخطوات أعــلاهـ تظهر رسالة خطأ (التحويل من النوع 'DBNull' إلى النوع 'String' غير صالح.) عند عملية التنقل بين السجلات علماً بانها (9) سجل بالقاعدة.
عرفات007- .
- تاريخ التسجيل : 21/10/2021
المساهمات : 5
النقاط : 7
التقيم : 0
الدولة :
الجنس :
رد: الاتصال و التعامل مع قاعدة بيانات أكسس فى بيئة vb.net بواسطة تقنية ADO.NET
جزاكم الله خير استاذنا
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
شركة تسليك مجاري بالرياض
شركة عزل اسطح بالرياض
شركة عزل فوم بالرياض
شركة رش مبيدات بالرياض
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
| |
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى
» شركة تنظيف مسابح بالرياض
» "بروتين بعد التكميم فوائد البروتين بعد التكميم بروتين بودر بعد التكميم"
» اشهر نسخ واتساب بلس 2023 whatsapp plus
» متجر مجوهرات دير: إشراقة الذهب الخالص
» صراف صينى مقاس57*40
» فلاي تورز: اكتشف عالمًا من السفر والسياحة المثيرة
» متجر yallaa kids : مصدر الإبداع والتعلم للأطفال
» افضل تمويل
» "اقوي عروض المساج "