• 1
yaseralshikh

درس في ADO.NET من الصفر إلى الإحتراف .

سؤال

بسم الله الرحمن الرحيم

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

=============

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

=============

اليوم أقدم لأخواني درس يتناول التعامل مع قواعد البيانات باستخدام 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 : وهو عبارة عن اسم المستخدم وكلمة المرور لقاعدة البيانات في حالة وجود قيود أمنية عليها .

ولعل المثالين التاليين تجعل الصورة واضحة جداً :

مثال 1 :

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

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\ MymdbFile.mdb;User ID=Admin;Jet OLEDB:Database Password=You'rePassword;

مثال 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 .

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

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

196 إجابة على هذا السؤال .

  • 0

السلام عليكم ورحمة الله وبركاته:

الله يعطيك العافية أخ ياسر والله شي حلو ورائع، أنا بصراحة استفدت كثيرا منك والحمد لله، لأني لم أكن أعلم شيئا فيها، رغم إختلاف لغات البرمجة التي أتعامل أنا أو أنت بها.

أرجو أن تكمل إذا لم يكن لديك مانع، وإذا كان لديك الوقت الكافي، إن شاء الله، الله بوفقك وبوفقنا جميعا إلى ما يحبه ويرضاه.

والسلام عليكم... أخوكم في الله.

تم تعديل بواسطه Executioner
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزيت الفردوس الأعلى

نتمنى جمع الدرس في كتاب واحد يمكن تحميله لتكون الفائدة أعظم

شكرا لكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
بعد اذن اخونا ياسر الشيخ الدروس كلها مجمعة في ملف وورد لتعم الفائدة

اشكر الجميع على مشاعرهم الجميلة ، و شكر خاص لأخي 'محمد محمود يوسف' على تجميع الدروس ..

:wub:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته:

عندي استفسارات حول الكائن SqlDataAdapter:

أ) بالنسبة للكائن SqlDataAdapter من طرق تعريفه:

الأولى:

كود

SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.InsertCommand = new SqlCommand();
sqlDataAdapter.InsertCommand.CommandType = CommandType.Text;
sqlDataAdapter.InsertCommand.CommandText = 
"insert into emp (First_Name, Last_Name, Empno) values ('AAAAA','BBBBB',11111111);";
sqlDataAdapter.InsertCommand.Connection = new SqlConnection("... etc");[/color]

[color="#006400"]

الثانية:

كود

SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("insert into emp (First_Name, Last_Name, Empno) 
values ('AAAAA','BBBBB',11111111);", new SqlConnection("... etc"));[/color]

لا يوجد لدي مشكلة على الطريقة، وإنما القصة بأن هناك من قال لي أنني أستطيع بكلاهما أن أقوم بعملية إقحام، مع العلم أن الطريقة

الثانية أعطيناها الأمر في تابع البناء، وحسب معلوماتي المتواضعة أن التابع يستقبل فقط أمر (select)، أي أنه يجب أن يعاملها كذلك

وبالتالي سيعطي خطأ أثناء التنفيذ ولكنه لم يعطي؟ وإذا كان صحيحا ذلك فما الفائدة إذا من الـ

(InsertCommand,UpdateCommand,DeleteCommand,SelectCommand) الموجودة ضمن الـ (SqlDataAdapter) عندها؟؟.

ب) بالنسبة لـ SqlDataAdapter.Parameter.AddWithValue:

إما أن نقوم باستخدامها أو بطريقة ثانية بأن نضع القيم عندها بين (')، ولكن المشكلة في حال استخدمناها لا نستطيع أن نغير من سلسلة

محرفية إلى تاريخ!!، فهل هناك طريقة تحول من (DateTime) إلى (string)، طبعا بالطريقة الأولى لا داعي لأن يكون هناك سلاسل محرفية، لكني

كنت أصمم تابعا، نرسل له مصفوفة أسماء الحقول ومصفوفة القيم وكلها سلاسل محرفية، فلا تنفع معي الطريقة الأولى.

وأرجو إفادتي في معرفة أهمية أو مزايا استخدام الطريقة الأولى على الثانية.

ج) بالنسبة لـ SqlDataAdapter.Fill:

حسب علمي أنها تستخدم عند تنفيذ استعلام فقط، لتأخذ النتائج وتضعها في (DataSet)، ولكن هناك شخصا أخبرني أنه استخدمها في بقية

