| السلام عليكم ورحمة الله وبركاته هذا هو
الدرس الاخير في طرق ربط قواعد البيانات باستخدام
C شارب, حقيقة هذا مو
درس جديد هو عبارة عن امتداد للدرس الي فات .
خلونا نتذكر اش سوينا في الدرس الي فات: اول
حاجة عملنا فورم بسيط واستخدمنا
Adapter عشان نربط ما
بين قاعدة البيانات والفورم وبعد كذا انشئنا
DataSet وسميناها
dataSet11 والي عن
طريقها راح نسوي كل العمليات الممكنه على قواعد
البيانات (INSERT, UPDATE ,
DELETE) المهم, الحين راح نشوف كيف نسوي
ادخال لبيانات جديده على هذي الـ
dataSet11
الفكره مره بسيطه وهي نفس الفكره الي
استخدمناها في ادخال بيانت لأي اوبجكت من نوع
DataTable (كما ورد في
الدروس السابقه) بس كل الي علينا نسويه هو تحديد
الجدول المراد ادخال بيانات فيه
لانه الـ dataSet11
ممكن يكون فيها اكثر من جدول.
تمهيد:
الـ DataSet ممكن
ننشئها برمجيا عن طريق انشاء
Adapter وتحديد SELECT
COMMAND لهذا الـ
Adapter و Connection
وبعد كذا انشاء ملف XML
فيه مواصفات قاعدة البيانات امراد الربط
معاها وهذي المواصفات تشمل اسماء الجداول واسماء
كل عمود في كل جدول وكل الـ
Constraints لكل جدول, والـ
DataSet الي ننشئها
بهذي الطريقه نسميها Weak
DataSet وعشان ندخلها بينات خلونا نفرض
السيناريو التالي: عندنا جدول اسمه
MyTable وفيه اعمده
اسماؤهم Column1,Column2,
Column3 واسم الـ
DataSet هو myDataSet
فالكود راح يكون زي كذا تقريبا:
في حالة استخدام DataRow
Object |
|
DataRow dr =
myDataSet.Table["MyTable"].NewRow ();
dr["Column1"]
= "Anything";
dr["Column2"]
= "Anything";
dr["Column3"]
= "Anything";
myDataSet.Table["MyTable"].Rows.Add (dr); |
| في حالة استخدام Array of
objects |
|
object
newEntery[] = new object[] {"Anything",
"Anything", "Anything"};
myDataSet.Table["MyTable"].Rows.Add (newEntery); |
| لكن اذا احنا انشئنا الـ
DataSet طريق الـ
Wizard (وهذي الطريقه اسهل بكثير من
الطريقه الاولى) زي ما شفنا في الدرس السابق فتسمى
الـ DataSet الي انشئت
Strong or typed DataSet
بحيث انه الـ Compiler
بعد ما ينشئ الـ DataSet
راح يضيف لها اسماء الجداول واسماء الاعمده
لكل جدول واسماء الـ
Constraints لكل جدول بطريقه اوتوماتيكيه
وهذا راح يوفر علينا
كثيــــــــــــر
من الوقت والجهد, خلونا نكتب الكود الي فوق بس
تخيلوا انه احنا عملنا الـ
DataSet عن طريق الـ
Wizard , بمجرد ما تكتب اسم الـ
DataSet و بعدين تكتب
الـ Dot Opertator (.)
الكمبيوتر راح يطلعلك اسماء الجدوال, الكود راح
يكون زي كذا: |
|
DataRow dr =
myDataSet.MyTable.NewRow ();
dr["Column1"]
= "Anything";
dr["Column2"]
= "Anything";
dr["Column3"]
= "Anything";
myDataSet.MyTable.Rows.Add (dr); |
| السيناريو: على نفس الفورم الي موجود في
الدرس السابق راح نضيف Group
Box ونسميها
enteryGroup فيها 3
Labels مكتوب عليهم ID,
Name, Phone وقدام كل
Label راح يكون في
TextField
واسمهم idEntery,
nameEntery, phoneEntery بس راح نخلي الـ
enteryGroup مفعله,
وبعد كذا راح نضيف زرين داخل الـ
enteryGroup واحد مكتوب
عليها Submit والي راح
يقوم بعملية الادخال والثاني مكتوب عليه
Cancel والي راح يلغي
عملية الادخال, بعد كذا راح نضيف زر للفورم (خارج
الـ enteryGroup) وراح
يكون مكتوب عليه New Record
وهو الي راح يكون مسؤول على تفعيل الـ
enteryGroup , راح يطلع
الفورم تقريبا زي الي موجود في الصوره الي تحت
|
|

|
| الحين المستخدم لما يضغط على الزر
الي مكتوب عليه New Record
المفروض يتم تفيعل
enteryGroup و
تعطيل نفسه, عشان نسوي كذا خلونا نضيف
event للزر الي مكتوب
علليه New Record عن
طريق الضغط عليه مرتين (Double
Click) وبعد كذا نقوم بكتابة الكود التالي: |
|

