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