المساعدة - البحث - قائمة الأعضاء - التقويم
نسخة كاملة: درس في ADO.NET من الصفر إلى الإحتراف .
برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة > منتديات البرمجة على Microsoft .NET Platform > منتدى الـ ADO.NET
صفحات: 1, 2, 3, 4
yaseralshikh
بسم الله الرحمن الرحيم

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..
=============
أستغل هذه المناسبة كي أهني كل الأصدقاء والأخوان والأخوات في هذا المنتدى الحبيب بقدوم عيد الفطر المبارك .. فكل عام وأنتم بخير ، وتقبل الله منا ومنكم صالح الأعمال .. ورزقنا الإخلاص في القول والعمل ...
=============
اليوم أقدم لأخواني درس يتناول التعامل مع قواعد البيانات باستخدام 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 .
** هنا ينتهي حديثنا اليوم وذلك لأن المشوار ما زال طويل ولا يمكن استيعابه في مشاركة واحدة ، ولكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس وذلك في المشاركات القادمة ..
((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))
smsm_9002
جزاك الله كل خير

ونحن معك
Jordan
شكراً أخي ...
نحن معك و بانتظار باقي الدروس regular_smile.gif
GENIUS-IT
السلام عليكم

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

أخى yaseralshikh

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

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

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..
=============
أحب أن أشكر الأخوان ( 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 ) لأنه يحل لنا بعض الإشكالات البرمجية في بعض البرامج ، رغم إننا لم نتناول كل جوانبه ، ولكني أحب أن يعلم الجميع أنني أفرغت كل ما بجعبتي من معلومات عنه ، ومن يملك المزيد فليكسب أجرنا ويعلمنا مما علمه الله ،

((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))
أمثلة الجزأ الثاني من الدرس توجد في الملف المرفق ..

إضغط لإظهار المرفق
AhmedElbaz
بالتوفيق يا yaseralshikh
شرح كفاءه
النبهاني
شِرحك جميل أخي العزيز وشامل ما شاء الله عليك ،

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

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


أخي الكريم .. لدي سؤال
كيف يتم التعامل بعد قراءة البيانات وذلك بعد تنفيذ 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

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


دمت بود أخي
النبهاني
السلام عليكم ورحمه الله وبركاته
كود
CountIdCommand.CommandText = "SELECT Count(id) AS CountID FROM Information;"


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

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

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

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

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

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

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

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


تحية طيبة
yaseralshikh
أخي معنا تفاعلك في هذا الدرس يسعدني كثيراً ..
ولو كنت تريد إستعراض كل الحقول المعادة ، والتنقل بينها دون استخدام داتا قريد فيو ، يمكنك أن تضيف الأداة 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
صديقي omran الحبيب ..
الرمز "؟" في الملحقات Parameters يمكن أستعمل أي حرف آخر مثل "Fld" أو "Rec" أو غيره والأفضل استخدام رموز معبره ، مثال ..
كود
        MyCmd.CommandText = "SELECT ID, Name, Phone FROM Information where Name=@NAME;"
        MyCmd.Parameters.Clear()
        MyCmd.Parameters.AddWithValue("@NAME", ListBox1.Text)

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

أخي 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 ليست معقده ، ولكنها تحتاج إلى فهم للمعمارية التي تتكون منها بالإضافة للإستراتجية المتبعة في التعامل مع كائناتها المختلفة . وهذا ما أرجوا من الله إن يعينني على توضيحه من خلال هذا الدرس .
master82
بسم الله الرحمن الرحيم
لقد بدات بقراة المشروع او المقال المهم لانه يحتوي على معلومات مختصرة مهمة ولكن في قسم البداية لااعرف من اين احصل على
Microsoft.Jet.OLEDB.4.0 وهو للتعامل مع قواعد بيانات برنامج Microsoft Office Access
يعني موقع على الانترنيت او اي موقع اخر
هل بالامكان توضيح طريقة توفيره ولك جزيل الشكر
لانني اعددت قاعدة بيانات ناجحة باستخدام الاكسس والان اريد ربطها بال
vb.net2003
yaseralshikh

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


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

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

وتحياتي لك.

أخوك ابن الأثير
iraqieng82
شكرا اخي على الرد

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

؟؟؟؟؟؟
وشكرا
GENIUS-IT
السلام عليكم

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

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

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

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

