• 0
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

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

ونحن معك

0

شارك هذا الرد


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

شكراً أخي ...

نحن معك و بانتظار باقي الدروس :)

0

شارك هذا الرد


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

السلام عليكم

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

أخى yaseralshikh

وانا فى إنتظار باقى الدروس

وساحاول تقديم اى مساعده مطلوبه بإذن الله

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

تم تعديل بواسطه yaseralshikh
4

شارك هذا الرد


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

بالتوفيق يا yaseralshikh

شرح كفاءه

0

شارك هذا الرد


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

شِرحك جميل أخي العزيز وشامل ما شاء الله عليك ،

اتمنى وبعد ان تنتهي من هذه الدورة ان تضع كل الدروس بطريقة منسقة على هيئة pdf ،

تحياتي

0

شارك هذا الرد


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

جزاك الله خير وكثر الله من أمثالك وجعل الله تعبك هذا في ميزان حسناتك..

أخي الكريم .. لدي سؤال

كيف يتم التعامل بعد قراءة البيانات وذلك بعد تنفيذ ExecuteReader

انت ذكرت المثال في حالة كون الاستعلام سوف يعيد سجل واحد:

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

لكن في حالة كون الاستعلام أرجع أكثر من سجل .. كيف يتم التنقل بينها برمجياً دون استخدام جريد فيو؟

دمت بود أخي

0

شارك هذا الرد


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

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

CountIdCommand.CommandText = "SELECT Count(id) AS CountID FROM Information;"

لدي سؤال في الكود السابق ، بخصوص الجزء " AS CountID " ماذا يمثل هذا الجزء من الجملة ؟ وهل يمكننا تعريف المتغير CountID الذي عرفته بعد الجملة من النوع Integer بإسم آخر دون تغيير اسمه في الجملة ؟

بمعنى آخر هل يرتبط المتغير CountID الذي عرفته داخل الجملة بالآخر الموجود بعد الجملة ؟

0

شارك هذا الرد


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

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

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

كما أرجو أن أكون قد توفقت في إصال الفكرة لكما ..

2

شارك هذا الرد


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

الأستاذ الكريم ياسر الشيخ

كل سنة وأنت بألف خير ومشكووووووووور على هذا الشرح الرائع والذي يدل على تمكنك من معرفة خصائص وأوامر Ado.Net وهذا ليس بالغريب عنك مع رجاء التوضيح لنا عن الرمز "؟" في الملحقات Parameters هل يجب التعبير عنه بهذا الرمز أم يمكنني أن أستعمل أي حرف آخر مثل "Fld" أو "Rec" أو غيره

0

شارك هذا الرد


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

استاذي ياسر ..

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

عملت هذه الطريقة ومشي معي الحال

Dim MyReader As OleDbDataReader = comm.ExecuteReader()
MyReader.Read()
If MyReader.HasRows Then
Do
'Do SomeThing
Loop While (MyReader.Read())
End If

تحية طيبة

0

شارك هذا الرد


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

أخي معنا تفاعلك في هذا الدرس يسعدني كثيراً ..

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

		Conn.Open()
MyCmd.Connection = Conn
MyCmd.CommandType = CommandType.Text
MyCmd.CommandText = "SELECT ID, Name, Phone FROM Information;"
MyReader = MyCmd.ExecuteReader
If MyReader.Read Then
txtID.Text = MyReader.Item("ID")
txtName.Text = MyReader.Item("Name")
txtPhone.Text = MyReader.Item("Phone")
Do
Me.ListBox1.Items.Add(MyReader.Item("Name"))
Loop While (MyReader.Read())
Else
MsgBox(" Empty ", MsgBoxStyle.Exclamation)
End If
MyReader.Close()
Conn.Close()

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

		Conn.Open()
MyCmd.Connection = Conn
MyCmd.CommandType = CommandType.Text
MyCmd.CommandText = "SELECT ID, Name, Phone FROM Information where Name=?;"
MyCmd.Parameters.Clear()
MyCmd.Parameters.AddWithValue("?", ListBox1.Text)
MyReader = MyCmd.ExecuteReader
If MyReader.Read Then
txtID.Text = MyReader.Item("ID")
txtName.Text = MyReader.Item("Name")
txtPhone.Text = MyReader.Item("Phone")
End If
MyReader.Close()
Conn.Close()

أرجو أن يكون الشرح واضح وفي متناول الجميع ..

تم تعديل بواسطه yaseralshikh
1

شارك هذا الرد


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

صديقي omran الحبيب ..

الرمز "؟" في الملحقات Parameters يمكن أستعمل أي حرف آخر مثل "Fld" أو "Rec" أو غيره والأفضل استخدام رموز معبره ، مثال ..

		MyCmd.CommandText = "SELECT ID, Name, Phone FROM Information where Name=@NAME;"
