Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
50 views24 pages

Dal

The document is an introduction to data access layers in C# and SQL Server databases. It explains that the document is meant to supplement another book on C# interfaces and provide information on databases and connecting them to Visual Studio. The author hopes to write a second part covering these topics in more depth.

Uploaded by

bakry
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
50 views24 pages

Dal

The document is an introduction to data access layers in C# and SQL Server databases. It explains that the document is meant to supplement another book on C# interfaces and provide information on databases and connecting them to Visual Studio. The author hopes to write a second part covering these topics in more depth.

Uploaded by

bakry
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 24

1


 
‫ ﺧﺎﻟﺪ ﺍﻟﺴﻌﺪﺍﱐ‬: ‫ﻣﻦ ﺇﻋﺪﺍﺩ‬

2
‫ﺑﺴﻢ ﺍﷲ ﺍﻟﺮﲪﻦ ﺍﻟﺮﺣﻴﻢ‬
‫ﻭﺻﻠﺘﲏ ﺭﺳﺎﻟﺔ ﻣﻦ ﻋﻨﺪ ﺃﺣﺪ ﺍﻹﺧﻮﺓ ﺍﻟﺮﺍﻏﺒﲔ ﰲ ﺍﻟﺘﻌﺮﻑ ﺃﻛﺜﺮ ﻋﻠﻰ ﻣﺎﻫﻴﺔ ﺍﻟﺪﺍﺗﺎ‬
‫ﺃﻛﺴﻴﺲ ﻻﻳﺮ ‪ ،‬ﻭﻋﻠﻰ ﻛﻴﻔﻴﺔ ﺍﺷﺘﻐﺎﳍﺎ‪ .‬ﻓﺒﺪﺃﺕ ﺃﻋﺪ ﻟﻪ ﻫﺬﺍ ﺍﻟﻜﺘﻴﺐ ﺧﺼﻴﺼﺎ ﻟﻪ ﺣﱴ ﻳﺴﺘﻤﺪ‬
‫ﻣﻨﻪ ﻣﺎ ﻫﻮ ﳏﺘﺎﺝ ﺇﻟﻴﻪ‪.‬‬

‫ﻟﻜ ﻦ ﲟﺠﺮﺩ ﻣﺎ ﺗﻘﺪﻣﺖ ﰲ ﺍﻟﻜﺘﻴﺐ‪ ،‬ﺗﺴﺎﺀﻟﺖ ﳌﺎﺫﺍ ﻻ ﺃﺟﻌﻠﻪ ﰲ ﻣﺘﻨﺎﻭﻝ ﺍﳉﻤﻴﻊ ﺣﱴ ﺗﻌﻢ‬
‫ﺍﻟﻔﺎﺋﺪﺓ ﻭ ﻳﺘﺴﲎ ﻷﺷﺨﺎﺹ ﺁﺧﺮﻳﻦ ﰲ ﻧﻔﺲ ﺍﳌﻮﻗﻒ ﺍﻟﻈﻔﺮ ﻭﻟﻮ ﲜﺰﺀ ﻗﻠﻴﻞ ﻣﻦ ﺍﳌﻌﺮﻓﺔ‪.‬‬

‫ﻋﻠﻰ ﻛﻞ ﺣﺎﻝ ﻓﻬﺬﺍ ﺍﻟﻜﺘﻴﺐ ﻳﺄﰐ ﻣﻜﻤﻼ ﺷﻴﺌﺎ ﻣﺎ ﻟﻜﺘﺎﺏ "ﺳﺒﻴﻠﻚ ﺍﳌﺨﺘﺼﺮ ﻟﺘﻌﻠﻢ ﺍﻟﺴﻲ‬
‫ﺷﺎﺭﺏ" ‪ ،‬ﻷﻧﲏ ﰲ ﺍﳊﻘﻴﻘﺔ ﻛﻨﺖ ﺃﻧﻮﻱ ﺃﻥ ﺃﺅﻟﻒ ﺟﺰﺀ ﺛﺎﻧﻴﺎ ﳜﺘﺺ ﰲ ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭ‬
‫ﻋﻤﻠﻴﺎﺕ ﺭﺑﻄﻬﺎ ﻣﻊ ﺍﻟﻔﻴﺠﻮﺍﻝ ﺍﺳﺘﻮﺩﻳﻮ‪ ،‬ﻭﻟﻜﻦ ﻧﻈﺮﺍ ﻟﻈﺮﻭﻑ ﺷﺨﺼﻴﺔ ﱂ ﺃﺳﺘﻄﻊ ﺍﻟﺒﺪﺍﻳﺔ‬
‫ﻓﻌﻠﻴﺎ‪ .‬ﻭﺃﲤﲎ ﻣﻦ ﺍﷲ ﺍﻟﻌﻠﻲ ﺍﻟﻘﺪﻳﺮ ﺃﻥ ﺗﺘﺎﺡ ﱄ ﺍﻟﻔﺮﺻﺔ ﻷﻧﻄﻠﻖ ﻣﻊ ﺍﳉﺰﺀ ﺍﻟﺜﺎﱐ‪.‬‬

‫ﻭﻻ ﻧﻨﺴﻰ ﻛﻤﺎ ﺟﺮﺕ ﺍﻟﻌﺎﺩﺓ ﺃﻥ ﻧﻨﺒﻬﻜﻢ ﺇﱃ ﺃﻥ "ﻟﻜﻞ ﺷﻲﺀ ﺇﺫﺍ ﻣﺎ ﰎ ﻧﻘﺼﺎﻥ" ‪ ،‬ﻓﺄﺩﱏ ﺧﻄﺄ‬
‫ﺗﺘﻤﻜﻨﻮﻥ ﻣﻦ ﺍﻟﻌﺜﻮﺭ ﻋﻠﻴﻪ ﺑﲔ ﻃﻴﺎﺕ ﺍﻟﻜﺘﺎﺏ ﻻ ﺗﺘﻮﺍﻧﻮﺍ ﰲ ﺇﺭﺷﺎﺩﻧﺎ ﺇﻟﻴﻪ ﻭﻟﻜﻢ ﻣﻨﺎ ﺟﺰﻳﻞ‬
‫ﺍﻟﺸﻜﺮ ‪.‬‬