بإذن الله قريبا هكون معك فى الموضوع
mqmmss
تسلم الأيادي أخي ياسر والله ماقصرت ..
ومنتظرين بقية دروسك المتميزة
yaseralshikh

أشكر الجميع على مشاعرهم الطيبة ..
سوف أكمل الدرس ، ولكني مشغول قليلاً في هذه الفتره ..
----------------------------------------
أخي 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 ) وذلك لتثبيته من جديد .
والله الموفق .
صاحبة السمو
السلام عليكم اخي ياسر
في البداية يعطيك الف عافية على مجهوداتك
انا طول عمري كنت اشتغل على الوضع المنفصل بس بسبب عدم وجود خاصية Transaction فيما يتعلق بموضوع Commit و Rollback
على الوضع المنفصل
كان لابد من ان اتعلم الوضع المتصل وبصراحه استفدت كثير من هدذ السلسه التى ارها كامله بس يبقي فيها موضوع واحد بس
هو كيفيه حفظ محتويات الداتا غريد فيو على الداتا بيس الاصليه في الوضع المتصل
بصراحه انا عندي مشكله في دا الموضوع لاني اول مره اتعامل مع الوضع المتصل مع الداتا غريد فيو
لذلك اتمنى انك تشرح دي النقطه
عندي صفحه فيها الداتاغريد فيو

كيف احفظ جميع اسطر الداتا غريد فيو في الداتا بيس الاصليه بالاضافه الى تاريخ العمليه لكل سطر ورقم القيد
هنا التاريخ ورقم القيد راح ياخدهم من تكس بوكس 1 و 2 على التوالى
يعني في الجدول الدي ستتم عليه عمليه الحفظ يحتوي على عامودين واحد للتاريخ والثاني لرقم لقيد
وهتان القيمتان سوف تتكرر على جميع الصفوف التى سوف يحفظها
اتمني حل هذا السوال على الوضع المتصل
ومشكوره اخوي على هده السلسه من الدروس القيمه
جعل الله لك بكل حرف تكتبه فيها مائه حسنة
yaseralshikh

الأخت صاحبة السمو ..
أشكرك على إطراؤك على الدروس ، ولكن الكمال لله سبحانه وتعالى ..
أما حفظ محتويات الداتا غريد فيو على الداتا بيس الاصليه في الوضع المتصل ، أنا أعلم أنه يمكن عرض محتويات الداتا قريد من خلال DataReader في الوضع المتصل ، أما الحفظ فلا ، والأسلوب الأمثل هو الوضع المنفصل .
أنا أعلم أن حرصك على الوضع المتصل بسبب إهتمامك بالـ Transaction ، وانصحك بأن تتعاملي مع الأدوات في الوضع المنفصل ، وعند الحفظ يمكنك كتابة إجراء فرعي يقوم بحفظ البيانات في الوضع المتصل ويمكنك استخدام الـ Transaction حينها . والله الموفق .
iraqieng82
اخي العزيز
لقد بحث عن تنصيب الISAm ولم احجده وقمت باعادة تنصيب الاوفيس مرة اخرى ولم يطلبه مني ولكن لاحضت انه ملف الاكسس بالرغم من انه 2003 لكن في اعلى
الملف لاحظت انه يقراء 2000 file format وعندما قمت بتحويله الى 2003 file format تم عملية الاتصال بنجاح وسارسل لك الملف مع الكود لكي تقيم عملي.......
وشكرا على المساعدة
cdcase
جزاااااااك الله خير على الشرح القيم

لى سؤال

انا عندى قاعدة بيانات على سيرفر أسمه server والسيرفر ده طبعاً عليه
أسم مستخدم
userConn
وكلمة سر
PassConn
ده طبعاً غير اسم المستخدم وكلمة السر الخاصين بقاعدة البيانات نفسها
وهنفترض انى بستخدم هذا الكود فى الاتصال

lo
كود
ok

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

lo
ok


ازاى امرر كلمة السر واسم المستخدم الخاصين بالسيرفر فى ال
ConnectioString
هادى سالم
بسم الله الرحمن الرحيم


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



السلام عليكم
iemad
الله يعطيك ألف عافية ...... regular_smile.gif
ibn alatheer


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