الحالات!، فهل هذا ممكن؟.

والسلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ألف ألف شكر لك أستاذنا الفااااضل

جعلها المولى في موازين حسناتك ولا حرمك الله أجر عملك

نفع الله بك الإسلام والمسلمين وأكثر من أمثالك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ممكن سؤال يا استاذ ياسر الشيخ ؟؟ أتمنى ما أكون أثقل عليك

في مشاريع التخرج ... الأفضل إستخدام الإتصال المتصل أو الإتصال المنفصل

توضيح لفكرة المشروع ...

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

السؤال الثاني

هل في الإتصال المنفصل تحفظ البيانات والتعديل عليها مثل الإتصال المنفصل بعد إغلاق البرنامج

وهل يلزم وضع داتاقريد لتأكد من التحديث أو الحذف

ولكَ جزيل الشكر ايها الفاضل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمه الله وبركه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمه الله وبركه

اخي في الله ياسر الشيخ جزاكم الله خيرا علي هذا العلم جعله الله في ميزان حسناتك

هل استطيع الاتصال بقاعدة بيانات من نوع mysql و ما هو كود الاتصال

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سلام عليكم

شكراً أخي العزيز على شرح الرائع..

لكن لدي مشكلة وهي كلمة أكتب

	Me.BindingContext(ds, "Information").EndCurrentEdit()

'BindingContext' is not a member of 'ASP.dataapdater_aspx'.

تظهر لي هذه المشكلة علماً أني أصستخدم vs2008

ما الحل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي الكريم

كيف حالك

بيض الله وجهك يالغالي على هذي الدروس الرووعه

لكن انا ابغى كود للبحث في البارميرات إلي هو اول درس طرحته ... انت لم تتطرق للبحث .. ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك يا أخى

أفضل ما فى الموضوع شعورى (واعتقد الكثيرين يوافقوننى) عملك إبتغاء مرضاة الله

أثابك الله عنا خيراً

وعوضك عن الجهد والوقت المبذول أضعافاً مضاعفة

ولى نقطة أود الاشارة اليها

اعتقد انه سيكون من الافضل أنتقاء تطبيق برمجى (وتطبيق كل تلك المفاهيم من خلاله)

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

ولكنه أيضاً سيضاعف العائد أضعافاً مضاعفة على المتابعين ومريدى التعلم

ولى نقطة اخرى للزملاء خبراء SQL Server وخاصة إصدارة 2005

لماذا لا تشاركون فى تتمة هذا العمل بتطيبق هذه المفاهيم على قواعد بيانات SQL Server 2000, 2005 ، إن أمكن

لكى يتخرج من هذا الموضوع (مبرمجين بحق) ويبقى لهم تكثيف خبراتهم بأنفسهم

المهم ان نوفر لهم الادوات ما استطعنا

والله الموفق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله يعطيك العافية على المجهود الطيب

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكــم ورحمـة الله وبركاتــة

جزاك الله اخى ياسر الشيخ

وانا اريد ان اسال سؤال

هل يمكنك ان تعمل درس فى التقاريير

كريستال ريبورت

وجزاك الله كل خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ما شاء الله تبارك الله

الموضوع مفيد للمحترفين كمان

صراحة في التب

و الى الامام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله خيراً ..

لكن .. في المشروع المرفق قاعده البيانات مغلقة بكلمة سر ..

ماهو الرمز .. حتى نرى التغيرات التي تحدث عند الاضافه أو الحذف ,,

جزاك الله خير الجزاء على الموضوع المميز ..

ولدي سؤال لو تكرمت ..

أعمل ع مشروع تخرج نظام بنك بسيط ..

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

وكيف أقوم بربط radiobutton بقاعده البيانات أكسس كنوع الجنس مثلا (ذكر وانثى ) أو نوع الإيداع (بالشيك أم بالنقد ) أو مكان الإيداع (لنفس البنك أو لبنك أخر) ؟؟

أرجو الاجابة في اسرع وقت .. وشكراً ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لماذا اوقفتم الدوره

ارجوك يااخي اكملها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكراً لك اخي الكريم

بارك الله فيك وفي امثالك وانا سوف اكون من اشد المتابعين لك بإذن الله

أخوك حمزة

