السلام عليكم

اليوم راح نكمل عن قواعد البيانات بس خلوني اقلكم انه كل العمليات الي في الدروس السابقه سواء كان تعديل على قاعدة البيانات او ادخال او حذف كله هذا يسمونه connected environment

يعني البيئه المتصله  المقصود بها قاعدة البيانات.

لو تلاحظوا كل ما نبغى نسوي اي عملية في الدروس السابقه كنا لازم نعمل open للـ connection وبعد كذا نقفله, يعني التعديل مباشر والربط مباشر لقاعدة البيانات.

في طريقة ثانيه وبسيطه  ومره سهله واكثر الناس يستخدمونها الي هي الـ disconnected environment وملخصها انه احنا في بداية برنامجنا راح نعمل كنكشن مع قاعدة البيانات تبعتنا وراح ناخذ

منها كل السجلات الي نبغاها (ممكن تكون على حسب شرط معين) وراح نخزنهم في شيء اسمه DataSet الي راح يكون هو مصدر البيانات لنا بدل ما نعمل فتح للكنكشن في كل مره احنا نبغى بيانات

من قاعدة البيانات وعشان نسوي العملية هذي يلزمنا اول حاجه شيء اسمه Adapter ممكن يكون OledbDataAdapter للاكسس مثلا او SQLDataAdapte لــ Microsoft SQL Server

والـ Adapter نفسه يحتاج الى كنكشن و selectCommand وبعد كذا  لازم نسوي XML file فيه مواصفات قاعدة البيانات الي هي تتضمن:

1) اسم ومكان قاعدة البيانات

2) اسماء الجداول الموجوده لقاعدة البيانات

3) اسماء الـ Stored Procedure

4) اسماء الاعمده الي في الجداول

5) الـ Constraint الموجوده في الجداول

6) العلاقات الي بين الجداول

انشاء اوبجكت من Adapter و Connection و Command سهل بس المشكله كلها في ملف الـ XML الي ممكن يوصل لي 800 سطر او اكثر  لقاعدة بيانات موجود فيها 5 جداول وبينهم علاقات

وممكن الواحد يغلط في امر او في شيء بسيط وصعبه عملية الـ debug بس لحسن الحظ انه في component جاهزه وعن طريقها في wizard تعملي الكلام كله هذا في ضغطة زر وحده

وهذا هو الهدف الي بسببه اخترع الكمبيوتر. اساسا.  خلونا نبداء.

 

السيناريو:

احنا راح نسوي فورم بسيط يعرض السجلات الي موجوده في قاعدة البيانات الي استخدمناها في الدروس السابقه واسمها Robatic السجلات خاصه بالجدول People وهي عباره عن

ID, Name & Phone , الفورم راح يكون بسيط جدا وشكله تقريبا زي كذا

 

 

بحيث انه الـ text field الي مقابل الـ ID راح نسميه idField والي مقابل الـ Name راح نسميه nameField والي مقابل الـ Phone راح نسميه phoneField اما بالنسبه للازرار فراح نسميهم

first, back, next & last من اليسار لليمين, الحين بعد ما صممنا الفورم واعطينا اسماء لاجزائه بقي علينا نضيف الـ Adapter تبعنا وبما انه قاعدة البيانات تبتنا مصممه عن طريق برنامج

الـ Access فراح نستخدم OledbDataAdapter وعشان نسوي هذي العمليه خلونا نشوف الصوره التاليه

 

 

بعد ما نضغط double click على الـ OledbDataAdapter راح تجينا wizard بسيطه جدا نبعها خطوه بخطوه واول خطوه هي الي عن طريقها راح نحدد الكنكشن مع قاعدة البيانات

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

 

 

وبعد ما نختار كنكشن جديد لازم نحدد نوعه , المقصود بنوعه اما Microsoft JET 4.0 او MSSQL او Orqcle وفي حالتنا هذي راح نختار النوع الاول عن طريق الضغط على الـ Tab Button

الي مكتوب عليه Provider والصوره التاليه توضح العمليه:

 

 

بعد كذا نضغط على زر Next عشان نحدد وين قاعدة البيانات موجوده على الهارد دسك زي ما هو موجود في الصوره التاليه:

 

 