MyCmd.Parameters.Clear()
MyCmd.Parameters.AddWithValue("@NAME", ListBox1.Text)

هذا من خلال التجربة ، والله أعلم ..

1

شارك هذا الرد


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

أستاذي وصديقي العزيز ياسر

جزيل الشكر لله ثم لك على هذا الرد وأرجو أن لاتصاب باحباط عندما أقول لك أن Ado.Net هبلتني وخلتني كيف حيران فما يقال عنها يبين أهميتها وسهولة البرمجة بها وما وعرفته حتى الآن منك ومن بعض الزملاء في المنتدى هو عبارة عن التواصل مع الداتا عن طريق البرمجة بالكود دون الاستفادة من الأداة نفسها إذا كانت هناك أداة أما إذا كان المراد من كلمة Ado.Net هو مجموعة الأدوات الموجودة في الفضاء system.data فلماذا نطلق عليها أداة خاصة وأننا تعلمنا بالمعايشة مع الأداة ADODC في الإصدار السادس من VB سهولة التعامل من أداة بالاسم والخصائص وسهولة التعبير عن أوامر DataBase من حفظ أو تحديث UpDate أو بحث Find وغيرها بأمر بسيط جدا جدا مثل ِAdodc1.RecordSet.UpDate فهل يوجد مثل هذا في Ado.Net وأرجو أن تسامحني على تطاولي فذاك حد علمي "وما أوتيتم من العلم إلا قليلا"

0

شارك هذا الرد


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

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

أخي omran الحيرة التي تعاني منها وكذلك الكثير من الأخوان ، سببها المقارنة السطحية بين ADO و ADO.NET وهذا يعتبر خطأ فادح ، لأن التطور الضخم الذي حدث بينهما يجعلنا نقول أن ADO.NET تقنية جديدة ، وليست إصدار جديد لـ ADO .

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

* دعم XML :

- ADO : غير موجود .

- ADO.NET : دعم قوي .

* نقل البيانات من خلا الجدار الناري :

- ADO : هناك عائق لنقل ADO من خلال الجدار الناري .

- ADO.NET : بما أن DATASET تدعم XML فلا يوجد مشكلة في نقل البيانات من خلال الجدار الناري .

* التوسع :

- ADO : يوجد مشكلة في التوسع لأن الاتصال بقواعد البيانات يتم حفظة لفترة طويلة بشكل متصل .

- ADO.NET : إمكانية البيئة المنفصلة تساعد على الاشتراك في الاتصال ومن ثم إمكانية توسع كبيرة .

* تمثيل البيانات في الذاكرة :

- ADO : الكائن Recordset يحتوي على جدول واحد في نفس الوقت .

- ADO.NET : الكائن DATASET يحتوي على عدد غير محدود من الجداول في نفس الوقت .

* العلاقات بين الجداول :

- ADO : تتطلب ربط الجداول قبل إحضارها من قاعدة البيانات .

- ADO.NET : بالإمكان عمل علاقات بين الجداول بعد إحضارها من قاعدة البيانات من خلال الكائن DataRelation .

* المرور على البيانات :

- ADO : يتم المرور على البيانات بشكل تسلسلي داخل الكائن Recordset .

- ADO.NET : يتم المرور على البيانات بشكل غير تسلسلي .

* البيئة غير المتصلة :

- ADO : لا يوجد دعم جيد .

- ADO.NET : مهيأة من خلال الكائنين DATASET و DataAdaptor .

أخي ..

تقنية ADO.NET ليست معقده ، ولكنها تحتاج إلى فهم للمعمارية التي تتكون منها بالإضافة للإستراتجية المتبعة في التعامل مع كائناتها المختلفة . وهذا ما أرجوا من الله إن يعينني على توضيحه من خلال هذا الدرس .

تم تعديل بواسطه yaseralshikh
1

شارك هذا الرد


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

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

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

Microsoft.Jet.OLEDB.4.0 وهو للتعامل مع قواعد بيانات برنامج Microsoft Office Access

يعني موقع على الانترنيت او اي موقع اخر

هل بالامكان توضيح طريقة توفيره ولك جزيل الشكر

لانني اعددت قاعدة بيانات ناجحة باستخدام الاكسس والان اريد ربطها بال

vb.net2003

0

شارك هذا الرد


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

مزود البيانات Microsoft.Jet.OLEDB.4.0 لا تحتاج إلى توفيره ، لانه بمجرد نسخ أي إصدار من برنامج Microsoft Visual Basic يتوفر معه ، بالإضافة إلى مجموعة من المزودات الأخرى .

0

شارك هذا الرد


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

بارك الله فيك ... أتمنى أن يثبت الموضوع

0

شارك هذا الرد


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