بسم الله الرحمن الرحيم

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

=============

أحب أن أشكر الأخوان ( smsm_9002 ، Jordan ، GENIUS-IT ) الذين أعلنوا أنهم معي لأني بالفعل أحتاج إلى من يقف بجانبي ، وأخص بالذكر الأخ GENIUS-IT الذي عرض علي المساعدة التي بالطبع أحتاج إليها ...

=============

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

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

فعند التعامل مع قواعد بيانات Microsoft Office Access نستدعي فضاء الأسماء System.Data.OleDb وذلك بكتابة الكود التالي في أعلى صفحة الكود :

Imports System.Data.OleDb

وتندرج تحته مجموعة من الكائنات ولكن كل ما يهمنا منها كمبتدئين ما يلي :

OleDbCommand , OleDbConnection , OleDbDataAdapter , OleDbDataReader , OleDbParameter , OleDbCommandBuilder , OleDbTransaction. , OleDbException .

وعند التعامل مع قواعد بيانات SQL Server نستدعي فضاء الأسماء System.Data.SqlClient وذلك بكتابة الكود التالي في أعلى صفحة الكود :

Imports System.Data. SqlClient

وتندرج تحته مجموعة من الكائنات ولكن ما يهمنا منها كمبتدئين ما يلي :

SqlCommand , SqlConnection , SqlDataAdapter , SqlDataReader , SqlParameter , SqlCommandBuilder , SqlTransaction. SqlException .

ملاحظة : الإخوة الذين يستخدمون SQL Server يستطيعون أن يكملوا معنا الدرس دون مشاكل ، وكل ما عليهم هو أن يستبدلوا عبارة OleDb بعبارة Sql .

* الاتصال المتصل (Connection Oriented ) :

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

وهو مناسب " في حاله بناء التطبيقات المفردة ، أي عندما يكون للنظام مستخدم واحد وتوجد واجه المستخدم ومخزن قاعدة البيانات على نفس الجهاز . " ( أ. SOLO.NET ، مشرف منتدى ال VB.NET )

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

ولعمل اتصال من هذا النوع نحتاج إلى ثلاث كائنات أساسية نستخدمها على النحو التالي :

1- كائن الاتصال OleDbConnection : من أجل الاتصال بقاعدة البيانات .

2- فتح الاتصال بقاعدة البيانات .

3- كائن الأوامر OleDbCommand : في اعتقادي أنه يمثل القلب للاتصال المتصل ، وهو من أجل تنفيذ عملية قراءة البيانات المخزنة في قاعدة البيانات ، أو تحديثها ( من إضافة وتعديل وحذف ) ، ويعتمد في تكوينه على وجود اتصال مفتوح مع قاعدة البيانات ، وعلى جملة الاستعلام البنيوية SQL ( وهي لغة قياسية لبناء ومعالجة قواعد البيانات ومحتوياتها ، وتتضمن هذه اللغة تعليمات من أجل إضافة ، تعديل ، حذف ، ترتيب ، و اختيار سجلات ) . ومن أهم خصائصه :-

- Connection : ويجب أن يحمل اسم الاتصال الذي سوف يستخدمه كائن الأمر .

- CommandType : وله ثلاثة قيم ، القيمة Text ( لتنفيذ جملة استعلام بنيوية SQL ) ، القيمة StoredProcedur ( لتنفيذ إجراء مخزن في قاعدة البيانات ) ، القيمة TableDairect ( للتعامل مع جدول واحد ) .

ملاحظة : سوف نستخدم في درسنا القيمة Text فقط وهي ما تهمنا كمبتدئين .

- CommandText : ويعتمد على القيمة التي اخترناها في الخاصية السابقة ( CommandType) ، لذلك سوف يكون لدينا ثلاث مدخلات متناسبة معها على التوالي ، الإدخال الأول عبارة عن جملة استعلام بنيوية والتي سوف يتم تنفيذها سواء لاختيار أو تحديث السجلات ، المدخل الثاني عبارة عن اسم الإجراء المخزن في قاعدة البيانات والذي نريد تنفيذه ، والمدخل الثالث عبارة عن اسم الجدول الذي نريد التعامل معه .

- Parameters : ويستخدم للوصول إلى معاملات الإدخال و الإخراج والقيم العائدة .

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

