You are on page 1of 26

‫الفصل السادس‬

‫أساسيات التعامل مع‬


‫قواعد البيانات‬

‫في هذا الفصل‬

‫إنشاء قاعدة بيانات‬ ‫‪‬‬


‫استخدام األداة ‪SqlDataSource‬‬ ‫‪‬‬
‫عرض البيانات من الجدول‬ ‫‪‬‬
‫فلترة البيانات‬ ‫‪‬‬
‫التعامل البرمجي مع قواعد البيانات‬ ‫‪‬‬
‫أساسيات التعامل مع قواعد البيانات‬

‫فً هذا الفصل سنخطو معا الخطوة األولى نحو التعامل مع قواعد البٌانات من خالل ‪ASP.NET‬‬
‫وذلك بهدف بناء مواقع دٌنامٌكٌة المحتوى ‪ .‬سنقوم بالبداٌة بإنشاء قاعدة بٌانات بسٌطة وملئها‬
‫ببعض البٌانات لتطبٌق تمارٌن هذا الفصل علٌها ‪ ,‬حٌث سنتعلم كٌفٌة عرض البٌانات من الجدول‬
‫على صفحة االنترنت ‪ ,‬كما سنتعلم كٌفٌة تطبٌق عملٌات اإلضافة والحذف والتعدٌل على البٌانات‬
‫من خالل األكواد البرمجٌة ‪.‬‬

‫إنشاء قاعدة بيانات‬

‫سنقوم بالبداٌة بإنشاء قاعدة بٌانات بسٌطة من النوع ‪ SQL Server‬وذلك لنتمكن من تطبٌق تمارٌن‬
‫هذا الفصل علٌها ‪ ,‬ابدأ بإنشاء موقع جدٌد ‪ ,‬ثم من القائمة ‪ File‬اختر ‪ New File‬ثم اختر ‪SQL‬‬
‫‪ Server Database‬و سمها ‪ MyDatabase.mdf‬ثم اضغط على ‪. Add‬‬

‫ستظهر رسالة تخبرك بأنه سٌتم وضع قاعدة البٌانات ضمن المجلد ‪ App_Data‬اضغط على نعم‬
‫(‪.) Yes‬‬
‫وبالتالً ستجد فً القسم ‪ Solution Explorer‬أنه تم إضافة المجلد ‪ App_Data‬وبداخله قاعدة‬
‫البٌانات ‪ . MyDatabase‬ننقر علٌها نقرا مزدوجا لٌتم االنتقال إلى القسم ‪. Server Explorer‬‬

‫ننقر نقرة ٌمٌنٌة على المجلد ‪ Tables‬ونختار ‪ , Add New Table‬ونضٌف الحقول بالشكل التالً‪:‬‬

‫‪Column Name‬‬ ‫‪Data Type‬‬ ‫‪Allow Nulls‬‬


‫‪Id‬‬ ‫‪int‬‬ ‫‪No‬‬
‫‪Name‬‬ ‫)‪Nvarchar(50‬‬ ‫‪No‬‬
‫‪Mark‬‬ ‫‪int‬‬ ‫‪Yes‬‬

‫ونحدد الحقل ‪ Id‬كمفتاح أساسً فً الجدول ‪ ,‬وٌتم ذلك عبر نقرة ٌمٌنٌة على السهم الصغٌر على‬
‫ٌسار الحقل ‪ Id‬واختٌار ‪ Set Primary Key‬كما هو واضح فً الصورة التالٌة ‪:‬‬
‫كما نقوم بجعل هذا الحقل ٌأخذ قٌمه بشكل تلقائً ( وذلك لتجنب إدخال قٌم مكررة لحقل المفتاح‬
‫األساسً ) حٌث نقوم بتفعٌل الخاصٌة ‪ Is Identity‬التابعة للحقل ‪ Id‬كالتالً ‪:‬‬

‫نقوم بحفظ الجدول السابق ( من القائمة ‪ File‬نختار ‪ ) Save Table1‬ونعطٌه االسم ‪. MyTable‬‬
‫نجري نقرة ٌمٌنٌة على هذا الجدول ونختار ‪Show Table Data‬‬
‫نقوم بملئ الجدول ببعض البٌانات ثم نغلقه ( لٌس بالضرورة كما فً الصورة التالٌة ) ‪.‬‬

‫وبهذا نكون قد انتهٌنا من إعداد قاعدة بٌانات بسٌطة وأصبحنا‬


‫جاهزٌن لتطبٌق فقرات هذا الفصل‪.‬‬

‫استخدام األداة ‪SqlDataSource‬‬

‫تمكننا األداة ‪ SqlDataSource‬من تمثٌل قواعد البٌانات فً‬


‫صفحات الوٌب بسهولة وٌسر ‪ ,‬ففً أغلب الحاالت ٌتم استخدام‬
‫هذه األداة إلدارة قواعد البٌانات وبدون كتابة سطر برمجً‬
‫واحد ‪ٌ .‬تم استخدام األداة ‪ SqlDataSource‬لتمثٌل االتصال‬
‫بقاعدة البٌانات و إعداد األوامر التً ستنفذ على بٌاناتها ‪,‬‬
‫عموما األداة ‪ SqlDataSource‬تستطٌع التعامل مع نظم‬
‫إدارة قواعد البٌانات التالٌة ‪:‬‬
‫‪Microsoft SQL Server‬‬ ‫‪‬‬
‫‪Microsoft SQL Server Express‬‬ ‫‪‬‬
‫‪Microsoft Access‬‬ ‫‪‬‬
‫‪Oracle‬‬ ‫‪‬‬
‫‪DB2‬‬ ‫‪‬‬
‫‪MySQL‬‬ ‫‪‬‬

‫وفضال عما سبق فٌمكن التعامل مع أي قاعدة بٌانات عالئقٌة باستخدام األداة ‪. SqlDataSource‬‬

‫إذا فإن هذه األداة هً جسر للوصول للبٌانات وٌتم استخدامها مع أدوات أخرى لعرض وتحرٌر‬
‫البٌانات مثل ‪ GridView , FormView‬وغٌرهم ‪ .‬تعتبر األداة ‪ SqlDataSource‬غٌر مناسبة‬
‫عند إنشاء تطبٌقات متعددة الطبقات ‪ multi-tier‬وذلك ألنها تدمج طبقة البٌانات مع طبقة العرض ‪,‬‬
‫وفً هذه الحالة نقوم باستخدام األداة ‪ ObjectDataSource‬والتً سنناقشها بالتتفصٌل فً فصل‬
‫الحق ‪.‬‬

‫إنشاء االتصال بقاعدة البيانات‬

‫بشكل افتراضً فإن األداة ‪ SqlDataSource‬معدة للتعامل مع قواعد البٌانات ‪Microsoft SQL‬‬
‫‪ Server‬اإلصدار السابع ومابعد ‪ ,‬وٌكون البروفاٌدر ( ‪ ) Provider‬االفتراضً لها ‪. ADO.NET‬‬

‫قم بإضافة صفحة جدٌدة إلى الموقع ‪ ,‬ثم أضف علٌها األداة ‪ SqlDataSource‬وذلك من القسم‬
‫‪ Data‬ضمن الـ ‪ . ToolBox‬نضغط على السهم الصغٌر لألداة ‪ ( SqlDataSource‬وٌدعى‬
‫‪ , )Smart Tag‬ونضغط على ‪ Configure Data Source‬كما هو واضح فً الصورة التالٌة ‪:‬‬

‫تظهر لنا نافذة الختٌار قاعدة البٌانات التً نرٌد االتصال بها ‪ ,‬نختار القاعدة ‪, MyDatabase‬‬
‫وبهذا نكون قد حددنا مصدر البٌانات ‪ ,‬إن هذه الخطوة تكافئ كتابة الكود التالً ‪:‬‬

‫كود ‪C#‬‬
‫‪DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integrated‬‬
‫‪Security=True;User Instance=True‬‬

‫والذي سنناقشه الحقا ‪ .‬نضغط على ‪ , Next‬تظهر نافذة لنقرر إن كنا نرٌد تخزٌن هذه االتصال‬
‫وما االسم الذي نرٌد أن نسمٌه به ‪ ,‬نختار االسم ‪ MyConnectionString‬ثم نضغط على ‪Next‬‬
‫تظهر نافذة جدٌدة وفٌها الجداول الموجودة فً قاعدة البٌانات ‪ ,‬حٌث سٌتم عرض الجدول الوحٌد‬
‫الموجود فً القاعدة التً أنشأناها ‪ ,‬نترك اإلعدادات كما هً ونضغط على ‪. Next‬‬
‫ٌتم عبر النافذة السابقة تحدٌد البٌانات التً سٌتم جلبها من قاعدة البٌانات ‪ ,‬فً القسم األول نحدد إن‬
‫كنا سنستقبل البٌانات من إجراء مخزن ‪ Stored Procedure‬أو عبارة ‪ SQL‬نقوم ببنائها باستخدام‬
‫‪ , Query Builder‬أما الخٌار الثانً وهو االفتراضً ‪ ,‬فٌقوم بعرض الجداول والمناظٌر ‪Views‬‬
‫الموجودة فً قاعدة البٌانات لٌتم جلب البٌانات منها ‪ .‬فً القسم الثانً من النافذة نحدد الجدول أو‬
‫المنظور المطلوب ثم نختار األعمدة التً نرٌد جلبها ‪ .‬فً القسم الثالث نالحظ وجود عدة خٌارات ‪,‬‬
‫إن تفعٌل الخٌار ‪ٌ Return only uniqe rows‬ؤدي إلى عدم حدوث تكرار فً البٌانات‬
‫المسترجعة هذا إن كان مصدر البٌانات ٌحتوي على أسطر مكررة ( عموما إن وجودة مفتاح‬
‫أساسً ٌضمن عدم تكرار بٌانات الجدول ) ‪ ,‬الزر ‪ WHERE‬لتحدٌد شرط ٌتم تطبٌقه على البٌانات‬
‫وبالتالً ٌتم إرجاع األسطر التً تحقق هذا الشرط ‪ .‬مثال السترجاع بٌانات الطالب الذٌن حصلوا‬
‫على عالمة أكبر من ‪ , 08‬نضغط على الزر ‪ WHERE‬لتظهر لنا النافذة التالٌة ‪:‬‬
‫حٌث نقوم بالبداٌة بتحدٌد العمود الذي سٌتم تطبٌق الشرط علٌه ‪ ,‬ثم نحدد معامل الشرط ( ٌساوي ‪,‬‬
‫الٌساوي ‪ ,‬أكبر ‪ ,‬أصغر ‪ , ) ...‬ثم نحدد مصدر القٌمة التً سٌتم استخدامها فً الشرط ( مثال من‬
‫ملف ‪ cookies‬أو غٌر ) ‪ ,‬عند اختٌار ‪ٌ None‬توجب علٌنا إدخال قٌمة ثابتة وبشكل مباشر وذلك‬
‫ضمن الحقل ‪ . Value‬بعد تحدٌد جمٌع أقسام عبارة ‪ Where‬نضغط على الزر ‪ Add‬لتتم إضافة‬
‫ذلك الشرط ‪ ( .‬إن البٌانات المحددة فً الصورة السابقة تقوم بإرجاع بٌانات الطالب الذٌن حصلوا‬
‫على عالمة أكبر أو تساوي ‪ . ) 08‬نغلق هذه النافذة لنعود إلى النافذة ‪Configure Data Source‬‬
‫‪.‬‬

‫الزر ‪ ORDER By‬وذلك لترتٌب البٌانات المسترجعة حسب عمود ما‪ ,‬مثال استرجاع بٌانات الطالب‬
‫مرتبٌن أبجدٌا حسب االسم ‪.‬‬
‫‪ Ascending‬تعنً ترتٌب تصاعدي سواءا كان رقمً أو أبجدي ‪ Descending ,‬ترتٌب تنازلً‪.‬‬
‫نغلق هذه النافذة لنعود إلى النافذة ‪. Configure Data Source‬‬

‫الزر ‪ Advamced‬لتفعٌل إمكانٌة إضافة وتعدٌل وحذف البٌانات من وإلى المصدر المحدد ‪.‬‬
‫ال تقم بتفعٌل الخٌارٌن السابقٌن فً هذا المثال ‪ ,‬نغلق هذه النافذة لنعود إلى النافذة ‪Configure‬‬
‫‪ . Data Source‬ونضغط على الزر ‪ Next‬ثم فً النافذة التً تلٌها اضغط على ‪Test Query‬‬
‫لنتأكد من نجاح االتصال مع قاعدة البٌانات ثم اضغط على ‪. Finish‬‬

‫وبهذا نكون قد أنهٌنا إعداد األداة ‪ SqlDataSourec‬وأصبحت بمثابة وسٌط لالتصال مع قاعدة‬
‫البٌانات وجلب المعلومات منها وتنفٌذ األوامر علٌها كما سنرى فً فقرات الحقة ‪ ,‬ولكنها التقوم‬
‫بعرض البٌانات بمفردها ‪ .‬نفتح الكود الصفحة السابقة ‪ٌ ,‬جب أن ٌكون مشابها للكود التالً ‪:‬‬

‫كود ‪ASP.net‬‬
‫>‪<div‬‬

‫"‪<asp:SqlDataSource ID="SqlDataSource1" runat="server‬‬


‫">‪ConnectionString="<%$ ConnectionStrings:MyConnectionString %‬‬
‫>‪SelectCommand="SELECT * FROM [MyTable]"></asp:SqlDataSource‬‬

‫>‪</div‬‬
‫القٌمة‬ ‫أخذت‬ ‫قد‬ ‫نالحظ من الكود السابق أن الخاصٌة ‪ConnectionString‬‬
‫‪ MyConnectionString‬ولكن أٌن تم تخزٌن عبارة االتصال هذه ؟‬

‫ٌتم تخزٌن إعدادات االتصال ضمن الملف ‪ web.config‬وذلك لعدة أسباب ‪:‬‬

‫‪ ‬األمن و الحماٌة ‪.‬‬


‫‪ ‬سهولة التعامل ‪ :‬بالتأكٌد فإن إضافة عبارة االتصال ضمن ملف واحد أسهل بكثٌر من‬
‫إضافتها إلى كل صفحة ضمن الموقع ‪ ,‬وبالتالً عندما نرٌد إجراء تعدٌل ما علٌها فإننا‬
‫نعدل فً مكان واحد فقط ‪.‬‬
‫‪ ‬األداء ‪ :‬حٌث ٌساهم تخزٌن عبارة االتصال فً الملف ‪ web.config‬بأداء أفضل لمجمع‬
‫االتصاالت على السٌرفر ( ‪. ) Connections Pool‬‬

‫نفتح الملف ‪ web.config‬لنجد فٌه الكود التالً ‪:‬‬

‫كود ‪XML‬‬
‫>‪<configuration‬‬

‫>‪<connectionStrings‬‬
‫"‪<add name="MyConnectionString‬‬
‫=‪connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename‬‬
‫‪|DataDirectory|\MyDatabase.mdf;Integrated Security=True;User‬‬
‫"‪Instance=True‬‬
‫>‪providerName="System.Data.SqlClient" /‬‬
‫>‪</connectionStrings‬‬

‫>‪<system.web‬‬
‫>‪<compilation debug="false" targetFramework="4.0" /‬‬
‫>‪</system.web‬‬

‫>‪</configuration‬‬

‫إن عبارة االتصال السابقة معدة للعمل فقط على الجهاز المحلً ‪ , Local‬وٌجب تعدٌلها عند رفع‬
‫الموقع على االنترنت ‪ ,‬حٌث تقوم شركة االستضافة ٌتزوٌدك بعبارة االتصال وفقا إلعداداتهم‬
‫الخاصة ‪.‬‬

‫قم بإضافة أداة ‪ GridView‬إلى الصفحة التً أنشأناها مسبقا ‪ ,‬واجعل قٌمة الخاصٌة‬
‫”‪ , DataSourcrId=”sqlDataSource1‬قم بتنفٌذ الصفحة لٌتم عرض بٌانات الجدول ضمن‬
‫األداة ‪ ( GridView‬والتً سنتطرق للتعامل معها بالتفصٌل فً فصل الحق ) ‪.‬‬
‫فلترة البيانات‬

‫تدعم األداة ‪ SqlDataSource‬خاصٌة الفلترة ‪ FilterExpression‬والتً تمكننا من تحدٌد شرط ما‬


‫على البٌانات التً نرغب بالحصول علٌها من قاعدة البٌانات ‪ ,‬وهذا ماندعوه بالفلترة ‪ ,‬بالعودة إلى‬
‫الصفحة السابقة ‪ ,‬وعلى فرض أن عدد الطالب أصبح كبٌرا وأنت بحاجة للبحث عن طالب معٌن‬
‫فكٌف نقوم بذلك عبر الخاصٌة ‪ FilterExpression‬؟‬

‫ما سنقوم بعمله هو صفحة مشابهة للصفحة التالٌة ‪ ,‬حٌث ٌقوم المستخدم بكتابة اسم طالب ما ضمن‬
‫األداة ‪ TextBox1‬ثم الضغط على زر " بحث " لٌتم عرض بٌانات الطالب الذٌن ٌحملون ذلك‬
‫االسم ‪.‬‬

‫أنشئ صفحة جدٌدة ‪ ,‬قم بإضافة أداة ‪ TextBox1‬و ‪ , Button1‬أضف أداة ‪SqlDataSource‬‬
‫واربطها مع الجدول ‪ MyTable‬كما تعلمنا فً الفقرة السابقة ‪ ,‬انتقل إلى وضع الكود وقم‬
‫باإلضافات التالٌة ‪:‬‬

‫كود ‪ASP.net‬‬
‫>‪<div‬‬

‫"‪<asp:SqlDataSource ID="SqlDataSource1" runat="server‬‬


‫">‪ConnectionString="<%$ ConnectionStrings:MyConnectionString %‬‬
‫"]‪SelectCommand="SELECT * FROM [MyTable‬‬
‫> "'‪FilterExpression="Name LIKE '{0}%‬‬
‫>‪<FilterParameters‬‬
‫"‪<asp:ControlParameter Name="stdName" ControlID="TextBox1‬‬
‫>‪PropertyName="TEXT" /‬‬
‫>‪</FilterParameters‬‬
‫>‪</asp:SqlDataSource‬‬
‫>‪" /‬بحث"=‪<asp:Button ID="Button1" runat="server" Text‬‬
‫>‪<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox‬‬
‫>‪<br /‬‬
‫>‪</div‬‬

‫شرح الكود المضاف ‪:‬‬

‫قمنا فً البداٌة بإضافة خاصٌة الفلترة ‪ FilterExpression‬وأعطٌناها القٌمة ‪Name LIKE ‘{0}’:‬‬
‫وهو عبارة عن تعبٌر ‪ , SQL‬الختٌار األسماء المشابهة للبارامتر الممرر (أي عملٌة فلترة على‬
‫أساس االسم ) ‪ ,‬أما الرمز ’}‪ ‘{0‬فٌدل على رقم البارامتر الذي سٌتم استخدامه ( حٌث ٌبدأ الترقٌم‬
‫ابتداءا من الصفر ) ‪ .‬قمنا بعد ذلك بتحدٌد البارامتر ( وهو القٌمة المدخلة فً ‪ ) TextBox1‬حٌث‬
‫صرحنا بالبداٌة عن قسم بارامترات عبر الوسم >‪ <FilterParameters‬ثم قمنا بإضافة بارامتر‬
‫من النوع أداة تحكم وإعطائه االسم ”‪ “stdName‬ثم قمنا بتحدٌد األداة التً سنأخذ منها البارامتر‬
‫وهً ‪ TextBox1‬وتحدٌد الخاصٌة المعنٌة وهً ‪. Text‬‬

‫أخٌرا ‪ ,‬قم بإضافة األداة ‪ GridView‬واجعل قٌمة الخاصٌة ‪ DataSourceId‬تساوي القٌمة‬


‫‪ , SqlDataSource1‬قم بتنفٌذ الصفحة ‪ ,‬واكتب حرف ما ثم اضغط على الزر بحث لٌتم عرض‬
‫جمٌع الطالب الذٌن تبدأ أسماؤهم بذلك الحرف ‪ ,‬جرب كتابة اسم طالب بالكامل وابحث ‪.‬‬

‫مالحظة‬

‫فً الصفحة السابقة قمنا بتحدٌد نوع البارامتر على أنه أداة تحكم ‪<asp:ControlParameter..‬‬
‫وذلك ألننا سنقوم بكتابة البارامتر ضمن أداة تحكم (وقد كانت ‪ٌ , )TextBox‬وجد العدٌد من أنواع‬
‫البارامترات األخرى والتً تمكننا من أخذ قٌمة البارمتر من ملف ‪ Cookies‬أو من ملف الجلسة‬
‫‪ Session‬أو من عنوان الصفحة ‪ QueryString‬وخٌارات أخرى وسنتحدث عنها فً فصول‬
‫الحقة إن شاء هللا ‪.‬‬

‫العمليات التي تدعمها األداة ‪SqlDataSource‬‬

‫تدعم األداة ‪ SqlDataSource‬العملٌات األربع األساسٌة التً ٌتم تنفٌذها على البٌانات ‪ :‬إضافة ‪,‬‬
‫حذف ‪ ,‬تعدٌل ‪ ,‬اختٌار ‪ .‬وذلك عبر الخصائص التالٌة ‪:‬‬

‫‪InsertCommand‬‬ ‫‪‬‬
‫‪DeleteCommand‬‬ ‫‪‬‬
‫‪UpdateCommand‬‬ ‫‪‬‬
‫‪SelectCommand‬‬ ‫‪‬‬
‫ أضف صفحة جدٌدة وأضف علٌها أداة‬, ‫سنقوم بتطبٌق مثال بسٌط للتعرف على الخصائص السابقة‬
‫ ولكن قم‬, ‫ كما تعلمنا فً الفقرة السابقة‬MyTable ‫ وقم بربطها مع الجدول‬SqlDataSource
‫ كما فً الصورة‬Generate Insert, Update, and Delete statements ‫بتفعٌل الخٌار‬
‫التالٌة‬

: ً‫ بعد ذلك ٌصبح كود الصفحة بالشكل التال‬, ‫ثم نكمل باقً الخطوات كالمعتاد‬

ASP.net ‫كود‬
<div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:MyConnectionString %>"
DeleteCommand="DELETE FROM [MyTable] WHERE [Id] = @Id"
InsertCommand="INSERT INTO [MyTable] ([Id], [Name], [Mark]) VALUES
(@Id, @Name, @Mark)"
SelectCommand="SELECT * FROM [MyTable]"
UpdateCommand="UPDATE [MyTable] SET [Name] = @Name, [Mark] = @Mark
WHERE [Id] = @Id">
<DeleteParameters>
<asp:Parameter Name="Id" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="Id" Type="Int32" />

<asp:Parameter Name="Name" Type="String" />


<asp:Parameter Name="Mark" Type="Int32" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="Mark" Type="Int32" />
<asp:Parameter Name="Id" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
</div>

‫ الخاصة بعملٌات اإلضافة الحذف والتعدٌل واالستعالم من‬SQL ‫حٌث نالحظ إضافة عبارات‬
‫ كما ٌظهر‬, SqlDataSource ‫الجدول المحدد وإسناد كل عبارة للخاصٌة المقابلة لها فً األداة‬
‫ فعندما نرٌد حذف سجل ما من‬, SQL ‫التصرٌح عن البارامترات التً ٌجب تمرٌرها لعبارات‬
‫< ٌحتوي على‬DeleteParameters> ‫ ولذلك فإن القسم‬, ‫ ذلك السجل‬Id ‫الجدول ٌكفً تمرٌر‬
‫ أما عندما نرٌد إضافة سجل جدٌد فنحن بحاجة لكامل القٌم وهً فً مثالنا هذا‬, ‫بارامتر واحد فقط‬
‫ وذلك‬Insert ‫ ) ولذلك تم تمرٌر ثالث بارامترات لعبارة اإلضافة‬Id, Name, Mark ( ‫ثالث قٌم‬
‫ لرؤٌة كٌفٌة عمل الخصائص السابقة نقوم بإضافة األداة‬. <InsertParameter> ‫ضمن القسم‬
: ً‫ إلى الصفحة ونضبط خصائصها كالتال‬DetailsView

‫القٌمة‬ ‫الخاصٌة‬
SqlDataSource1 DataSourceID

True AutoGenerateDeleteButton

True AutoGenerateEditButton

True AutoGenerateInsertButton

False AutoGenerateRows

True AllowPaging
‫ إنما‬. ‫ فسنأتً على شرحها وبالتفصٌل فً فصل قادم إن شاء هلل‬DetailsView ‫ال تقلق من األداة‬
‫ بعد ضبط قٌم‬, SqlDataSource ‫الهدف من اسخدامها هنا فقط لتوضٌح عمل خصائص األداة‬
‫الخصائص السابقة كما هو محدد بإمكاننا تنفٌذ الصفحة وتجربة إضافة سجالت جدٌدة على الجدول‬
: ً‫ أما كود الصفحة فٌصبح كامال بالشكل التال‬. ‫وحذف والتعدٌل على سجالت سابقة‬

ASP.net ‫كود‬
<div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:MyConnectionString %>"
DeleteCommand="DELETE FROM [MyTable] WHERE [Id] = @Id"
InsertCommand="INSERT INTO [MyTable] ([Id], [Name], [Mark]) VALUES
(@Id, @Name, @Mark)"
SelectCommand="SELECT * FROM [MyTable]"
UpdateCommand="UPDATE [MyTable] SET [Name] = @Name, [Mark] = @Mark
WHERE [Id] = @Id">
<DeleteParameters>
<asp:Parameter Name="Id" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="Id" Type="Int32" />
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="Mark" Type="Int32" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="Mark" Type="Int32" />
<asp:Parameter Name="Id" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:DetailsView ID="DetailsView1" runat="server"
DataSourceID="SqlDataSource1"
AutoGenerateDeleteButton="True"
AutoGenerateEditButton="True"
AutoGenerateInsertButton="True"
AutoGenerateRows="False" AllowPaging="True" DataKeyNames="Id" >
<Fields>
<asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True"
SortExpression="Id" />
<asp:BoundField DataField="Name" HeaderText="Name"
SortExpression="Name" />
<asp:BoundField DataField="Mark" HeaderText="Mark"
SortExpression="Mark" />
</Fields>
</asp:DetailsView>
</div>
‫قم بتنفٌذ الصفحة السابقة ‪ ,‬وجرب إجراء العملٌات المختلفة على البٌانات ‪ ,‬قم بتعدٌل المثال السابق‬
‫واستخدم األداة ‪ GridView‬عوضا عن ‪. DetailsView‬‬

‫التعامل البرمجي مع قواعد البيانات‬

‫من النقاط الهامة عند بناء موقع دٌنامٌكً هً معرفة إدارة قواعد البٌانات بشكل برمجً ‪ ,‬على‬
‫العموم فإن الكود البرمجً سٌكون مألوف لمبرمجً تطبٌقات ‪ , .NET‬سأكتفً خالل هذه الفصل‬
‫بعرض مثالٌن األول عن كٌفٌة اإلضافة لقاعدة البٌانات ‪ ,‬والثانً االستعالم عن البٌانات ‪ ,‬وبالتالً‬
‫سٌكون بإمكان المطور أن ٌكتب توابع التعدٌل والحذف وغٌرها بسهولة كبٌرة فالموضوع ٌتعلق‬
‫بلغة ‪ SQL‬أكثر من تعلقه بتقنٌة الـ ‪.NET‬‬

‫سنقوم بإضافة صف جدٌد ( ‪ , ) Class‬من القائمة ‪ File‬اختر ‪ New‬ثم ‪ ( File‬أو ببساطة اضغط‬
‫على ‪ , ) CTRL+N‬ثم حدد ‪ Class‬وقم بتسمٌته ‪ Students.vb ( Students.cs‬لمبرمجً‬
‫الفٌجوال بٌسك ) ‪.‬‬

‫ستظهر رسالة تخبرك بأنه سٌتم وضع الصف الجدٌد داخل مجلد ٌدعى ‪ App_Code‬فاضغط على‬
‫نعم ‪ ,‬هذا الصف الجدٌد سٌحتوي على التوابع التً تقوم بالتعامل مع قواعد البٌانات ‪ ,‬حٌث من‬
‫األفضل عدم كتابتها فً كود الصفحة ‪.‬‬

‫الخطوة األولى تكون فً استدعاء فضائات العناوٌن المسؤولة عن التعامل مع قواعد البٌانات ‪.‬‬
C# ‫كود‬
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

VB ‫كود‬
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

‫ إنما ٌستخدم لضبط‬, ‫ لٌس للتعامل مع قواعد البٌانات‬System.Configration ‫إن فضاء العناوٌن‬
‫ والذي ٌحتوي على عبارة االتصال‬. web.config ‫إعدادات الموقع والتعامل مع ملف اإلعدادات‬
. ‫مع قاعدة البٌانات‬

: ً‫نقوم بتهٌئة بانً الصف لٌصبح الكود بالشكل التال‬

C# ‫كود‬
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public class Students


{
SqlConnection con;
SqlCommand myCommand;
string connectionString;

public Students()
{
con = new SqlConnection();
connectionString = ConfigurationManager
.ConnectionStrings["MyConnectionString"]
.ConnectionString;
con.ConnectionString = connectionString;
myCommand = new SqlCommand();
myCommand.Connection = con;
}

}
VB ‫كود‬
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

Public Class Students

Private con As SqlConnection


Private myCommand As SqlCommand
Private connectionString As String

Public Sub New()


con = New SqlConnection()
connectionString = ConfigurationManager
.ConnectionStrings("MyConnectionString")
.ConnectionString
con.ConnectionString = connectionString
myCommand = New SqlCommand()
myCommand.Connection = con
End Sub

End Class

ً‫ ٌجب أن تكون مخزنة ف‬MyConnectionString ‫حٌث إن عبارة االتصال مع قاعدة البٌانات‬


. web.config ‫الملف‬

XML ‫كود‬
<configuration>
<connectionStrings>
<add name="MyConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=
|DataDirectory|\MyDatabase.mdf;Integrated Security=
True;User Instance=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
….
….
</configuration>
‫ لتقوم بتخزٌن عبارة االتصال فً الملف السابق دون‬SqlDataSourse ‫باإلمكان االستعانة باألداة‬
. ‫عناء كتابتها بشكل ٌدوي كما تعلمنا فً فقرات سابقة‬

: ً‫ بالشكل التال‬MyTable ‫نقوم اآلن بكتابة التابع المسؤول عن إضافة البٌانات إلى الجدول‬

C# ‫كود‬
public string addStudents(string stdName, int stdMark)
{
try
{
string mysql = "insert into myTable(Name,Mark)
values ( @sname, @smark )";
myCommand.Parameters.Clear();
myCommand.Parameters.AddWithValue("@sname", stdName);
myCommand.Parameters.AddWithValue("@smark", stdMark);
myCommand.CommandText = mysql;

con.Open();
int recs;
recs = myCommand.ExecuteNonQuery();
con.Close();
return recs + " row added successfuly.";
}
catch (Exception ex)
{
if (con.State != ConnectionState.Closed)
con.Close();
return ex.Message;
}
}

VB ‫كود‬
Public Function addStudents(ByVal stdName As String, ByVal stdMark As Integer) As
String
Try
Dim mysql As String = "insert into myTable(Name,Mark) values ( @sname,
@smark )"
myCommand.Parameters.Clear()
myCommand.Parameters.AddWithValue("@sname", stdName)
myCommand.Parameters.AddWithValue("@smark", stdMark)
myCommand.CommandText = mysql

con.Open()
Dim recs As Integer
recs = myCommand.ExecuteNonQuery()
con.Close()
Return recs & " row added successfuly."
Catch ex As Exception
If con.State <> ConnectionState.Closed Then
con.Close()
End If
Return ex.Message
End Try
End Function

‫ أضف صفحة جدٌدة و أضف‬. ‫اآلن أصبح بإمكاننا إنشاء الصفحة التً تقوم باستدعاء التابع السابق‬
‫ وفً حدث النقر‬, ‫ واحدة‬Lable ‫ ) وأداة‬Button ( ‫ و زر واحد‬TextBox ‫علٌها أداتٌن من النوع‬
: ً‫على الزر اكتب الكود التال‬

C# ‫كود‬
protected void Button1_Click(object sender, EventArgs e)
{
Students std = new Students();
string name=TextBox1.Text;
int mark=int.Parse(TextBox2.Text);
string result= std.addStudents(name, mark);
Label1.Text = result;
}

VB ‫كود‬
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Button1.Click

Dim std As New Students()


Dim name As String = TextBox1.Text
Dim mark As Integer = Integer.Parse(TextBox2.Text)
Dim result As String = std.addStudents(name, mark)
Label1.Text = result
End Sub

‫ وبهذا‬addStudents ‫ ثم قمنا بتنفٌذ التابع‬Students ‫ من الصف‬std ‫حٌث قمنا بإنشاء غرض‬


. ‫نبقً كود الصفحة خالٌا من األكواد التً تتعامل بشكل مباشر مع قاعدة البٌانات‬

: ‫كود الصفحة‬
ASP.net ‫كود‬
<div>
Nmae : <asp:TextBox ID="TextBox1" runat="server" /> <br />
Mark : <asp:TextBox ID="TextBox2" runat="server" /> <br />
<asp:Button ID="Button1" runat="server" Text="add"
onclick="Button1_Click" />
<hr />
<asp:Label ID="Label1" runat="server" Text="" />
</div>

‫ ٌمكن تنفٌذ عملٌات التعدٌل و الحذف بشكل مشابه جدا‬. ‫قم بتنفٌذ الصفحة و راقب قاعدة البٌانات‬
. SQL ‫للتابع السابق مع فرق تغٌٌر عبارات الـ‬

‫ حٌث نمرر له‬, ‫ لكتابة تابع ٌقوم باالستعالم من قاعدة البٌانات‬Students ‫نعود اآلن إلى الصف‬
. ‫رقم الطالب كبارامتر وٌعٌد لنا العالمة التً حصل علٌها‬

C# ‫كود‬
int getStudentMark(string stdId)
{
int mark = -1;
try
{
string mysql= "select mark from MyTable WHERE id = @id ";
myCommand.Parameters.Clear();
myCommand.Parameters.AddWithValue("@id", stdId);
myCommand.CommandText = mysql;

con.Open();
SqlDataReader dr;
dr = myCommand.ExecuteReader();
while (dr.Read())
{
mark = int.Parse(dr.GetValue(0).ToString());
}
con.Close();
}
catch (Exception ex)
{
if (con.State != ConnectionState.Closed)
con.Close();
}
return mark;
}
VB ‫كود‬
Private Function getStudentMark(ByVal stdId As String) As Integer

Dim mark As Integer = -1


Try
Dim mysql As String = "select mark from MyTable WHERE id = @id "
myCommand.Parameters.Clear()
myCommand.Parameters.AddWithValue("@id", stdId)
myCommand.CommandText = mysql

con.Open()
Dim dr As SqlDataReader
dr = myCommand.ExecuteReader()
While dr.Read()
mark = Integer.Parse(dr.GetValue(0).ToString())
End While
con.Close()
Catch ex As Exception
If con.State <> ConnectionState.Closed Then
con.Close()
End If
End Try
Return mark

End Function

. ‫اترك لك عزٌزي المطور إنشاء الصفحة التً تقوم باستدعاء التابع السابق‬

‫الخاتمة‬

‫ والذي خطونا به الخطوة األولى نحو قواعد البٌانات ضمن بٌئة‬, ‫إلى هنا نأتً إلى نهاٌة هذا الفصل‬
‫ ٌوجد العدٌد من األدوات الجاهزة والمخصصة للعمل مع قواعد البٌانات مثل‬, ‫الدوت نت‬
‫ و سنناقش كل منهم بشكل مفصل خالل الفصول‬, ‫ وغٌرهم العدٌد‬FormView ‫ و‬GridView
. ‫القادمة إن شاء هللا‬

: ‫لتحمٌل جمٌع أجزاء هذه السلسلة المتوفرة حتى اآلن‬

https://www.mediafire.com/folder/u44z9omx9ajjv/asp.net

http://www.4shared.com/folder/i34_lCo0/ASP.html

: ‫للتواصل‬

m-hajjkhalaf@hotmail.com
http://www.facebook.com/mohammed.hajkhalaf

‫محمد عمر الحاج خلف – سورٌا‬

You might also like