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