وأبشرك، فكل إنسان يستفيد من هذه الدروس ويسيرها في الخير وفي نشر العلم والخير وخدمة الإسلام والمسلمين لك من أجره نصيب،
بل وحتى في منفعة الإنسان لنفسه فقط لكل من ذلك الأجر العظيم عند الله تعالى ، بل يدخل ذلك في قول النبي صلى الله عليه وسلم:
(إذا مات ابن آدم انقطع عمله إلا من ثلاث ، صدقة جارية، أو علم ينتفع به، أو ولد صالح يدعو له).

فجزاك الله كل خير، بل يقول العلماء النفع المتعدي أفضل من النفع القاصر، يعني أفضل من النوافل والقرب التي يعود نفعها على الإنسان نفسه،
مثل نشر العلم بأنواعه (العلم الذي ينفع الإنسان ويتعدى نفعه للآخرين).

هذا حقك عندنا، وليس غلواً أو إطراءً.


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

وفقنا الله وإياك لما يحبه ويرضاه
yaseralshikh
إقتباس(cdcase @ Jan 14 2007, 02:18 AM) [snapback]588551[/snapback]
جزاااااااك الله خير على الشرح القيم

لى سؤال

انا عندى قاعدة بيانات على سيرفر أسمه server والسيرفر ده طبعاً عليه
أسم مستخدم
userConn
وكلمة سر
PassConn
ده طبعاً غير اسم المستخدم وكلمة السر الخاصين بقاعدة البيانات نفسها
وهنفترض انى بستخدم هذا الكود فى الاتصال

lo
كود
ok

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

lo
ok
ازاى امرر كلمة السر واسم المستخدم الخاصين بالسيرفر فى ال
ConnectioString


مما يبدو لي أنك قمت بالخلط بين Microsoft Office Access و SQL Server ، فأنت حينما تتعامل مع ملف قاعدة بيانات مصممة بواسطة برنامج Microsoft Office Access لن تحتاج إلى الإتصال بالسيرفر الخاص بـ SQL Server .
yaseralshikh

الحمد لله الذي جعل لي أصدقاء ، لم أراهم ولم يروني ، احببتهم وأحبوني .. جعل الله لقيانا في دار الخلد عند الحبيب عليه الصلاة والسلام .
أعتذر للجميع عن الإنقطاع كل هذا الوقت ..
وأعدكم أن أكمل الدرس ، ولكن أمهلوني بعض الوقت ، فأنا حالياً لا أجد الوقت الكافي لكتابة الدرس بالشكل المطلوب . فلدي أمور لابد من أن أنتهي منها ، كما تعلومن نحن في فترة إختبارات ، والله الموفق .
cdcase
إقتباس(yaseralshikh @ Jan 15 2007, 07:39 PM) [snapback]589179[/snapback]

مما يبدو لي أنك قمت بالخلط بين Microsoft Office Access و SQL Server ، فأنت حينما تتعامل مع ملف قاعدة بيانات مصممة بواسطة برنامج Microsoft Office Access لن تحتاج إلى الإتصال بالسيرفر الخاص بـ SQL Server .


اعتذر عن الخطأ فى توضيح السؤال
ولكنى اقصد السيرفر (الكمبيوتر) وليس السيرفر الخاص ب SQL Server
بمعنى
ان قاعدة البيانات بتاعتى على السيرفر (الكمبيوتر) ومسارها هيكون مثلا
c
كود
Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "\\admin\MyDb" &\data.mdb;User ID=Admin;Jet OLEDB:Database Password=Admin")

d

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

ارجو الافادة
تحياتى
yaseralshikh

أخي cdcase أعذرني فأنا لم أفهم بعد ، ربما لأني لا أتعامل مع الشبكات أو لم أقرأ عنها ، وما أفهمه هو أن برنامجك وملف قاعدة البيانات data.mdb يجب أن يكونان في مسار واحد دون أن يكون هناك شبكه وسيطه يجب الدخول عليها للوصول إلى ملف قاعدة البيانات . هذا والله أعلم .
cdcase
إقتباس(yaseralshikh @ Jan 15 2007, 09:10 PM) [snapback]589209[/snapback]

أخي cdcase أعذرني فأنا لم أفهم بعد ، ربما لأني لا أتعامل مع الشبكات أو لم أقرأ عنها ، وما أفهمه هو أن برنامجك وملف قاعدة البيانات data.mdb يجب أن يكونان في مسار واحد دون أن يكون هناك شبكه وسيطه يجب الدخول عليها للوصول إلى ملف قاعدة البيانات . هذا والله أعلم .