الطريقة الأولى ( ExecuteReader ) وهي أحد خصائص كائن الأمر وتقوم بتنفيذ استعلام بنيوي يرجع لنا مجموعة من الصفوف الموجودة في قاعدة البيانات وهو ما يتطلب استرجاع هذه النتيجة بواسطة الكائن OleDbDataReader والذي سون نتحدث عنه بعد قليل .

الطريقة الثانية ( ExecuteNonQuery ) وهي أحد خصائص كائن الأمر وتقوم بتنفيذ استعلام بنيوي يقوم بتحديث قاعدة البيانات ( من إضافة ، تعديل ، و حذف ) أو تكوين قاعدة بيانات والنتيجة التي ترجع هي عدد الصفوف المتأثرة بالأمر .

الطريقة الثالثة ( ExecuteScalar ) وهي أحد خصائص كائن الأمر وتقوم بتنفيذ استعلام بنيوي يرجع لنا قيمة واحده فقط من قاعدة البيانات .

4- كائن قراءة البيانات OleDbDataReader : ويقوم بقراءة تيار من البيانات القابلة للقراءة فقط وفى اتجاه واحد يكون للأمام فقط . ويعتمد في تكوينه على وجود كائن أمر مبني على جملة استعلام مصممة لاختيار سجلات . ومن أهم خصائصه :

- Read : ومهمتها هي توجه قارئ البيانات إلى قراءة الصف الأول من النتائج ، وترجع القيمة True إذا وجد صف أو False إذا لم يوجد صف .

- Item : ومهمتها هي استرجاع قيمة العمود إما باستخدام أسم العمود أو رقمه .

- GetValues : ومهمتها هي استرجاع قيمة الصف كاملاً .

- isDBnull : ومهمتها هي اختبار فيما إذا كانت البيانات تحتوي على قيم Null .

- Close : ومهمته هي إغلاق كائن قارئ البيانات ولا يقوم بإغلاق الاتصال . مع ملاحظة أنه يجب دائماً إغلاق قارئ البيانات عند الانتهاء منه لان كائن الأوامر إذا كان يحتوي على معاملات إخراج أو قيم جديدة لن يكون في الإمكان التعامل معها إلى أن يتم الانتهاء من إغلاق كائن DataReader .

5- إغلاق الاتصال بقاعدة البيانات .

* وهنا نصل للجانب العملي من الدرس :

سوف نركز في الجانب العملي على الثلاثة طرق التي يتم بها العمل في كائن الأوامر OleDbCommand والذي قلنا فيما سبق أنه يمثل القلب .

مثال 1 : الطريقة ExecuteReader ، ماذا لو فرضنا أننا نريد أن نقرأ مجموعة من البيانات الموجودة في ملف قاعدة البيانات مصمم ببرنامج Microsoft Office Access والمسمى ( Note ) والذي من المفترض أن يوجد في نفس مسار مشروعنا ، وهذا الملف محمي بكلمة المرور ( ado.net ) وهو يحتوي على جدول اسمه ( Information ) والذي يحتوي بدوره على الحقول التالية ( ID ويحمل خاصية الترقيم التلقائي ويعد مفتاح أساسي ، Name ويحمل خاصية كونه نص ، Phone ويحمل خاصية كونه رقم ) ، ثم نعرض هذه البيانات في مربعات نص ، فكما تعلما سوف يكون العمل على النحو التالي ...

أولاً : نقوم بفتح مشروع جديد و نضيف مربعات النص التي سوف نعرض فيها قيم الحقول الموجودة في الجدول Information ...

ثانياً : استدعاء فضاء الأسماء الخاص بمزود بيانات برنامج Microsoft Office Access ، وذلك بكتابة الكود التالي في أعلى صفحة الكود ..

Imports System.Data.OleDb

ثالثاً :

التصريح عن الكائنات التي نحتاجها كمتغيرات في منطقة Declarations في صفحة الكود وذلك كي يتم التعرف علية في مختلف أجزار النموذج

، في البداية نقوم بتهيئة كائن الاتصال وليكن اسمه Conn ، كما في الكود التالي ...

Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ ConnectedMode\Note.mdb;User ID=Admin;Jet OLEDB:Database Password=ado.net")

