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

كيف الحال؟؟؟؟؟ انشاء الله بخير  ونعمه

موضوع اليوم بإذن الله راح يكون عن كيفية الربط بقاعدة بيانات مصممه عن طريق برنامج الـ Access بلغة C#

والموضوع مره سهل لأبعد الحدود

الكود الي راح نكتبه ما يتعدى 8 او 15 سطر فقط

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

قبل كل حاجه احب اقلكم انه لما الواحد يبغى يربط قاعدة بيانات لازم يحددلها شيء اسمه Provider يعني الداعم تقريبا وهذا الـ Provider يكون على حسب طبيعة او البرنامج الي استخدمناه لإنشاء قاعدة البيانات, مثلا لو زي حالتنا هنا احنا راح نربط قاعدة بيانات مصممه ببرنامج الاكسس يعني  الـ Provider راح يكون JET OLEDB 4.0

واذا كانت القاعدة مصممه ببرنامج Microsoft SQL Server راح يكون الـ Provider هو SQL OLEDB  

وفيه انواع غيرها  مثلا للـ Oracle له نوع معين.

 

المهم خلونا ندخل في موضوعنا

اول حاجه لازم نسوي قاعدة بيانات, في مثالنا هذا خلونا نسميها Robatic وفيها جدول اسمه People وهذا الجدول يحتوي على ثلاثة Fields (اعمده) اول واحد باسم ID وهو الـ Primary key

والثاني باسم Name والاخير باسم Phone

وبعد كذا نقوم بادخال كم سجل على هذي القاعده.

الحين عشان احنا نقدر نوصل لقاعدة البيانات برمجيا لازم نستخدم الـ classes الي موجوده في الـ namespace الي اسمه System.Data  وكمان System.Data.Oledb

يعني لازم نكتب في بداية البرنامج تبعنا الجملتين التاليه:

using System.Data

using System.Data.Oledb

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

لازم نستخدم عبارة new وبعدها الـ constructor تبع OledbConnection وهذا الكونسركتور ممكن ياخذ string كـــ argument وهذا الـ string عباره عن connection string يعني فيه كل المعلومات الي نحتاجها او الي الكمبيوتر يحتاجها عشان يربط مع قاعدة البانات , واهم هذي المعلومات هي نوع الربط او الـ Provider ومكان قاعدة البيانات على الهادر دسك (ممكن تكون على سيرفر)

وفي معلومات ثانيه زي  مثلا كلمة المرور  ووجهة الاتصال في حالة النظم الموزعه وهل جهة الاتصال موثوقه وكم الـ time out للإتصال بس اهم معلومتين الي  هيه طريقة  الربط Provider

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

بعد ما نقوم بالاتصال بقاعدة البيانات باقي علينا نطبق عمليات استفسار لقاعدة البانات, يعني نطبق SQL Statements عن طريق لغة السي شارب, هنا يجي دور الكلاس OledbCommand

من اسمه نعرف  انه  مسؤول عن تنفيذ اوامر SQL على قاعدة البيانات  الي هي Select, Insert , Update , Delete, Create, Alter

فلما ننشيء اوبجكت من نوع OledbCommand نستخدم الكونستركتر تبع هذا الكلاس  الي  ممكن ياخذ 2 arguments الاولى من نوع string والي  هي تمثل  امر الـ SQL والثانيه من نوع

OledbConnection وهي الي راح يكون فيها الاتصال

 

باقي اخر واهم خطوه وهي كيف  نعرض  البيانات في لغة سي شارب  سواء اذا كان المشروع  تبعنا  console application او windows application او ASP web application

وهذي العملية ممكن نسويها باشكال  كثيره جدا ولكن هنا في موضوعنا  خلونا  نشوف  اسهل طريقه وهي انه نعرف اوبجكت من نوع OledbDataReader وهذا الانوع من الكلاس  ماله كونستركتر

طيب  كيف ممكن  نسوي  اوبجكت  منه ؟؟؟؟؟!!!

عن  طريق اوبجكت  من  نوع OledbCommand وبالتحديد عن  طريق  مثود اسمها ExecuteReader

خلونا نشوف السيناريو التالي:

افرض  انه احنا سوينا  كونكشن لقاعدة بيانات معينه  وانشئنا  اوبجكن  من نوع OledbConnection وسميناها cn وبعدين انشئنا اوبجكت من نوه OledbCommand وسميناها cmd وخلينا

الـ CommandText لها هو Select * From someTable بعد كذا سوينا اوبجكت  من  نوع  OledbDataReader  وبعد كذا نفذنا الامر زي  ما  هو موجود في  الكود التالي:

 