مرحبااااااااا
أخى الغالى
ليس بالضرورة أن يكون البرنامج وملف قاعدة البيانات data.mdb في مسار واحد

برنامجى يعتمد على اكثر من مستخدم ويجب ان تكون قاعدة البيانات على كمبيوتر مستقل (سيرفر) حتى يتسطيع المستخدمين تبادل البيانات
وكما اوضحت من قبل ان الكمبيوتر يحمل كلمة سر واسم مستخدم
وسؤالى هو كيفية تجاوز كلمة السر واسم المستخدم الخاصين بالكمبيوتر( السيرفر) برمجيا مع ال connection string


تحياتى
cdcase
انظر اخى هذا الرابط
اضغط هناااااااااااااااااااااااااااااا

فى المشاركة الاولى انه يبحث عن اسم السيرفر ليتم تمريره الى التقرير
وما اريده مثل ذلك ولكن لل connection string
ولكن اسم وكلمة سر ثابتين وغير متغيرين
تحياتى
yaseralshikh

أعذرني على سوء فهمي لك ، بالطبع ليس بالضرورة أن يكون البرنامج وملف قاعدة البيانات data.mdb في مسار واحد ، أنا الأن فهمت قصدك ، ولكني لا أملك إجابة للسؤال وسوف أبحث في الموضوع ، وإن شاء الله ربنا يكرمنا ونلقى جواب أو بديل منطقي ومعقول ..
cdcase
إقتباس(yaseralshikh @ Jan 16 2007, 02:44 PM) [snapback]589424[/snapback]

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


مرحبا
يكفينى يا أخى سعة صدرك بمتابعة سؤالى
وانا من جانبي ببحث بإذن الله
وان شاء الله هنتوصل الى حل بإذن الله
تحياتى
ahmedd
اللله يجعل في كل حرف كتبتة اخي حسنة في ميزان حسناتك والله يوفقك في امتحاناتك المقبلة
هذا الدرس يجب ان يثبت يجب ان يثبت انا اناشد المشرفين على التثبيت ليستفيد الجميع
انا بانتظار بقيه الدرس على احر من الجمر
فلسطيننا
السلام عليكم ...
أخي الكريم على حد علمي أن قاعدة البيانات من نوع MS Access ليست بها خاصية الصلاحيات يعني أنت تنشأ أتصال لها عن طريق Dot Net وبعد هيك وين ما تحطها حطها على الهارد ديسك HardDisk ولا أعتقد أنها ممكن ان يقوم اكثر من شخص بالعمل عليها في نفس الوقت ....
اذا أردت multi User فعليك أستخدام sql Server وانصحك بالانتقال إلى 2005 فهي سهلة التعلم وتشبه في تعاملها الأكسيس ( بالنسبة للمبتدئين طبعا)

وأن أردت الأستزادة يوجد ملف قد قرأته للأخت الكريمة Zahrah مشرفة قسم الاكسيس يبين لنا الفروق بين الأكسيس والSql server ::.. أستخدم محرك بحث الموقع للحصول عليه ..::
والسلام خير ختام
yaseralshikh

أخي cdcase أنا اتفق مع أخي فلسطيننا في الرأي ، اذا أردت multi User فعليك أستخدام sql Server .

أخي ahmedd سوف أبدأ في الإعداد وكتابة تكملة الدرس خلال اليومين القادمين .. إن شاء الله .
cdcase
إقتباس(yaseralshikh @ Jan 21 2007, 11:18 PM) [snapback]591486[/snapback]

أخي cdcase أنا اتفق مع أخي فلسطيننا في الرأي ، اذا أردت multi User فعليك أستخدام sql Server .

مرحبااااا
اخوانى فلسطيننا و yaseralshikh

اعتذر جدا يبدو انى لا اجيد توضيح ما اريد
بالنسبة للاكسس فتنفع أن تكون multi User مع بعض صلاحيات المستخدمين (انها تصلح) جدا

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

وسؤالى هو كيفية تجاوز كلمة السر واسم المستخدم (((( الخاصين بالكمبيوتر( السيرفر))))) برمجيا مع ال connection string أو بدونه وليس الخاصين بقاعدة البيانات تلك هية المشكلة