ولكي لا نجعل برنامجنا الذي نتدرب علية مقيد بمسار ثابت وهو " C:\ ConnectedMode\MyNote.mdb " نستطيع أن نجعله أكثر مرونة بحيث يعمل على أي مسار شرط أن يتواجد ملف قاعدة البيانات والملف التنفيذي للبرنامج في نفس الموقع ، وذلك من خلال العبارة التالية "|DataDirectory|" بحيث يصبح الكود السابق كما يلي ..

Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Note.mdb;User ID=Admin;Jet OLEDB:Database Password=ado.net")

ثم نقوم بالتصريح عن كائن الأوامر وليكن اسمه MyCmd كما في الكود التالي ..

Dim MyCmd As New OleDbCommand

ثم نقوم بالتصريح عن كائن القراءة وليكن اسمه MyReader كما في الكود التالي ..

Dim MyReader As OleDbDataReader

رابعاً : في حدث تحميل النموذج نقوم بفتح الاتصال ..

Conn .Open

خامساً : نقوم بتهيئة كائن الأمر ( باستخدام جملة استعلام بنيوية تقوم بتحديد حقول معينة من الجدول الموجود في قاعدة البيانات ) كما ذكرنا في الجزء ألنضري من الدرس ، وذلك من خلال الكود التالي ..

MyCmd.Connection = Conn
MyCmd.CommandType = CommandType.Text
MyCmd.CommandText = "SELECT ID, Name, Phone FROM Information ORDER BY Name;"

سادساً : نقوم بتهيئة كائن القراءة ، وذلك بإسناد الطريقة ExecuteReader ( التابعة لكائن الأمر MyCmd ) إلية ، كما في الكود ..

MyReader = MyCmd.ExecuteReader

سابعاً : قبل إسناد قيم الحقول إلى مربعات النص نتحقق من أن كائن القراءة وجد صفوف تحتوي على بيانات من خلال أداة الشرط IF .. Then .. Else .. End If وباستخدام الخاصية Read ، وفي حالة توفر البيانات نقوم بإسناد قيمة كل حقل لمربع النص الخاص به من خلال الخاصية Item ، كما في الكود التالي ..

If MyReader.Read Then
txtID.Text = MyReader.Item("ID")
txtName.Text = MyReader.Item("Name")
txtPhone.Text = MyReader.Item("Phone")
Else
MsgBox(" Empty ", MsgBoxStyle.Exclamation)
End If

ثامناً : إغلاق كلاً من كائن القراءة وكائن الاتصال ، كما في الكود التالي ...

MyReader.Close()
Conn.Close()

مثال 2 : الطريقة ExecuteNonQuery ، استنادا للمثال السابق ماذا لو أردنا تحديث بياناتنا ( إضافة ، تعديل ، و حذف ) ، إذا فلنتابع شرح هذا المثال ..

أولاً : نضيف ثلاثة (Button ) ، ونسمي الأول btnAddNew والثاني btnUpdate والثالث btnDelete .

ثانياً : في حدث النقر لـ btnAddNew نقوم بما يلي ..

1- نقوم بفتح الاتصال ..

Conn .Open

2- نقوم بتهيئة كائن أمر جديد ونسميه InsertCommand ( باستخدام جملة استعلام بنيوية تقوم بإضافة بيانات مخزنة في Parameters ( ونرمز لها بالرمز ? ) لحقول معينة من الجدول الموجود في قاعدة البيانات ) كما ذكرنا في الجزء ألنضري من الدرس ، وذلك من خلال الكود التالي ..

Dim InsertCommand As New OleDbCommand
InsertCommand.Connection = Conn
InsertCommand.CommandType = CommandType.Text
InsertCommand.CommandText = "INSERT INTO Information(Name,Phone) VALUES(?,?);"

ملاحظة : لم نضيف أي قيمة للحقل ID لأنه له خاصية الترقيم التلقائي .

3- نقم بإعطاء قيم للـ Parameters الموجودة في جملة الاستعلام من خلال الخاصية Parameters التابعة لكائن الأمر ، وذلك بعد تنظيفه من إي Parameters ( فيما إذا كانت هناك أي Parameters مستخدمة سابقاً ) ..

InsertCommand.Parameters.Clear()
InsertCommand.Parameters.AddWithValue("?", txtName.Text)
InsertCommand.Parameters.AddWithValue("?", txtPhone.Text)