OledbConnection cn = new OledbConnection (@"Provider=Microsoft.JET.OLEDB.4.0;Source Data="\......\someDataBase.mdb");

OledbCommand cmd = new OledbCommand ("Select * from someTable", cn);

OledbDataReader rdr;

try {

cn.open ();

.// here will be our code that displays records from someDataBase.someTable

cn.close ();

}

 

باقي مشكله وحده  وهي : كم عدد السجلات الي  ممكن نحصل  عليها بعد تنفيذ امر الـ SQL الي  موجود في الاوبجكت cmd ؟ ممكن تكون 0  او ممكن تكون 100000

كيف  احنا  ممكن  نسوي  loop معين بحيث  انه يمشي  لكل الاحتمالات ولا يصير  عندنا DataOutOfRangeException ؟

كلاس الـ OledbDataReader فيه مثود اسمها Read وهذا الميثود ترد قيمة بولينيه يعني اما true او false بس  خلونا نتعررف  اكثر  على  طبيعة الـ OledbDataReader

اول ما نستخدم الميثود تبع الـ OledbCommand.ExecuteReader راح يرجعلنا  عدد معين  من السجلات ممكن يكون 0  او  اكثر

الـ OledbDataReader راح تستقبل هذي السجلات وترتبها كــ array يعني كل سجل  راح  ياخذ index من 0 الى عدد السجلات ناقص واحد بس الـ OledbReader راح يأشر  على index -1

اول ما نستخدم الميثود Read راح ينتقل الـ OledbDataReader الى الـ index الي  بعده بمقدار  خطوه واحده واذا كان في سجل  راح  يرد  true غير  كذا راح يرد false , الانيميشن التالي

يوضح الفكره:

 

 

زي ما شفنا في الانيميشن الي فوق, في حالة وجود سجلات ناتجه عن تنفيذ امر الـ SQL كل مره نستدعي ميثود Read الي موجوده في OledbDataReader الـ Reader يتحرك خطوه واحده واذا لقي

بيانات بعد ما يتقدم خطوه راح يرجع true اما اذا رجع false هنا نعرف انه وصل لآخر شيء بعدها نقوم بتقفيل الكونكشن وينتهي كل شيء, فخلونا نشوف الكود النهائي لهذه العمليه

 

 

السيناريو: انشاء قاعدة بيانات باسم Robatic ونفرض انها موجوده في الـ drive F ( القسم F من الهارد دسك اذا كان موجود) وبعد كذا نسوي جدول باسم People في هذي القاعده ونعطيها الاعمده التاليه:

1) ID

2) Name

3) Phone

بعد كذا ادخل بيانات زي ما تبغى في الجدول واكتب هذا الكود, بس ياليت بعد ما يتحمل ملف الورد تضغطوا على زر معاينه قبل الطباعه في الورد (Print View) عشان الكود يكون واضح.

بس لو تلاحظوا الجزر الملون باللون الاحمر  لازم يكون موجود وبينه الكود الي  راح يدخل على قاعدة البيانات عشان يقوم بتنفيذ جملة SQL, بمعنى  اخر لازم يكون الكونكشن مفتوح

وبعد م تخلص  من التعديلات  قفل الكونكشن عشان تكون الـ security عاليه لو خليت الكونكشن مفتوح ممكن يصير  دخول غير  مصرح لقاعدة البيانات, وبعدين لو كمان تلاحظوا الكود الي بالاخضر

(جملة while) اول حاجه استخدمنا ميثود Read عشان نحرك الريدر خطوه (زي ما شفنا في الانيميشن الي فوق الريدر في البدايه يكون على عنوان سالب واحد) واذا كان فيه بيانات راح يعطينا true

لـ while وراح ينفذ جملة الطباعه (Console.WriteLine) الي فيها احنا استخدما dr بشكل array بس بدل ما  نرسله رقم صحيح عشان الـ index ارسلناله اسم العمود الي نبغى بياناته تنطبع في الشاشه

وممكن ترسله عدد صحيح بس بشرط يكون هذا على حسب ترتيب العمود الي موجود في قاعدة البيانات يعني في حالتنا هذي الـ ID 0 والـ Name 1 والـ Phone

واذا نبغى نستخدم هذي الطريق بس نعدل الكود الي باللون الاخضر  وراح يكون زي كذا:

 

while (dr.Read ())
Console.WriteLine(dr[0] + ": " + dr [1] + " \t " + dr [2]);
 

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

 

 

بس قبل لا تعمل run تأكد من موقع قاعدة البيانات في الهارد دسك (Path) تبعك الكود الي  هنا يشتغل على فرض انه قاعدة البيانات موجوده في قسم الـ F من الهارد دسك

وكذا انشاء الله يكون غطينا ووضحنا المطلوب واعذرونا على القصوروالموضوع قابل للنقاش

وانشاء الله نشوف كيف ممكن نستفيد من هذا الاسلوب في الـ windos application وراح نشوف طرق ثانيه للوصول لنفس هذي النتيجه

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

Hosted by www.Geocities.ws

1