‫ﺃﺗﻮﻗﻒ ﻋﻨﺪ ﻫﺬﺍ ﺍﳊﺪ ﺣﱴ ﻻ ﺃﻛﻮﻥ ﺿﻴﻔﺎ ﺛﻘﻴﻼ‪ ،‬ﻭ ﺃﲤﲎ ﻟﻚ –ﺃﻳﻬﺎ ﺍﻟﻘﺎﺭﺉﺀ‪ -‬ﻣﺴﲑﺓ‬
‫!‬ ‫ﻣﻮﻓﻘﺔ ﰲ ﺣﻴﺎﺗﻚ‪ ،‬ﻭﺍﻟﻠﻬﻢ ﺍﻧﺼﺮ ﺍﻹﺳﻼﻡ ﻭ ﺍﳌﺴﻠﻤﲔ‬

‫ﺧﺎﻟﺪ ﺍﻟﺴﻌﺪﺍﱐ‬
‫‪3‬‬
‫‪..‬‬
‫ﺣﱴ ﺗﻜﻮﻥ ﻫﻨﺎﻙ ﺍﺳﺘﻔﺎﺩﺓ ﻛﺒﲑﺓ ﻣﻦ ﻫﺬﺍ ﺍﻟﻜﺘﻴﺐ‪ ،‬ﻋﻠﻴﻚ ﺃﺧﻲ ﺍﻟﻘﺎﺭﺉ ﺃﻥ‬
‫ﺗﻜﻮﻥ ﻣﻄﻠﻌﺎ ﻋﻠﻰ ‪:‬‬

‫‪ o‬ﺍﻟﱪﳎﺔ ﺑﻠﻐﺔ ﺍﻟﺴﻲ ﺷﺎﺭﺏ‬

‫ﻟﻮ ﻋﻨﺪﻙ ﻣﺸﻜﻠﺔ ﰲ ﻫﺬﺍ ﻟﻐﺔ ﺍﻟﺴﻲ‪ ،#‬ﺃﻧﺼﺤﻚ ﺑﺎﻟﻌﻮﺩﺓ ﺇﱃ ﺍﳉﺰﺀ ﺍﻟﺜﺎﱐ‬
‫ﺍﳋﺎﺹ ﺑﱪﳎﺔ ﺍﻟﻮﺍﺟﻬﺎﺕ ﻭﻫﻮ ﻣﺘﺎﺡ ﻋﻠﻰ ﺍﻻﻧﺘﺮﻧﺖ ﻟﻠﺘﺤﻤﻴﻞ ﳎﺎﻧﺎ‪ ،‬ﻭﺇﻥ‬
‫ﻋﺪﻣﺘﻪ ﻓﺎﳌﺮﺟﻮ ﻣﺮﺍﺳﻠﱵ ﻋﻠﻰ ﺍﳋﺎﺹ ﻷﺑﻌﺚ ﻟﻚ ﺑﻨﺴﺨﺔ ﻣﻨﻪ‪.‬‬

‫‪ o‬ﻗﻮﺍﻋﺪ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪SQl Server‬‬

‫ﺗﺴﺘﻄﻴﻊ ﺍﺳﺘﻌﻤﺎﻝ "ﺍﻟﺸﺮﺡ ﺍﻟﻮﺍﰲ ﻟﺘﻌﻠﻢ ﻟﻐﺔ ‪ SQL‬ﻣﻦ ﻧﺒﻌﻬﺎ ﺍﻟﺼﺎﰲ" ﻭﺇﻥ‬
‫ﻋﺪﻣﺘﻪ ﻋﻠﻰ ﺍﻻﻧﺘﺮﻧﺖ ﺭﺍﺳﻠﲏ ﻷﺑﻌﺚ ﻟﻚ ﺑﻪ‪.‬‬

‫‪4‬‬





71 ‫ و‬70 : ‫اﻷﺣﺰاب‬

5
‫ﺧﻼﻝ ﻫﺬﻩ ﺍﳊﺼﺔ ﺇﻥ ﺷﺎﺀ ﺍﷲ ﺳﻨﺸﺘﻐﻞ ﻋﻠﻰ ﻣﺜﺎﻝ ﺗﺴﺠﻴﻞ ﺍﳊﻀﻮﺭ ﻟﻠﻄﻼﺏ‪ ،‬ﻭﺳﻨﻔﺘﺮﺽ ﺃﻥ‬
‫ﺑﻨﻴﺔ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬

‫‪6‬‬
‫ﻛﻤﺎ ﺗﻼﺣﻆ ﻫﻨﺎﻙ ﺃﺭﺑﻌﺔ ﺟﺪﺍﻭﻝ‪:‬‬

‫‪ :TBL_STUDENT ‬ﻭﻫﻮ ﺟﺪﻭﻝ ﺍﻟﻄﻼﺏ ﻭ ﻳﻀﻢ ﺍﳊﻘﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ )ﺭﻗﻢ ﺍﻟﻄﺎﻟﺐ‪،‬‬