يا لغبائي ، والله اني منتظر للدروس هذه بشوق ، لكن لا أدري أنك قد بدأت فيها يا أخ ياسر

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

على العموم ، أعانك الله ، ووفقك ، وجعل ما تقدمه لإخوانك في ميزان حسناتك.

وتحياتي لك.

أخوك ابن الأثير

0

شارك هذا الرد


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

شكرا اخي على الرد

طيب عندما اطبق الدرس على حاسبتي والتي انصب عليها microsoft visual studio.net 2003 وعند عمل الاتصال مع قاعدة بيانات اكسس 2003 يضهر الخطاء التاللي

there is no installable ISAM

ما هو معناها

؟؟؟؟؟؟

وشكرا

0

شارك هذا الرد


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

السلام عليكم

أخى الكريم ياسر

انا أسف على عدم متابعتى للموضوع

بس والله اليومين دول انا مشغول جدا

ده حتى القسم بتاعى انا مش متواجد فيه

بإذن الله قريبا هكون معك فى الموضوع

0

شارك هذا الرد


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

تسلم الأيادي أخي ياسر والله ماقصرت ..

ومنتظرين بقية دروسك المتميزة

0

شارك هذا الرد


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

أشكر الجميع على مشاعرهم الطيبة ..

سوف أكمل الدرس ، ولكني مشغول قليلاً في هذه الفتره ..

----------------------------------------

أخي iraqieng82 ..

لم يحدث وأن صادفتني مثل هذه الرسالة ، وبالقليل من البحث وجدت أنها تشير إلى أنه ليس هناك ISAM ( اختصار لـ Indexed Sequential Access Method ) مثبت .

وهي أحد رسائل الأخطاء المتعلقة بمشاكل Microsoft Jet database engine .

و للتغلب على هذه المشكلة حاول إعادة كتابة سلسلة الإتصال بقاعدة البيانات بحيث تصبح بالشكل التالي ...

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & " \Note.mdb;User ID=Admin;Jet OLEDB:Database Password=ado.net"

ملاحظة : هذا لو كنت تستخدم نفس الملف الذي أرفقته أنا في الدرس .

لأني أشك في أن العبارة "|DataDirectory|" التي استخدمناها في الدرس لاتتوافق مع الإصدار 2003 ، والله أعلم .

وإذا لم تحل المشكلة أريدك أن تتأكد من شيء ..

وهو عند تثبيت برنامج Microsoft Office يوجد خيار لتركيب ISAM database drivers ، إذا لم تقوم بتثبيته حينها ، يمكنك عمل repair لبرنامج Microsoft Office وذلك من خلال ( لوحة التحكم .. إضافة أو إزالة البرامج .. Microsoft Office ) وذلك لتثبيته من جديد .

والله الموفق .

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

شارك هذا الرد


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

السلام عليكم اخي ياسر

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

انا طول عمري كنت اشتغل على الوضع المنفصل بس بسبب عدم وجود خاصية Transaction فيما يتعلق بموضوع Commit و Rollback

على الوضع المنفصل

كان لابد من ان اتعلم الوضع المتصل وبصراحه استفدت كثير من هدذ السلسه التى ارها كامله بس يبقي فيها موضوع واحد بس

هو كيفيه حفظ محتويات الداتا غريد فيو على الداتا بيس الاصليه في الوضع المتصل

بصراحه انا عندي مشكله في دا الموضوع لاني اول مره اتعامل مع الوضع المتصل مع الداتا غريد فيو

لذلك اتمنى انك تشرح دي النقطه

عندي صفحه فيها الداتاغريد فيو

كيف احفظ جميع اسطر الداتا غريد فيو في الداتا بيس الاصليه بالاضافه الى تاريخ العمليه لكل سطر ورقم القيد

هنا التاريخ ورقم القيد راح ياخدهم من تكس بوكس 1 و 2 على التوالى

يعني في الجدول الدي ستتم عليه عمليه الحفظ يحتوي على عامودين واحد للتاريخ والثاني لرقم لقيد

وهتان القيمتان سوف تتكرر على جميع الصفوف التى سوف يحفظها

اتمني حل هذا السوال على الوضع المتصل

ومشكوره اخوي على هده السلسه من الدروس القيمه

جعل الله لك بكل حرف تكتبه فيها مائه حسنة

0

شارك هذا الرد


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

الأخت صاحبة السمو ..

أشكرك على إطراؤك على الدروس ، ولكن الكمال لله سبحانه وتعالى ..

أما حفظ محتويات الداتا غريد فيو على الداتا بيس الاصليه في الوضع المتصل ، أنا أعلم أنه يمكن عرض محتويات الداتا قريد من خلال DataReader في الوضع المتصل ، أما الحفظ فلا ، والأسلوب الأمثل هو الوضع المنفصل .

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

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

شارك هذا الرد


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

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

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



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

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

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