4- نطبق الطريقة ExecuteNonQuery والتي سوف تقوم بتنفيذ استعلام تحديث الجدول ..

InsertCommand.ExecuteNonQuery()

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

InsertCommand.Dispose()
Conn.Close()
MsgBox(" OK ", MsgBoxStyle.Information)

ثالثاً : في حدث النقر لـ btnUpdate نقوم بما يلي ..

1- نقوم بفتح الاتصال ..

Conn .Open

2- نقوم بتهيئة كائن أمر جديد ونسميه UpdateCommand ( باستخدام جملة استعلام بنيوية تقوم بتحديث بيانات مخزنة في Parameters ( ونرمز لها بالرمز ? ) لحقول معينة من الجدول الموجود في قاعدة البيانات وذلك اعتمادا على قيمة الحقل ID كمعرف للسجل الذي نريد تحديثه ) ، وذلك من خلال الكود التالي ..

Dim UpdateCommand As New OleDbCommand
UpdateCommand.Connection = Conn
UpdateCommand.CommandType = CommandType.Text
UpdateCommand.CommandText = "UPDATE Information set Name=? , Phone=? WHERE Id =?;"

ملاحظة : لم نقوم بتعديل قيمة الحقل ID لأنه له خاصية الترقيم التلقائي .

3- نقم بإعطاء قيم للـ Parameters الموجودة في جملة الاستعلام من خلال الخاصية Parameters التابعة لكائن الأمر ، وذلك بعد تنظيفه من إي Parameters ( فيما إذا كانت هناك أي Parameters مستخدمة سابقاً ) ..

UpdateCommand.Parameters.Clear()
UpdateCommand.Parameters.AddWithValue("?", txtName.Text)
UpdateCommand.Parameters.AddWithValue("?", txtPhone.Text)
UpdateCommand.Parameters.AddWithValue("?", txtID.Text)

4- نطبق الطريقة ExecuteNonQuery والتي سوف تقوم بتنفيذ استعلام تحديث الجدول ..

UpdateCommand.ExecuteNonQuery()

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

UpdateCommand.Dispose()
Conn.Close()
MsgBox(" OK ", MsgBoxStyle.Information)

رابعاً : في حدث النقر لـ btnDelete نقوم بما يلي ..

1- نقوم بفتح الاتصال ..

Conn .Open

2- نقوم بتهيئة كائن أمر جديد ونسميه DeleteCommand ( باستخدام جملة استعلام بنيوية تقوم بحذف السجل الحالي من قاعدة البيانات وذلك اعتمادا على قيمة الحقل ID كمعرف للسجل الذي نريد حذفه والتي سوف نقوم بتخزينها في Parameter ( ونرمز له بالرمز ? ) ) ، وذلك من خلال الكود التالي ..

Dim DeleteCommand As New OleDbCommand
DeleteCommand.Connection = Conn
DeleteCommand.CommandType = CommandType.Text
DeleteCommand.CommandText = " DELETE FROM Information WHERE id = ?; "

3- نقم بإعطاء قيمة للـ Parameter الموجود في جملة الاستعلام من خلال الخاصية Parameters التابعة لكائن الأمر ، وذلك بعد تنظيفه من إي Parameters ( فيما إذا كانت هناك أي Parameters مستخدمة سابقاً ) ..

DeleteCommand.Parameters.Clear()
DeleteCommand.Parameters.AddWithValue("?", txtID.Text)

4- نطبق الطريقة ExecuteNonQuery والتي سوف تقوم بتنفيذ استعلام تحديث الجدول ..

DeleteCommand.ExecuteNonQuery()

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

DeleteCommand.Dispose()
Conn.Close()
MsgBox(" OK ", MsgBoxStyle.Information)

مثال 3 : الطريقة ExecuteScalar ، استنادا للمثال الأول ماذا لو أردنا

معرفة عدد السجلات المخزنة في الجدول Information ، إذا فلنتابع شرح هذا المثال ..

أولاً : نضيف Button ، ونسميه btnCountId .

ثانياً : في حدث النقر لـ btnCountId نقوم بما يلي ..

1- نقوم بفتح الاتصال بقاعدة البيانات ..

Conn.Open()