‫ﺍﻻﺳﻢ‪ ،‬ﺍﻟﻨﺴﺐ‪ ،‬ﺍﻟﻌﻨﻮﺍﻥ‪ ،‬ﺗﺎﺭﻳﺦ ﺍﻻﺯﺩﻳﺎﺩ‪ ،‬ﺍﳉﻨﺲ( ﺃﻣﺎ ﺭﻗﻢ ﺍ‪‬ﻤﻮﻋﺔ ﻓﻬﻮ ﺣﻘﻞ‬
‫ﺃﺟﻨﱯ ﻟﻠﺮﺑﻂ ﺑﲔ ﺍﻟﻄﺎﻟﺐ ﻭ ﺍ‪‬ﻤﻮﻋﺔ ﺍﻟﱵ ﻳﻨﺘﻤﻲ ﺇﻟﻴﻬﺎ‪.‬‬

‫‪ :TBL_GROUP ‬ﺟﺪﻭﻝ ﺍ‪‬ﻤﻮﻋﺎﺕ ﻭ ﻳﻀﻢ ﺍﳊﻘﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ ) ﺭﻗﻢ ﺍ‪‬ﻤﻮﻋﺔ‪،‬‬


‫ﻓﻬﻮ ﺣﻘﻞ ﺃﺟﻨﱯ ﻟﻠﺮﺑﻂ ﺑﲔ‬ ‫‪SPECIALITY_ID‬‬ ‫ﺍﲰﻬﺎ( ﺃﻣﺎ ﺭﻗﻢ ﺍﻟﺘﺨﺼﺺ‬
‫ﺍ‪‬ﻤﻮﻋﺔ ﻭ ﺍﻟﺘﺨﺼﺺ‬

‫‪ :TBL_SPECIALITY ‬ﺟﺪﻭﻝ ﺍﻟﺘﺨﺼﺼﺎﺕ ﻭ ﻳﻀﻢ ﺍﳊﻘﻮﻝ ﺍﻟﺘﺎﻟﻴﺔ )ﺭﻗﻢ‬


‫ﺍﻟﺘﺨﺼﺺ‪،‬ﺍﲰﻪ(‪.‬‬

‫‪ :TBL_ABSENCE ‬ﻭﻫﻮ ﺟﺪﻭﻝ ﺍﻟﻐﻴﺎﺏ ﻭﻳﻀﻢ ﺍﳊﻘﻮﻝ ﺍﻷﺗﻴﺔ )ﺭﻗﻢ ﺍﻟﻐﻴﺎﺏ‬