تحياتى
abetry
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
شرح رائع وسلس وطيب
بارك الله فيك أخي وجزاك الله خيراً
نحن في انتظار باقي الدروس وخصوصاً الوضع المنفصل
omran555
عزيزي cdcase 72_72.gif
السلام عليكم
بعد إذن استاذي ياسر الشيخ
إن جهاز السيرفر يتم فتحه من قبل السوبر فايزر المكلف به والذي يتطلب منه كلمة السر واسم المشغل أما الأجهزة المترابطة معه فبمجرد فتح جهازك والدخول باسم المشغل الخاص بك وكلمة السر فان ذلك يسمحلك بالدخول إلى الأجهزة المترابطة مع الخادم ورؤية الملفات والمجلدات التي لها خاصية الشير وبالتالي فإن الاتصال بقاعدة البيانات لا يحتاج إلا إلى كلمة السر الخاصة بقاعدة البيانات فقط حتى يمكنك الولوج إليها والتعامل مع سجلاتها هذا طبعا ما أظنه واعلمه والله أعلم منا جميعا وخير دليل للتأكد من ذلك التجربة التي لن تكلفك شئيا سوى بعض الوقت والجهد وأرجو من الله ان تنجح
omran555
استاذ ياسر الشيخ
السلام عليك ورحمة الله
زادك الله علما ونفع بعلمك عباده المؤمنين وأعطاك الله بكل حرفا تكتبه حسنة والحسنة بعشر أمثالها
أنا من المتعطشين لما وعدتنا به من تكملة الدرس وعدم التأخر .... فالله الله .... في سرعة الاستكمال وجزاك الله عنا كل الخير واسمحلي بالتطاول عليك بالرجاء أن تبين وباسهاب عملية البحث عن سجل ، وحفظ سجل ، وتحديث بيانات سجل .. عند التعامل مع قاعدة البيانات في الوضع غير المتصل ومختلف الطرق التي يتم بها ذلك لأنني حسب ما تعلمت من الدروس السابقة أن هناك اكثر من أمر لفعل ذلك مثل commandbuilder و currencymanager و bindingcontext و dataadapter.update وغيرها إن وجدت
yaseralshikh

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

اتمنى لك التوفيق في امتحاناتك، واسأل الله أن يجعلها سلسة سهلة لما تفعله من خير

نقدر لك ظروفك، وبشرنا بنتائجها

والسلام عليكم ورحمة الله وبركاته
icetalks
عندي مشكلة الرجاء حلها لي ... أنا مبتدئ والحمد لله .... عندي المشكلة التالية :
عرفت داتا بيز جديدة على ال sql عندي وسميتها client وكل ما اطلب conn.open يعطيني system Error وما يرضى يدخلني على الداتا بيز مع العلم انو ما في يوزر نيم أو باسوورد على الداتا بيز واسم قاعدة البيانات صحيح وكل شي تما ما أعرف شو المشكلة .. راح اورجيكم الكود اللي كتبته :
If txtUserName.Text.Length = 0 And txtPass.Text.Length = 0 Then
MessageBox.Show("please Enter Your name and Password")
Exit Sub
End If

Dim conn As New SqlConnection
Dim cmd As New SqlClient.SqlCommand
Dim da As New SqlDataAdapter
Dim ds As New DataSet

conn.ConnectionString = "server=(PC100-042295F4E);Database=client;user id = ; password="

cmd.CommandText = "SELECT * FROM Users_Tb" ' where User_UserName=" + txtUserName.Text + " and User_Pass=" + txtPass.Text
cmd.Connection = conn
Try
conn.Open()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

da.SelectCommand = cmd
Try
da.Fill(ds)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

If ds.Tables(0).Rows.Count <> 0 Then ' if no any row in dataset ...... that mean the pass & UserName not found
MessageBox.Show("Please Check UserName and Password")
Exit Sub
End If

End Sub
رجاء ساعدوني ... كود فحص اليوزر نيم والباسوورد ان كانت صحيحة يدخل البرنامج وان كانت خطاً يطلع.
abetry
كود
  

[size="3"]conn.connection=workstation id= PC100-042295F4E;packet size=4096;integrated security=SSPI;data source=" PC100-042295F4E ";persist security info=False;initial catalog= client[/size]
هذه "نسخة - خفيفة" من محتويات الرئيسية للإستعراض الكامل مع المزيد من الصور والخيارات الرجاء إضغط هنا.
Invision Power Board © 2001-2009 Invision Power Services, Inc.