|
| اوكي, وكمان راح نضيف
Action او event
للزر الي مكتوب عليه Cancel
بحيث انه بمجرد ما يضغط المستخدم على هذا
الزر يقوم بتعطيل الـ
enteryGroup وتفعيل الزر الي مكتوب عليه
NewRecord, بنفس الطريقه الي فوق نضيف
الكود التالي: |
|

|
| الحين ما باقي علينا الا شيء واحد وهو اضافة
اكشن للزر الي مكتوب عليه
Submit والي راح يضيف البيان الجديد للـ
DataSet الي اسمها
dataSet11, الكود راح
يكون زي كذا: |
|

|
| بس يا ليت لو تلاحظوا انه الكود تبع الادخال
انا كاتبه وسط try catch
clause عشان ممكن يصير خطأ معين (تكرار
للمفتاح الاساسي) فبدل ما يعلق البرنامج ويصير
hang
up يطبع مسج مفادها انه
في خطأ, المهم الحين بعمل test
للبرنامج تبعي وراح اضغط على الزر الي
مكتوب عليه << عشان اروح لآخر بيان وبعد كذا راح
نشوف الصوره تبعها بس عشان نتأكد, شوفوا الصوره
الي تحت |
|

|
| لحظوا الـ ID لآخر
بيان هو 8 , خلون نضيف بيان جديد ونعطيه
ID رقم 9 بس عشان نتأكد
هل الكود تبعنا شغال ولا لا, شوفوا الصوره الي تحت |
|

|
| من الصوره الي فوق يظهر انه برنامجنا شغال,
طيب خلونا نشوف قاعدة البيانات الاصليه هل
برنامجنا فعلا قام بتحديثها ولا لا, خلونا
نشوف الصوره الي تحت |
|

|
| لحظوا في الصوره الي فوق انه ما صار اي تغيير
في قاعدة البيانات الاصليه, طيب اش الفايده من هذا
البرنامج او الطريقه طلما انه قاعدة البيانات
الاصليه ما تحدث؟ بصراحه هذي خيبة امل كبيره
لكثير من الناس لانه برنامجنا في هذي الحاله هو
inconsistent يعني غير
محتوي او بالبلدي "ما فيه هرجه" , بس هنا يجي دور
الـ Adapter.
الـ Adapter فيه
method اسمها
Update تاخذ
DataSet كــ
parameter , لما تستخدم
الـ Update Method
وترسلها DataSet الـ
Adapter يشوف هل في
تغيير على الـ DataSet
صار بعد اخر مره صارلها Fill
(التغيير يشمل اضافه او حذف او تعديل) اذا
نعم راح يفتح الـ connection
الي بينه وبن قاعدة البيانات الاصليه ويقوم
بالـ SQL Command
المناسب عشان يسوي هذا التغيير وبهذي الطريقه احنا
نقدر نحل المشكله تبعنتنا , وهذي الطريقه مره سهله
وتوفر وقت وجهد بحيث انه الـ
Adapter هو الي راح يفتح الـ
connection ويكتب اوامر
الـ SQL ويسوي كل حاجه,
باقي خطوه وحده
وهي وين نكتب او نستدعي الـ
Update Method هل نستدعيها في كل مره احنا
ندخل فيها بيان جديد ؟
الاجابه هي طبعا لا, لانه لو سوينا كذا ما صار
في فايده من الـ DataSet
او انه ليه ما نستغني عن الـ
DataSet ونكتب برنامجنا
بحيث انه احنا كل ما نبغى نضيف بيان جديد نكتب امر
SQL Command ونسويله
ExecuteNonQuery زي ما
شفنا في الدروس السابقه.
ااحنا اساسا استخدمنا الـ
Adapter والـ DataSet
كله عشان نوفر وقت لانه عملية فتح الـ
Connection وإغلاقه
تاخذ وقت (هنا في حالتنا هذي ما راح نلاحظ التأخير
الي يصير)
فاحسن طريقه او وقت نستخدم الـ
Update Method هو لما
نغلق البرنامج تبعنا او قبل لا يسوي البرنامج
تبعنا Terminate ,
وعشان نسوي كذا نضيف event
للفورم تبعنا واسم الـ
event هي Closing
وهذي تصير قبل لا يسوي البرنامج تبعنا
Terminate , نقوم
بتحديد الفورم ومن الـ
properties نضغط على زر الـ
events الي عليه رسمة
رعد ومنها نعمل double click
على كلمة Closing,
الصوره الي تحت تبين العملية:
|
|

|
| بعد كذا راح يفتح الـ Code
Editor وهنا نضيف الكود التالي: |
|

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

|
| لاحظوا انه تم التعديل, كذا يكون درسنا انتهى
وكمان دروس طرق ربط قواعد البيانات بلغة سي شارب
انتهت والي عنده اي سؤال او استفسار
يسأل ولا
يستحي
اخوكم.........Robatic
|