‫‪ ،Auto‬ﻭ ﺗﺎﺭﻳﺦ ﺍﻟﻐﻴﺎﺏ‪،‬ﻭﻋﺪﺩ ﺍﻟﺴﺎﻋﺎﺕ‬ ‫‪increment‬‬ ‫ﻭﺳﻨﺠﻌﻠﻪ ﺗﻠﻘﺎﺋﻲ‬
‫ﺍﳌﺘﻐﻴﺒﺔ‪ ،‬ﻭ ﺍﳌﻼﺣﻈﺎﺕ(‪.‬‬

‫ﻛﺨﻼﺻﺔ‪ ،‬ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻫﺬﻩ ﻣﺎ ﻫﻲ ﺇﻻ ﳕﻮﺫﺝ ﻣﺒﺴﻂ ﺳﻨﺴﻌﻰ ﻣﻦ ﺧﻼﻟﻪ ﺷﺮﺡ ﺍﳌﻔﺎﻫﻴﻢ‬
‫ﺍﳌﺮﻭﻣﺔ‪.‬‬

‫‪7‬‬
: ‫ﻭ ﻫﺬﺍ ﻫﻮ ﻛﻮﺩ ﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
--CREATION OD DATABASE 'STUDENTS_DB'
create database STUDENTS_DB
GO

use STUDENTS_DB;

--SPECIALITY TABLE
create table TBL_SPECIALITY(SPECIALITY_ID int,SPECIALITY_LABEL
varchar(100),
Primary key(SPECIALITY_ID))

--GROUP TABLE

create table TBL_GROUP (GROUP_ID int,GROUP_LABEL varchar(50),SPECIALITY_ID


int
,Primary key(GROUP_ID),Foreign key(SPECIALITY_ID) references
TBL_SPECIALITY)

--STUDENT TABLE

create table TBL_STUDENT(STUDENT_ID int,FIRST_NAME varchar(5),LAST_NAME


varchar(50),
STUDENT_ADDRESS varchar(250),BIRTHDATE datetime,SEX varchar(50),GROUP_ID
int,
primary key(STUDENT_ID),Foreign key(GROUP_ID) references TBL_GROUP)

--ABSENCE TABLE

create table TBL_ABSENCE(ABSENCE_ID int IDENTITY(1,1) NOT NULL,STUDENT_ID


int,ABSENSE_DATE Datetime, NBR_HOURS int,REMARK nvarchar(250),Primary
key(ABSENCE_ID),
Foreign key(STUDENT_ID) references TBL_STUDENT)

8
‫ﺍﻵﻥ ﺑﻌﺪ ﺃﻥ ﺃﻧﺸﺄﺕ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺇﺫﻫﺐ ﺇﱃ ﺍﻟﻔﻴﺠﻮﺍﻝ ﺍﺳﺘﻮﺩﻳﻮ ﻭ ﻗﻢ ﺑﺈﻧﺸﺎﺀ ﻣﺸﺮﻭﻉ‬
‫ﺟﺪﻳﺪ ﻭ ﻟﻴﻜﻦ ﺍﲰﻪ ‪: DataAccessLAyer_Demo‬‬

‫إﻧﺷﺎء ﻣﺷروع ﺟدﯾد ﻣن ﻧوع ‪Windows Forms Application‬‬

‫‪9‬‬
‫ﺑﻌﺪ ﺫﻟﻚ ﺳﻨﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺍﻟﻔﺌﺔ ﺍﻟﺮﺋﻴﺴﻴﺔ ‪ DataAccessLayer‬ﻭﻟﻜﻦ ﻗﺒﻞ ﺫﻟﻚ ﺗﻌﺎﻝ ﻣﻌﻲ‬
‫ﻟﻨﺘﻌﺮﻑ ﻋﻠﻴﻬﺎ‬

‫ﺗﻌﺮﻳﻒ‪:‬‬

‫ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ ﻫﻲ ﻗﺒﻞ ﻛﻞ ﺷﻲﺀ ﻓﺌﺔ ‪ Class‬ﻭ ﻣﻦ ﺧﻼﻝ ﺍﲰﻬﺎ ﻧﺴﺘﻨﺒﻂ ﺃ‪‬ﺎ ﺗﻌﲏ‬
‫)ﻃﺒﻘﺔ ﺍﻟﺪﺧﻮﻝ ﺇﱃ ﺍﻟﺒﻴﺎﻧﺎﺕ( ﲟﻌﲎ ﺃ‪‬ﺎ ﺍﻟﻘﻨﻄﺮﺓ ﺍﻟﺮﺍﺑﻄﺔ ﺑﲔ ﺍﻟﱪﻧﺎﻣﺞ ﻭ ﺑﲔ ﻗﺎﻋﺪﺓ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‪.‬‬

‫ﺇﺫﺍ ﻻﺣﻈﺖ ﻣﻌﻲ ﻓﻘﺪ ﺫﻛﺮﻧﺎ ﻫﻨﺎ ﺛﻼﺛﺔ ﻋﻨﺎﺻﺮ ﻣﻬﻤﺔ ﻭﻫﻲ ‪:‬‬

‫‪ ‬ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬

‫‪ ‬ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ‬

‫‪ ‬ﺍﻟﱪﻧﺎﻣﺞ )ﺃﻗﺼﺪ ﺑﺎﻟﱪﻧﺎﻣﺞ ﺍﻟﻨﻮﺍﻓﺬ ﻭ ﺍﻟﻔﺌﺎﺕ(‬

‫‪MVC‬‬ ‫ﻭ ﻫﺬﺍ ﻣﺎ ﻳﺴﻤﻰ ﺍﻟﺘﻄﺒﻴﻖ ﻣﺘﻌﺪﺩ ﺍﻟﻄﺒﻘﺎﺕ‪ ،‬ﺃﻭ ﻣﺎ ﻳﺼﻄﻠﺢ ﻋﻠﻴﻪ ﺏ‬


‫)‪(Model,View,Controller‬‬

‫ﺍﳌﻮﺩﻳﻞ ﻫﻨﺎ ﻫﻮ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ ،‬ﺍﻟﻔﻴﻮ ﻫﻮ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻭ ﺍﻟﻜﻮﻧﺘﺮﻭﻟﺮ ﻫﻮ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ‬
‫ﻭﺑﺎﻗﻲ ﺍﻟﻔﺌﺎﺕ‪.‬‬

‫‪10‬‬
‫ﻭ ﺍﻟﻐﺎﻳﺔ ﻣﻦ ﻫﺬﻩ ﺍﻟﺒﻨﻴﺔ ﻫﻲ ﺗﻨﻈﻴﻢ ﺍﻟﱪﳎﺔ ﻭ ﺗﻘﺴﻴﻤﻬﺎ ﺇﱃ ﺃﺟﺰﺍﺀ ﻟﻴﺴﻬﻞ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻛﻞ‬
‫ﺟﺰﺀ ﻋﻠﻰ ﺣﺪﻯ‪ ،‬ﻭ ﺣﱴ ﻧﺮﻛﺰ ﺍﻟﺸﻔﺮﺓ ﺍﻟﺮﺋﻴﺴﻴﺔ ﰲ ﻓﺌﺔ ﻭﺍﺣﺪﺓ ﺗﻜﻮﻥ ﺍﳉﺴﺮ ﺍﻟﻔﺎﺻﻞ ﺑﲔ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭ ﺑﲔ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻫﺬﻩ ﺍﻟﻔﺌﺔ ﺍﻟﱵ ﺫﻛﺮﻧﺎ ﺑﺄ‪‬ﺎ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ‪.‬‬

‫ﻣﻦ ﻫﻨﺎ ﻧﺴﺘﻨﺘﺞ ﺑﺄﻥ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ ﺳﺘﻀﻢ ﺩﻭﺍﻝ ﺍﻟﺮﺑﻂ ﺑﻘﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭ ﻗﺮﺍﺀﺓ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﻭ ﺇﺭﺳﺎﳍﺎ‪.‬‬

‫ﺳﺄﻓﺘﺮﺽ ﺃﻧﻚ ﻋﻠﻰ ﺍﻃﻼﻉ ﺑﺎﻹﺟﺮﺍﺀﺍﺕ ﺍﳌﺨﺰﻧﺔ ‪ stored procedures‬ﰲ ‪ . sql server‬ﺇﻥ‬
‫ﻛﺎﻥ ﺍﻷﻣﺮ ﻛﺬﻟﻚ ﻓﻠﻨﺘﺎﺑﻊ ﺇﺫﻥ‪.‬‬

‫ﺳﻨﻨﺸﺊ ﻓﺌﺔ ﺟﺪﻳﺪﺓ ﺑﺎﺳﻢ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ ‪.‬‬

‫ﻭ ﺳﻨﻘﻮﻡ ﺑﺎﺳﺘﲑﺍﺩ ﳎﺎﻻﺕ ﺍﻷﲰﺎﺀ ﺍﻟﺘﺎﻟﻴﺔ ‪System.Data.SqlClient, System.Data :‬‬

‫ﻭﺳﻨﻘﻮﻡ ﺑﺎﻻﻋﻼﻥ ﻋﻦ ﻣﺘﻐﲑ ﻣﻦ ﻧﻮﻉ ‪SqlConnection‬‬

‫ﺑﻌﺪ ﺫﻟﻚ ﺳﻨﻨﺸﺊ ﻣﺸﻴﺪﺍ ﻟﻠﻔﺌﺔ ‪ Constructor‬ﻭﻣﻦ ﺧﻼﻟﻪ ﺳﻨﺤﺪﺩ ﻧﺺ ﺍﻟﻜﻮﻧﻴﻜﺸﻦ‪.‬‬

‫ﺃﻱ ﺳﻴﻜﻮﻥ ﺍﻟﻜﻮﺩ ﻫﻜﺬﺍ ‪:‬‬

‫‪11‬‬
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace DataAccessLayer
{
class DataAccessLayer
{
static SqlConnection SqlCon;

public DataAccessLayer()
{
SqlCon = new
SqlConnection("Server= .\\SQLEXPRESS;Database=STUDENTS_DB;integ
rated security=true");
}
}
}

.‫ﻭﺍﺣﺬﺭ ﺃﻥ ﺗﻘﻮﻡ ﺑﻨﺴﺦ ﺍﻟﻜﻮﺩ ﻓﻌﻠﻴﻚ ﺃﻥ ﺗﻐﲑ ﻧﺺ ﺍﻟﻜﻮﻧﻴﻜﺸﻦ ﺣﺴﺐ ﻧﻈﺎﻣﻚ‬

: ‫ﺑﻌﺪ ﺫﻟﻚ ﺳﻨﻨﺸﺊ ﺩﺍﻟﱵ ﺭﺑﻂ ﺍﻹﺗﺼﺎﻝ ﻭ ﺇﻏﻼﻗﻪ‬

public void Connect()


{
if (SqlCon.State != ConnectionState.Open)
SqlCon.Open();
}

public void Disconnect()


{
if (SqlCon.State != ConnectionState.Closed)
SqlCon.Close();
}

12
: ‫ﻭ ﰲ ﺍﻷﺧﲑ ﺳﻨﻨﺸﺊ ﺩﺍﻟﺔ ﻟﻘﺮﺍﺀﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭ ﺩﺍﻟﺔ ﻹﺭﺳﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ‬
public DataTable SelectData(String Stored, SqlParameter[]
Param)
{
SqlCommand SqlCmd = new SqlCommand(Stored, SqlCon);
SqlCmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < Param.Length ; i++)
{
SqlCmd.Parameters.Add(Param[i]);
}
SqlDataAdapter SqlDa = new SqlDataAdapter(SqlCmd);
DataTable Dt = new DataTable();
SqlDa.Fill(Dt);
return Dt;
}

‫ ﻟﻨﺘﻤﻜﻦ ﻣﻦ ﺍﺳﺘﻐﻼﻟﻪ ﰲ ﺇﻇﻬﺎﺭ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭ ﺍﻟﻠﻌﺐ‬DataTable ‫ﻫﺬﻩ ﺍﻟﺪﺍﻟﺔ ﺗﻌﻴﺪ ﻟﻨﺎ ﺟﺪﻭﻻ‬
.‫ﺎ ﻛﻤﺎ ﻧﺮﻳﺪ‬

‫ ﻭ ﻫﻲ‬Param ‫ ﻭ‬،‫ ﻭﻫﻮ ﺍﺳﻢ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ‬Stored ‫ﺗﺄﺧﺬ ﺍﻟﺪﺍﻟﺔ ﻣﺘﻐﲑﻳﻦ ﺩﺍﺧﻠﻴﲔ ﺃﻭﳍﻤﺎ‬
.Stored Procedure ‫ﺍﻟﺒﺎﺭﺍﻣﺘﺮﺍﺕ ﺍﻟﱵ ﺗﻨﺘﻈﺮﻫﺎ‬

.‫ﻭ ﺳﻨﻔﻬﻢ ﻫﺬﺍ ﺑﺎﻟﺘﻔﺼﻴﻞ ﻓﻴﻤﺎ ﻳﻠﻲ‬

‫ ﻟﲑﺳﻞ ﺍﻟﺒﺎﺭﺍﻣﺘﺮﺍﺕ ﺇﱃ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﻭﺫﻟﻚ‬SqlCommand ‫ﰒ ﺃﻋﻠﻨﺎ ﻋﻦ ﻣﺘﻐﲑ ﻣﻦ ﻧﻮﻉ‬


.For ‫ﺑﺘﻤﺮﻳﺮﻫﺎ ﻛﻠﻬﺎ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﺘﻜﺮﺍﺭ‬

13
‫ﺑﻌﺪ ﻋﻤﻠﻴﺔ ﺍﺭﺳﺎﻝ ﺍﻟﺒﺎﺭﺍﻣﺘﺮﺍﺕ‪ ،‬ﻧﻨﺸﺊ ﻛﺎﺋﻨﺎ ﻣﻦ ‪ SqlDataAdapter‬ﻟﻴﻘﻮﻡ ﺑﺄﺧﺬ ﻧﺘﺎﺋﺞ‬
‫‪ SqlCommand‬ﻭﻭﺿﻌﻬﺎ ﰲ ‪ Datatable‬ﺍﻟﱵ ﺳﻨﺤﺼﻞ ﳓﻦ ﻓﻴﻤﺎ ﺑﻌﺪ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻣﻦ‬
‫ﺧﻼﳍﺎ‪.‬‬

‫ﻭ ﻫﺬﻩ ﺩﺍﻟﺔ ﺇﺭﺳﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ ‪:‬‬


‫)‪public void ExecuteCommand(String Stored, SqlParameter[] Param‬‬
‫{‬
‫;)‪SqlCommand SqlCmd = new SqlCommand(Stored, SqlCon‬‬
‫;‪SqlCmd.CommandType = CommandType.StoredProcedure‬‬
‫)‪for (int i = 0; i < Param.Length; i++‬‬
‫{‬
‫;)]‪SqlCmd.Parameters.Add(Param[i‬‬
‫}‬
‫;)(‪SqlCmd.ExecuteNonQuery‬‬
‫}‬

‫ﻭﻫﻲ ﻣﺜﻞ ﺍﻟﺪﺍﻟﺔ ﺍﻟﺴﺎﺑﻘﺔ ﺇﻻ ﺃ‪‬ﺎ ﻻ ﺗﻘﻮﻡ ﺑﻘﺮﺍﺀﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻭ ﺇﳕﺎ ﺑﺈﺭﺳﺎﳍﺎ‪.‬‬

‫ﺃﲤﲎ ﺃﻥ ﺗﻜﻮﻥ ﻗﺪ ﺗﻌﺮﻓﺖ ﻋﻠﻰ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ ‪ ،‬ﺇﻥ ﻛﺎﻥ ﺍﻟﻌﻜﺲ ﻓﻼ ﺗﺘﺮﺩﺩ ﰲ ﻗﺮﺍﺀﺓ‬
‫ﺍﻟﻔﻘﺮﺓ ﺟﻴﺪﺍ ﻓﺎﻷﻣﺮ ﺳﻬﻞ ﺟﺪﺍ ﻭﻳﺴﺘﻠﺰﻡ ﻣﻨﻚ ﻓﻘﻂ ﺷﻴﺌﺎ ﻣﻦ ﺍﻟﺘﺮﻛﻴﺰ ‪ ،‬ﻭﻫﺬﺍ ﻫﻮ ﺍﻟﻜﻮﺩ‬
‫ﻛﺎﻣﻼ‪:‬‬

‫‪14‬‬
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace DataAccessLayer
{
class DataAccessLayer
{
static SqlConnection SqlCon;

public DataAccessLayer()
{
SqlCon = new
SqlConnection("Server=.\\SQLEXPRESS;Database=STUDENTS_DB;integrated
security=true");
}
public void Connect()
{
if (SqlCon.State != ConnectionState.Open)
SqlCon.Open();
}

public void Disconnect()


{
if (SqlCon.State != ConnectionState.Closed)
SqlCon.Close();
}

public DataTable SelectData(String Stored, SqlParameter[] Param)


{
SqlCommand SqlCmd = new SqlCommand(Stored, SqlCon);
SqlCmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < Param.Length ; i++)
{
SqlCmd.Parameters.Add(Param[i]);
}
SqlDataAdapter SqlDa = new SqlDataAdapter(SqlCmd);
DataTable Dt = new DataTable();
SqlDa.Fill(Dt);
return Dt;
}

15
public void ExecuteCommand(String Stored, SqlParameter[] Param)
{
SqlCommand SqlCmd = new SqlCommand(Stored, SqlCon);
SqlCmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < Param.Length; i++)
{
SqlCmd.Parameters.Add(Param[i]);
}
SqlCmd.ExecuteNonQuery();
}

}
}