بعد ما نحدد قاعدة البيانات يستحسن التأكد من الربط عن طريق الضغط على زر Test Connection واذا كان الربط صحيح راح يطلعلك المسج التالي:

 

 

وبعد كذا تعطيه OK, فوق انا قلت انه الـ Adapter يحتاج كنكشن و selectCommand الحين احنا  ما سوينا الا الكنكشن باقي الـ selectCommand , كل الي عليك تسويه انه تضغط على زر

Query Builder وبعدين راح تجيك قائمه باسماء الجداول الموجوده في قاعدة البيانات ومنها تختار الجدول الي تبغاه , خلونا نشوف الصوره الي تحت:

 

 

بعد ما تضيف الجدول لو تلاحظوا راح تشوف الجدول ورا وفيه قائمه باسماء الاعمده تبعه وفي واحد او اكثر من واحد غامق شويه (Bold) وهذا يعني انه Primary Key من هذي القائمه انت

تقدر تختار بالزبط اش هي الاعده الي تغاها زي ما هو موجود في الصوره الي تحت:

 

 

وبعد كذا تعطيه اوكيه وبعدين تضغط على finish وراح تجيك رساله مفادها انه هل انت تبغى تحت كلمة مرور لقاعدة اليبانات ولا لا, وانت حر بس حاليا اختار لا (don't include password).

الحين بعد ما خلصنا من الربط باقي علينا نسوي الـ DataSet الي عن طريقها راح نستغني عن قاعدة البيانات الاصليه ومنها راح نعرض البيانات بالشكل الي نبغاه ونضيف عليها ونعدل ونمسح

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

المهم قبل لا ندخل في تفاصيل الـ DataSet خلونا شويه نتكلم على شيء اسمه DataTable:

الـ DataTable هو كلاس في السي شارب موجود داخل الـ namespace الي اسمه System.Data وهذا الكلاس يعطيك القدره على انشاء جدول زي اي جدول موجود في قاعدة بينات, يعني

تقدر تحددله مفتاح اساسي او مفتاح اجنبي وكمان تحت constraint زي ما تبغى, طبعا الـ DataTable له 2 overloaded constructor واحد ياخذ string كـ argument وهي الي تحدد اسم

الجدول والثاني ما ياخذ ولا argument , بعد ما تنشئ اوبجكت من DataTable في البدايه يكون الجدول فاضي ما فيه لا سجلات ولا اعمده, انت تقدر تضيف اعمده زي ما تبغى عن طريق

الـ property الي اسمها Columns الي عن طريقها انت تقدر تدخل على الـ method الي اسمها Add وهذي الميثود لها معرفة بخمسة اشكال وحده منهم تاخذ string الي يحددلنا اسم العمود

وكمان تاخذ type الي يحددلنا نوع البيانات الي ممكن تتخزن في هذا العمود, بعد ما تضيف اعمده تقدر تحدد مين منهم unique او not null  بس ابغى اقلك انه الاعمده هذي تتخزن كانها array

فمثلا افرض انه احنا عندنا اوبجكت من نوع DataTable واسمها dt وهذي الاوبجكت فيها اعمده وحنا نبغى نوصل لهذي الاعمده, نستخدم الكود التالي:

dt.Columns [0].Unique = true;

dt.Columns [1].allowDBNull = false;

رقم 0 في الكود الي فوق يدل على انه انا حاليا دخلت على العمود الاول ورقم 1 يدل على العمود الثاني (Array), ممكن بدل الارقام انا اكتب string وهذا الافضل لانه الارقام ممكن تلخبط ولكن

الـ string واضحه بحيث انها تدل على اسم العمود الي ارسلناه كـ argument في الميثود Columns.Add , شوفوا معايا الكود التالي:

dt.Columns ["Column1"].Unique = true;

dt.Columns ["Column2"].AllowDBNull = false;

زهلم جرا, طيب باقي عملية الاضافه في هذا الجدول, وهذي الاضافه مره بسيطه كل الي عليك هو استخدام property الي اسمها rows التابعه للكلاس DataTable الي عن طريقها تدخل على ميثود

اسمها Add وهي معرفه بشكليه واحد ياخذ array of objects كـ argument والشكل الثاني ياخذ DataRow كـ argument خلونا نشوف كيف:

* Array of Objects as Argument:

object newEntry[] = new object [] {"value 1", "value 2", "value 3", .......... , "value n"};  // suppose we have n columns

dt.Rows.Add (newEntry);

* DataRow as Argument: اول حاجه الداتا رو لازم تكون مطابقه للداتا تابل بحيث يكون لهم نفس عدد الحقول يعني ما يصير تضيف داتا رو فيها 7 حقول لداتا تابل فيها 3 اعمده فعشان كذا

اول حاجه راح ننشئ اوبجكت من نوع DataRow وراح نستخدم اوبجكت من نوع DataTable عشان نسوي المهمه وهذا عن طريق استخدام ميثود موجوده في الـ DataTable اسمها NewRow

الي راح تعطينا داتا رو بنفس مواصفات الداتا تابل, وبعدين عشان نعطي قيم للداتا رو لازم اول شيء نعرف انه الداتا رو زي الـ Array فهذا يعني لازم نعطيه رقم العمود او اسمه, فخلونا نشوف الكود

التالي:

DataRow dr = dt.NewRow ();

dr [0] = "value 1";

dr [1] = "value 2";

dr [2] = "value 3";

.

.

.

dr [n] = "value (n+1)";

dt.Rows.Add (dr);

او بدل الارقام الي وسط القوسيم [ ] ممكن نكتب اسم العمود مثلا ["column 1"] , خلونا نشوف كود كامل للعمليه ونشوف مخرجات البرنامج

 

 

lملاحظه: في البرنامج الي فوق حاول تدخل سجلين لهم نفس الـ ID.

الموال هذا كله الي فوق بس عشان نوصل الى انه الـ DataSet تاخذ نفس مبدىء الـ DataTable بس الفرق بينهم انه الـ DataSet ممكن تحتوي على اكثر من Table فاحنا نحدد الـ Table الي نبغاه

اما برقمه او باسمه  (Array) , المهم خلونا نرجع  لموضوعنا,   اخر شيء وصلناله هو كيف ننشيء DataSet بعد ما تضيف Adapter للفورم تبعك راح تلقاه تحت زيه زي لما تضيف مثلا

Timer المهم تضغط عليه بالزر الي يمين وراح تجيك popup menu منها تختار امر Generate DataSet زي ما هو موضح في الشكل الي تحت:

 

 

بعد كذا تراح تجيك menu من خلالها تحدد اش اسم الـ DataSet او ممكن يكون عندك DataSet موجوده من اول فتقوم بتحديثها وكمان ممكن يكون عندك عدة Adapters او اكثر من جدول في Adapter واحد وانت تحدد الي تغباه زي ماهو موجود في الصوره الي تحت:

 

 

لاحظوا اسم الـ Adapter تبعنا oledbDataAdapter1 واسم الداتا ست تبعتنا Dataset11 في الصوره فوق مكتوب DataSet1 ولكن هذا مو اوبجكت هذا كلاس يه ملف الـ XML الي فيه مواصفات

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

الحين باقي نربط بين الـ Text Fields الي عندنا مع البيانات الموجوده في الداتا ست, يعني الـ ID مع الـ idField وهلم جرا, كل الي عليك تسويه انه تحدد الـ idField ومن الـ propertes تروح

لـ DataBindings وراح تلقى على يسارها زر مكتوب عليه + افتح الزر هذا وراح على Advanced وبعدين اضغط عبى ابزر الي في اليمين زي ما هو موضح في الصوره الي تحت

 

 

بعد كذا راح تجيك قائمه  اختار منها Text ومن الـ Drop Down List حدد الداتا ست ومنها حدد الجدول ومنه حدد الحقل الي تغى باناته تظهر في الـ idField زي ما هو موضح في الصوره الي تحت

 

 

كرر العمليه لباقي الـ Fields الي عندك nameField & phoneField , الحين لو عملت run لبرنامجك ما راح يظهر شيء لانه ما اخذنا البيانات او ما عبينا الداتا ست بالبيانات من قاعدة البيانات الاصليه, عشان نسوي كذا لازم نعبي البيانات من قاعدة البيانات الاصليه مره واحده بس لانه لو عبينا في كل مره راح تصير العمليه زي الي في الدروس السابقه يعني ما استفدنا شيء

فالحين يبغالنا event تصير مره وحده والي هي OnLoad فخلونا نضغط double click على الفورم عشان ندخل على هذي الـ event ونكتب الكود التالي الي فيه استخدمت الميثود Fill التابعه

للـ Adapter وهذي الميثود مكتوبه باكثر من شكل  وواحد منها ياخذ DataSet كـ argument

 

 

الحين لو تجرب وتعمل run للبرنامج تبعك النتيجه مفروض تكون زي كذا:

 

 

لاحظوا انه البيانات هذي الموجوده على الفورم هي من الداتا ست وهي في اول سجل والي سبب هذا الكلام هو الـ DataBindings لكل الفيلدز الي عندنا بحيث انه الكمبيوتر بمجرد ما تعمل DataBindings راح ينشئ شيء اسمه BindingContext وهذا  ياخذ DataSet واسم الجدول كـ arguments وعن طريقه في property اسمها Position تساعدك في تحديد رقم السجل الي تبغاه يظهر لانه في الاخير البيانات مخزنه في وعاء ماشيء على نفس مبداء الـ Array فاذا انت قدرت تتحكم بالـ index تبع الـ Array راح تتحكم ببيانات هذي الـ Array , خلونا نشوف لو عدلنا الكود الي موجود في الـ OnLoadEvent وخليناه زي كذا اش ممكن يصير:

 

 

لاحطوا في البدايه اول ما نعمل Fill للداتا ست الـ Position تبع الـ BindingContext للجدول People راح يكون 0 فهنا انا زودت عليه 1 يعني صار 1 النتيجه راح تكون غير عن الاول اذا عملت run للبرنامج تبعك راح يجيبلنا البيانات الي موجوده في الصف الو السجل الثاني من الداتا ست , خلونا نشوف الصوره الي تحت:

 

 

لاحظوا اختلفت النتائج عن الفورم الموجود فوق, فحلونا نلغي التغيير الي سوينها في الكود ونرده زي ما كان اول مره, باقي علينا نفعل الازرار الي تحت بحيث انه لما المستخدم يضغط على زر back

ينقل الـ Position خطوه للوراء ولما يضغط على زر next يتقد خطوه لقدام  ولما يضغط على first يروح لأول سجل ولما يضغط على last يروح لآخر واحد

سؤال: كيف تعرف كم سجل عندك حاليا في الداتا ست ؟

عن طريق property موجدوده في الـ Dataset او الـ BindingContext  اسمها Count الي راح ترجعلك عدد السجلات او الصفوف الي موجوده حاليا في الـ DataSet او الـ BindingContext

افيبغالك تعمل Double Click على كل زر وتضيف الاكواد التاليه:

 

الضغط على زر back

الضغط على زر next

الضغط على زر first

الضغط على زر last

 

وكذا برنامجنا جاهز, بس احب انوه الى انه البيانات الي راح تظهر في الفورم مهي من قاعدة البيانات الاصليه هذي البيانات جايه من الـ DataSet يعني حاول تجرب تضيف سجل جديد في قاعدة البيانات الاصليه والبرنامج شغال وشوف في الفورم هل راح يظهر هذا السجل الجديد ولا لا.

وكذا يكون خلصنا الدرس وانشاء الله تكونوا استفدتوا وفي الدرس الجاي راح نسوي تعديلات بسيطه ونخلي الفورم تبعنا يدخل بينات الى قاعدة البيانات باستخدام الـ DataSet بدل ما نفتح الكنكشن ونقفله

في كل مره نقوم فيها بادخال بيان جديد

ومره ثانيه انشاء الله يكون كل شيء واضح ومفهوم واي واحد عنده سوال او استفسار يسأل وانشاء الله ما نقصر معاكم

 

اخوكم ....................Robatic

 
 
 
Hosted by www.Geocities.ws

1