2- نقوم بتهيئة كائن أمر جديد ونسميه CountIdCommand ( باستخدام جملة استعلام بنيوية تقوم بإعطائنا عدد السجلات المخزنة في الجدول Information ) ، وذلك من خلال الكود التالي ..

Dim CountIdCommand As New OleDbCommand
CountIdCommand.Connection = Conn
CountIdCommand.CommandType = CommandType.Text
CountIdCommand.CommandText = "SELECT Count(id) AS CountID FROM Information;"

3- نقم بالتصريح عن متغير من نوع String ونسميه CountId على سبيل المثال ، وذلك كي نخزن فيه القيمة التي سوف يعود بها كائن الأمر بعد أن نمرر له الخاصية ExecuteScalar ..

Dim CountId As String = CountIdCommand.ExecuteScalar()

4- نقوم بعرض MsgBox يبين لنا القيمة المخزنة في المتغير CountId وهي هنا عدد السجلات الموجودة في الجدول Information ..

MsgBox(CountId, MsgBoxStyle.Information)

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

InsertCommand.Dispose()
Conn.Close()
MsgBox(" OK ", MsgBoxStyle.Information)

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

ومن أهم خصائص الكائن Transaction هي الخصيتان (Commit و Rollback ) .

حيث أن الخاصية Commit تدل على نجاع العملية بدون مشاكل أو أي أخطاء وتسمح بتحديث البيانات ، و في حاله عدم تحقق شرط معين أو حدوث خطأ فإن الخاصية Rollback تقوم بعمل تراجع وتلغي العملية .

ولكي نهيئ الكائن Transaction يجب أن نصرح عنه كمتغير كما في الكود ...

Dim MyTransaction As OleDbTransaction

ثم نستدعي الخاصية BeginTransaction التابعة لكائن الاتصال ونسندها له ، كما يلي ..

MyTransaction = Conn.BeginTransaction

، ثم نهيئ كائن الأمر ( على سبيل المثال InsertCommand ) الذي نريد منه تحديث البيانات بإضافة سجل جديد ، وذلك باستدعاء الخاصية Transaction التابعة له وإسناد الكائن Transaction له ..

InsertCommand.Transaction = MyTransaction

وبعد تنفيذ الخاصية ExecuteNonQuery لكائن الأمر نقوم بإستدعاء الخاصية Commit التابعة للكائن Transaction وذلك لتأكيد قبول العملية ونجاحها ..

MyTransaction.Commit()

وفي حالة وجود أي مشكلة نستدعي الخاصية Rollback التابعة للكائن Transaction وذلك للقيام بإلغاء العملية ...

MyTransaction.Rollback ()

لذلك ننصح تعشيش كل العمليات التي يتوقع وجود مشاكل بها داخل دالة اكتشاف الأخطاء Try...Catch…Finally .

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

في حدث النقر لـ btnUpdate نقوم بما يلي ..

1- نقوم بالتصريح عن متغيرين ، الأول كائن Transaction ونعطيه الاسم MyTransaction ، والثاني Command ونعطيه الاسم UpdateCommand ...

Dim MyTransaction As OleDbTransaction
Dim UpdateCommand As New OleDbCommand

2- نقوم بتعشيش دالة اكتشاف الأخطاء Try...Catch…Finally ( مع ملاحظة أننا في جزئية الدالة Catch قمنا بالتصريح عن متغير أسميناه Filed من نوع OleDbException وهو من الكائنات التابعة لفضاء الأسماء System.Data.OleDb ونستفيد منه في الحصول على معلومات عن سبب الخطأ عند حدوثه في مصدر البيانات . ) كما يلي ..

Try
' العمليات التي نرغب في اصطياد أخطائها إن وجدت
Catch Filed As OleDbException
' الأخطاء التي تم اصطيادها ، بالإضافة للتصحيح المناسب لها
Finally
' العمليات التي يجب تنفيذها على كل حال
End Try

ملاحظة : في الجزء الذي يحتوي على العمليات التي نرغب في اصطياد أخطائها إن وجدت من دالة Try نقوم بما يلي ..

3- نقوم بفتح الاتصال ..

Conn .Open

