Professional Documents
Culture Documents
145994705
145994705
فً هذا الفصل سنخطو معا الخطوة األولى نحو التعامل مع قواعد البٌانات من خالل 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ونضٌف الحقول بالشكل التالً:
ونحدد الحقل Idكمفتاح أساسً فً الجدول ,وٌتم ذلك عبر نقرة ٌمٌنٌة على السهم الصغٌر على
ٌسار الحقل Idواختٌار Set Primary Keyكما هو واضح فً الصورة التالٌة :
كما نقوم بجعل هذا الحقل ٌأخذ قٌمه بشكل تلقائً ( وذلك لتجنب إدخال قٌم مكررة لحقل المفتاح
األساسً ) حٌث نقوم بتفعٌل الخاصٌة Is Identityالتابعة للحقل Idكالتالً :
نقوم بحفظ الجدول السابق ( من القائمة Fileنختار ) Save Table1ونعطٌه االسم . MyTable
نجري نقرة ٌمٌنٌة على هذا الجدول ونختار Show Table Data
نقوم بملئ الجدول ببعض البٌانات ثم نغلقه ( لٌس بالضرورة كما فً الصورة التالٌة ) .
وفضال عما سبق فٌمكن التعامل مع أي قاعدة بٌانات عالئقٌة باستخدام األداة . 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
></div
القٌمة أخذت قد نالحظ من الكود السابق أن الخاصٌة ConnectionString
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
><system.web
><compilation debug="false" targetFramework="4.0" /
></system.web
></configuration
إن عبارة االتصال السابقة معدة للعمل فقط على الجهاز المحلً , Localوٌجب تعدٌلها عند رفع
الموقع على االنترنت ,حٌث تقوم شركة االستضافة ٌتزوٌدك بعبارة االتصال وفقا إلعداداتهم
الخاصة .
قم بإضافة أداة GridViewإلى الصفحة التً أنشأناها مسبقا ,واجعل قٌمة الخاصٌة
” , DataSourcrId=”sqlDataSource1قم بتنفٌذ الصفحة لٌتم عرض بٌانات الجدول ضمن
األداة ( GridViewوالتً سنتطرق للتعامل معها بالتفصٌل فً فصل الحق ) .
فلترة البيانات
ما سنقوم بعمله هو صفحة مشابهة للصفحة التالٌة ,حٌث ٌقوم المستخدم بكتابة اسم طالب ما ضمن
األداة TextBox1ثم الضغط على زر " بحث " لٌتم عرض بٌانات الطالب الذٌن ٌحملون ذلك
االسم .
أنشئ صفحة جدٌدة ,قم بإضافة أداة TextBox1و , Button1أضف أداة SqlDataSource
واربطها مع الجدول MyTableكما تعلمنا فً الفقرة السابقة ,انتقل إلى وضع الكود وقم
باإلضافات التالٌة :
كود ASP.net
><div
قمنا فً البداٌة بإضافة خاصٌة الفلترة FilterExpressionوأعطٌناها القٌمة Name LIKE ‘{0}’:
وهو عبارة عن تعبٌر , SQLالختٌار األسماء المشابهة للبارامتر الممرر (أي عملٌة فلترة على
أساس االسم ) ,أما الرمز ’} ‘{0فٌدل على رقم البارامتر الذي سٌتم استخدامه ( حٌث ٌبدأ الترقٌم
ابتداءا من الصفر ) .قمنا بعد ذلك بتحدٌد البارامتر ( وهو القٌمة المدخلة فً ) TextBox1حٌث
صرحنا بالبداٌة عن قسم بارامترات عبر الوسم > <FilterParametersثم قمنا بإضافة بارامتر
من النوع أداة تحكم وإعطائه االسم ” “stdNameثم قمنا بتحدٌد األداة التً سنأخذ منها البارامتر
وهً TextBox1وتحدٌد الخاصٌة المعنٌة وهً . Text
مالحظة
فً الصفحة السابقة قمنا بتحدٌد نوع البارامتر على أنه أداة تحكم <asp:ControlParameter..
وذلك ألننا سنقوم بكتابة البارامتر ضمن أداة تحكم (وقد كانت ٌ , )TextBoxوجد العدٌد من أنواع
البارامترات األخرى والتً تمكننا من أخذ قٌمة البارمتر من ملف Cookiesأو من ملف الجلسة
Sessionأو من عنوان الصفحة QueryStringوخٌارات أخرى وسنتحدث عنها فً فصول
الحقة إن شاء هللا .
تدعم األداة 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" />
الخاصة بعملٌات اإلضافة الحذف والتعدٌل واالستعالم من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 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
End Class
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
: كود الصفحة
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
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