‫ ﲢﺘﻮﻱ ﻋﻠﻰ‬Absence ‫ ﺳﻨﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻓﺌﺔ‬،‫ﻭ ﺍﻵﻥ ﺣﺎﻥ ﺍﻟﻮﻗﺖ ﻟﻨﺴﺘﻐﻞ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ‬
‫ ﻭ ﺍﻟﺜﺎﻧﻴﺔ ﺇﺿﺎﻓﺔ ﻏﻴﺎﺏ ﺟﺪﻳﺪ‬،‫ ﺍﻷﻭﱃ ﻣﺸﺎﻫﺪﺓ ﻏﻴﺎﺏ ﺍﻟﻄﺎﻟﺐ ﻣﻦ ﺧﻼﻝ ﺭﻗﻤﻪ‬: ‫ﺩﺍﻟﺘﲔ‬
:‫ﻟﻠﻄﺎﻟﺐ‬

:‫ﻫﺬﻩ ﻫﻲ ﺍﻟﺪﺍﻟﺔ ﺍﻷﻭﱃ‬


public DataTable SelectAbsence(int STUDENT_ID)
{
DataAccessLayer Dal = new DataAccessLayer();
DataTable Dt = new DataTable();
SqlParameter[] Param=new SqlParameter[0];
try
{
Param[0] = new SqlParameter("@STUDENT_ID", SqlDbType.Int);
Param[0].Value = STUDENT_ID;
Dal.Connect();
Dt=Dal.SelectData("SP_SelectAbsence", Param);
}
catch
{
Dal.Disconnect();
}
return Dt;
}

16
‫ﺑﺎﻟﻨﺴﺒﺔ ﻟﻞ ‪ SP_SelectAbsence‬ﻓﻬﻲ ﺇﺟﺮﺍﺀ ﳐﺰﻥ ‪ Stored Procedure‬ﻳﻘﻮﻡ ﲜﻠﺐ‬
‫ﺑﻴﺎﻧﺎﺕ ﻏﻴﺎﺏ ﺍﻟﻄﺎﻟﺐ ﻣﻦ ﺧﻼﻝ ﺭﻗﻤﻪ ﻭ ﻫﺬﺍ ﻫﻮ ﻛﻮﺩ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ‪:‬‬
‫‪create proc SP_SelectAbsence‬‬
‫‪@STUDENT_ID int‬‬
‫‪as‬‬
‫‪select ABSENSE_DATE, NBR_HOURS, REMARK‬‬
‫‪from TBL_ABSENCE where STUDENT_ID =@STUDENT_ID‬‬

‫ﺃﻋﺘﻘﺪ ﺃﻥ ﺍﻹﺟﺮﺍﺀ ﻳﺸﺮﺡ ﻧﻔﺴﻪ ﺑﻨﻔﺴﻪ‪ ،‬ﲝﻴﺚ ﻳﺘﻠﻘﻰ ﺭﻗﻢ ﺍﻟﻄﺎﻟﺐ ﻛﺒﺎﺭﺍﻣﺘﺮ ﻭ ﻳﺒﺤﺚ ﻋﻨﻪ‪.‬‬

‫ﺍﻟﺪﺍﻟﺔ ﺍﻟﺜﺎﻧﻴﺔ ﰲ ﺍﻟﻔﺌﺔ ‪ Absence‬ﻭﻫﻲ ﺩﺍﻟﺔ ﺇﺿﺎﻓﺔ ﻏﻴﺎﺏ ﺟﺪﻳﺪ ﻭ ﻟﻜﻦ ﻗﺒﻞ ﺫﻟﻚ ﺳﻨﻨﺸﺊ‬
‫ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﺍﻟﺬﻱ ﻳﻘﻮﻡ ﺑﻌﻤﻠﻴﺔ ﺍﻹﺿﺎﻓﺔ‪:‬‬

‫‪create proc SP_AddAbsence‬‬


‫)‪@STUDENT_ID int,@ABSENSE_DATE datetime,@NBR_HOURS int,@REMARK nvarchar(250‬‬
‫‪as‬‬
‫)‪insert into TBL_ABSENCE(STUDENT_ID, ABSENSE_DATE, NBR_HOURS, REMARK‬‬
‫)‪values(@STUDENT_ID,@ABSENSE_DATE,@NBR_HOURS,@REMARK‬‬

‫‪.TBL_ABSENCE‬‬ ‫ﻳﻌﲏ ﻗﻤﻨﺎ ﺑﺈﺿﺎﻓﺔ ﺍﻟﺒﺎﺭﺍﻣﺘﺮﺍﺕ ﺍﻟﱵ ﻳﺘﻠﻘﺎﻫﺎ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﺇﱃ ﺍﳉﺪﻭﻝ‬

‫ﻭﺍﻵ ﻥ ﻫﺬﻩ ﻫﻲ ﺩﺍﻟﺔ ﺍﻹﺿﺎﻓﺔ ﻭ ﺍﻟﱵ ﺗﺴﺘﻌﻤﻞ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ ﻛﻮﺳﻴﻠﺔ ﻟﻠﻮﺻﻮﻝ ﺇﱃ‬
‫ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﻟﻠﻜﺘﺎﺑﺔ ﰲ ﺍﳉﺪﻭﻝ ‪.TBL_ABSENCE‬‬

‫‪17‬‬
public void AddAbsence(int STUDENT_ID, DateTime ABSENCE_DATE, int
NBR_HOURS, String REMARK)
{
DataAccessLayer Dal = new DataAccessLayer();
SqlParameter[] Param = new SqlParameter[4];
try
{
Param[0] = new SqlParameter("@STUDENT_ID", SqlDbType.Int);
Param[0].Value = STUDENT_ID;
Param[1] = new SqlParameter("@ABSENSE_DATE",
SqlDbType.DateTime);
Param[1].Value = ABSENCE_DATE;
Param[2] = new SqlParameter("@NBR_HOURS", SqlDbType.Int);
Param[2].Value = NBR_HOURS;
Param[3] = new SqlParameter("@REMARK", SqlDbType.NVarChar);
Param[3].Value = REMARK;
Dal.Connect();
Dal.ExecuteCommand("SP_AddAbsence", Param);
}
catch
{
Dal.Disconnect();
}
}

‫ﻛﻤﺎ ﺗﺮﻯ ﻗﻤﻨﺎ ﺑﺈﺭﺳﺎﻝ ﺍﻟﺒﺎﺭﺍﻣﺘﺮﺍﺕ ﺇﱃ ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﻮﺳﻴﻂ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ‬
‫ ﻧﺮﺳﻞ ﻛﻞ ﺑﺎﺭﺍﻣﺘﺮ ﺑﻌﺪﻣﺎ ﳓﺪﺩ ﺍﲰﻪ ﻭﻧﻮﻋﻪ ﻭ ﻳﻠﺰﻡ ﺃﻥ ﻳﻜﻮﻧﺎ ﻣﻄﺎﺑﻘﲔ ﳌﺜﻴﻠﻴﻬﻤﺎ ﰲ‬.‫ﻻﻳﺮ‬
.‫ ﻭ ﺃﺩﱏ ﺍﺧﺘﻼﻑ ﻗﺪ ﻳﺴﺒﺐ ﺧﻄﺄ‬،‫ﺍﻹﺟﺮﺍﺀ ﺍﳌﺨﺰﻥ‬

.Absence ‫ﻭﻧﺮﺻﺪ ﻫﻨﺎ ﺷﻔﺮﺓ ﺍﻟﻔﺌﺔ‬

18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace DataAccessLayer
{
class Absence
{
public DataTable SelectAbsence(int STUDENT_ID)
{
DataAccessLayer Dal = new DataAccessLayer();
DataTable Dt = new DataTable();
SqlParameter[] Param=new SqlParameter[0];
try
{
Param[0] = new SqlParameter("@STUDENT_ID", SqlDbType.Int);
Param[0].Value = STUDENT_ID;
Dal.Connect();
Dt=Dal.SelectData("SP_SelectAbsence", Param);
}
catch
{
Dal.Disconnect();
}
return Dt;
}

19
public DataTable SelectAbsence(int STUDENT_ID)
{
DataAccessLayer Dal = new DataAccessLayer();
DataTable Dt = new DataTable();
SqlParameter[] Param=new SqlParameter[0];
try
{
Param[0] = new SqlParameter("@STUDENT_ID", SqlDbType.Int);
Param[0].Value = STUDENT_ID;
Dal.Connect();
Dt=Dal.SelectData("SP_SelectAbsence", Param);
}
catch
{
Dal.Disconnect();
}
return Dt;
}

}
}

‫ ﻛﻞ ﻣﺎ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﻪ ﻣﻦ ﻛﻮﺩ ﺳﻨﺴﺘﻌﻤﻠﻪ ﺍﻵﻥ ﺑﺒﺴﺎﻃﺔ‬،‫ﻭﺍﻵﻥ ﺣﺎﻥ ﻣﻮﺳﻢ ﺟﲏ ﺍﻟﺜﻤﺎﺭ‬


‫ ﺣﻴﺚ ﰲ ﺃﺳﻄﺮ ﻗﻠﻴﻠﺔ ﺳﻨﻘﻮﻡ ﺑﺎﻟﻜﺜﲑ ﻣﻦ ﺍﳌﻬﺎﻡ ﻭﻫﺬﻩ ﻧﻘﻄﺔ ﻣﻦ ﺃﻫﻢ‬،‫ﻣﻨﻘﻄﻌﺔ ﺍﻟﻨﻈﲑ‬
.‫ﺇﳚﺎﺑﻴﺎﺕ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ‬

20
:‫ﻟﻴﻜﻦ ﺍﻟﻔﻮﺭﻡ ﺍﻟﺘﺎﱄ ﻫﻮ ﻓﻮﺭﻡ ﺍﻟﻐﻴﺎﺏ‬

.CONFIRM ‫ﺳﻨﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺷﻔﺮﺓ ﺇﺿﺎﻓﺔ ﻏﻴﺎﺏ ﻭ ﺫﻟﻚ ﺑﺎﻟﻀﻐﻂ ﻣﺮﺗﲔ ﻋﻠﻰ ﺍﻟﺰﺭ‬

Absence Ab = new Absence();


Ab.AddAbsence(int.Parse(TxtID.Text),
DateAbsence.Value,int.Parse(TxtNbr.Text), TxtObserv.Text);

. ‫ﻻ ﺗﺴﺘﻐﺮﺏ ﻓﻬﺬﺍ ﻫﻮ ﻛﻮﺩ ﺇﺿﺎﻓﺔ ﻏﻴﺎﺏ ﺟﺪﻳﺪ‬

21
:‫ﺃﻣﺎ ﻛﻮﺩ ﺍﻟﺒﺤﺚ ﻓﻬﻮ ﻛﻤﺎ ﻳﻠﻲ‬

Absence Ab = new Absence();


DataTable Dt = new DataTable();
Dt=Ab.SelectAbsence(int.Parse(TxtSearch.Text));
this.DGV.DataSource = Dt;

! ‫ﺃﺭﺃﻳﺖ ﲨﺎﻝ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ‬

: ‫ ﻣﺮﺓ ﻭﺍﺣﺪﺓ ﻭﻫﺬﺍ ﻫﻮ ﺍﻟﻜﻮﺩ ﺍﻟﻜﺎﻣﻞ‬Ab ‫ﻭﳝﻜﻦ ﺃﻥ ﻧﻌﻠﻦ ﻋﻦ ﺍﳌﺘﻐﲑ‬


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DataAccessLayer
{
public partial class Form1 : Form
{
Absence Ab = new Absence();
public Form1()
{
InitializeComponent();
}

private void button2_Click(object sender, EventArgs e)


{
Ab.AddAbsence(int.Parse(TxtID.Text), DateAbsence.Value,
int.Parse(TxtNbr.Text), TxtObserv.Text);
}

22
‫)‪private void button1_Click(object sender, EventArgs e‬‬
‫{‬
‫;)(‪DataTable Dt = new DataTable‬‬
‫;))‪Dt=Ab.SelectAbsence(int.Parse(TxtSearch.Text‬‬
‫;‪this.DGV.DataSource = Dt‬‬
‫}‬
‫}‬
‫}‬

‫ﻛﻨﺖ ﺃﻭﺩ ﺃﻥ ﺃﺗﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻ ﻳﺮ ﻣﻦ ﺧﻼﻝ ﻓﺌﺎﺕ ﺟﺪﻳﺪﺓ ﳍﺎ ﻋﻼﻗﺔ ﺑﺎﻟﺘﺨﺼﺼﺎﺕ‬
‫ﻭ ﺍ‪‬ﻤﻮﻋﺎﺕ ﻭﻟﻜﻨﲏ ﺍﻵﻥ ﻣﻘﺘﻨﻊ ﲤﺎﻣﺎ ﺑﺄﻥ ﻧﻔﺲ ﺍﳌﺒﺪﺃ ﺳﻴﻨﻄﺒﻖ ﻋﻠﻴﻬﺎ ﻟﺬﺍ ﺍﺭﺗﺄﻳﺖ ﺍﻹﻛﺘﻔﺎﺀ‬
‫‪‬ﺬﺍ ﻓﺤﺴﺐ‪.‬‬

‫ﻻ ﺗﺘﺸﺎﺀﻡ ﻣﻦ ﻣﻈﻬﺮ ﺍﻟﺪﺍﺗﺎ ﺃﻛﺴﻴﺲ ﻻﻳﺮ ﻓﺒﺸﻲﺀ ﻣﻦ ﺍﻟﺘﻄﺒﻴﻖ ﺳﺘﺠﺪ ﻧﻔﺴﻚ ﻗﺪ ﺍﺳﺘﺴﻐﺘﻬﺎ‬
‫ﻛﻠﻴﺎ ﺑﻞ ﻭ ﺃﺻﺒﺤﺖ ﻗﺎﺩﺭﺍ ﻋﻠﻰ ﺃﻥ ﺗﺒﺪﻉ ﻓﻴﻬﺎ ﻭ ‪‬ﺎ‪.‬‬

‫‪23‬‬
[email protected]

24

You might also like