4- استنادا لما تعلمناه في السطور السابقة نقوم بإعداد وتجهيز كلاً من الكائن Transaction والكائن Command ( مع ملاحظة أننا استخدمنا هذه المرة الخاصية ExecuteNonQuery لتحديث الحقل Name لوحده ثم استخدمناها مرةً أخرى لتحديث الحقل Phone ، مع تعمد كتابة خطأ في جملة الاستعلام التي نحدث بها الحقل Phone وبالتحديد في الكلمة "UPDATE" والتي كتبناها ABDATE"" ، وذلك حتى نتعرف على الطريقة التي سوف يتم بها اصطياد الخطأ وكيف سوف يتم تصحيحه ) ...

MyTransaction = Conn.BeginTransaction
UpdateCommand.Connection = Conn
UpdateCommand.Transaction = MyTransaction
UpdateCommand.CommandType = CommandType.Text
UpdateCommand.CommandText = "UPDATE Information set Name=? WHERE Id =?;"
UpdateCommand.Parameters.Clear()
UpdateCommand.Parameters.AddWithValue("?", txtName.Text)
UpdateCommand.Parameters.AddWithValue("?", txtID.Text)
UpdateCommand.ExecuteNonQuery()
UpdateCommand.CommandText = "ABDATE Information set Phone=? WHERE Id =?;"
UpdateCommand.Parameters.Clear()
UpdateCommand.Parameters.AddWithValue("?", txtPhone.Text)
UpdateCommand.Parameters.AddWithValue("?", txtID.Text)
UpdateCommand.ExecuteNonQuery()

5- نقوم باستدعاء الخاصية Commit التابعة للكائن Transaction وذلك لتأكيد قبول العملية ونجاحها مع عرض رسالة تفيد بنجاح العملية ..

MyTransaction.Commit()
MsgBox(" OK ", MsgBoxStyle.Information)

ملاحظة : في الجزء المسمى Catch من دالة Try والذي يحتوي على الأخطاء التي تم اصطيادها ، بالإضافة للتصحيح المناسب لها نقوم بما يلي ..

6- نستدعي الخاصية Rollback التابعة للكائن Transaction وذلك للقيام بإلغاء العملية ، ثم نعرض رسالة نصية توضح لنا معلومات عن الخطأ الذي وقع أثناء تنفيذ البرنامج ...

MyTransaction.Rollback()
MsgBox(Filed.Message, MsgBoxStyle.Exclamation)

ملاحظة : في الجزء المسمى Finally من دالة Try والذي يحتوي على العمليات التي يجب تنفيذها على كل حال ، نقوم بما يلي ..

7- نتخلص من كائن الأمر UpdateCommand لأننا انتهينا منه وحتى لا يستهلك جزاء من موارد النظام ، ثم نغلق الاتصال بقاعدة البيانات ..

UpdateCommand.Dispose()
Conn.Close()

ملاحظة : لقد استفدت كثيراً في شرح هذا الكائن من درس قدمه الأخ koao لذلك أحب أن أشكره على ذلك .

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

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

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

أمثلة الجزأ الثاني من الدرس توجد في الملف المرفق ..

Note_ConnectedMode.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

أنا عااااااااااااااااااااااااااااااااااااااااااااااااااااااااااجز عن الشكر

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

اللهم إجعلها صدقة جارية ليوم الدين

أنا إتعلمت كتيييييييييييييييييييييييير أوى من الدرس ده

أنا فعلا بادئ من الصفر بس لسة مخلصتش أنا قولت أرد الأول وبعدين أستكمل الشرح

من علمنى حرفا صرت له عبدا

مقدرش أقول أكتر من كده

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ,,

اثابك الله اخي ياسر وجزاك الله كل خير على هذه الدروس الرائعة والمفيدة

هل توقفت الدورة ,, ام ماذا ؟؟

عسا ان يكون المانع خير ,,

تحياتي !! :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بصراحة الموضوع مميز جداً جداً

ويعجز الإنسان عن الشكر .

وأحب أن أضيف للجميع أنه يوجد مشاركة للعضو Providers مرفق معها مثال وافي وجميل جداً للإتصال في الوضع المنفصل وفيه تقريباً كل ما شرح في هذه الدروس .

ويمكنكم مشاهدته وتحميله من هذا الرابط :

http://www.arabteam2000-forum.com/index.ph...=0#entry1024453

أخي ياسر مرة أخرى أشكرك بشدة وجزاك الله خير

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم :

هل اوقفت الدورة ام ماذا

ارجو ان يكون المانع خير

و شكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .