Académique Documents
Professionnel Documents
Culture Documents
2
ﺑﺴﻢ ﷲ اﻟﺮﺣامن اﻟﺮﺣﻴﻢ
ﺑﺴﻢ ﷲ واﻟﺼﻼة واﻟﺴﻼم ﻋﲆ رﺳﻮل ﷲ ،وﻋﲆ آﻟﻪ وﺻﺤﺒﻪ وﻣﻦ واﻻه وﺑﻌﺪ،
ﻓﺈن ﻫﺬه اﻟﺼﻔﺤﺎت اﳌﻌﺮوﺿﺔ ﺑني ﻳﺪﻳﻚ أﺧﻲ اﻟﻜﺮﻳﻢ /أﺧﺘﻲ اﻟﻜﺮميﺔ ،ﺗﻢ إﺻﺪارﻫﺎ ﻗﺒﻞ ﺳﻨﺘني ﺿﻤﻦ
ﺳﻠﺴﻠﺔ ﺧﻄﻮة إﱃ اﻷﻣﺎم اﻟﺘﻲ ﻛﻨﺎ ﻗﺪ اﻋﺘﺰﻣﻨﺎ ﻋﲆ إﻳﺼﺎﻟﻬﺎ إﱃ ﻋﴩ ﺧﻄﻮات ،ﻟﻜﻨﻨﺎ ﺗﻮﻗﻔﻨﺎ ﻋﻨﺪ اﻟﺨﻄﻮة
اﻟﺜﺎﻧﻴﺔ ومل ﻧﻜﻤﻞ ﺑﻌﺪﻫﺎ ﻷﻧﻨﺎ اﻧﺸﻐﻠﻨﺎ ﺑﺎﻟﻜﺘﺎﺑﺔ ﰲ ﻣﺴﺎﺋﻞ أﺧﺮى ،ﻓﻘﺪر ﷲ ﺑﻌﺪ ﻣﺪة أن أﻓﺘﺢ ﻫﺬا اﳌﻠﻒ
ﻷﻋﺪﻟﻪ وأﻧﻘﺤﻪ ﰲ ﻧﺴﺨﺔ ﺟﺪﻳﺪة ﻟﻴﻠﺒﻲ ﺣﺎﺟﺔ اﳌﺘﻌﻠﻤني ،ﻷن اﻟﻨﺴﺨﺔ اﻟﺴﺎﺑﻘﺔ ﻛﺎﻧﺖ ﺗﻌﺮض ﺻﻮر
اﻟﱪاﻣﺞ اﳌﺴﺘﻌﻤﻠﺔ ﺑﺎﻟﻠﻐﺔ اﻟﻔﺮﻧﺴﻴﺔ ،واﻷﺻﻞ أن ﻫﺬه اﻟﻠﻐﺔ ﻟﻴﺴﺖ ﻣﺘﺪاوﻟﺔ ﰲ ﺑﺎﻗﻲ اﻷﻗﻄﺎر اﻟﻌﺮﺑﻴﺔ
ﺑﺎﺳﺘﺜﻨﺎء ﺑﻠﺪان اﳌﻐﺮب اﻟﻌﺮيب ﻟﺬﻟﻚ ﻛﺎن ﻣﻦ اﻟﺠﻴﺪ اﺳﺘﺒﺪال اﻟﺼﻮر اﻟﻔﺮﻧﺴﻴﺔ ﺑﺼﻮر إﻧﺠﻠﻴﺰﻳﺔ ﻷن ذﻟﻚ
أوﺿﺢ وأﺑﻠﻎ.
ﺑﺎﻹﺿﺎﻓﺔ إﱃ ﺗﻨﺴﻴﻖ اﻷﻛﻮاد ،ﻓﻘﺪ ﻗﻤﻨﺎ ﺑﺈﻟﻐﺎء اﻟﺨﻠﻔﻴﺔ اﻟﺘﻲ ﻛﻨﺎ ﻧﻀﻌﻬﺎ ﺧﻠﻒ اﻷﻛﻮاد ،وﻗﻤﻨﺎ ﺑﺘﻜﺒري ﺣﺠﻢ
ﺧﻂ اﻟﻜﻮد ﻟﻴﻜﻮن واﺿﺤﺎ وﻗﺎﺑﻼ ﻟﻠﻨﺴﺦ ﺑﺴﻬﻮﻟﺔ.
ﻫﺬا وإن ﻣﻮﺿﻮع ﻫﺬا اﻟﻜﺘﺎب ﻫﻮ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﰲ اﻟﻔﻴﺠﻮال ﺑﺴﻴﻚ دوت ﻧﻴﺖ ،ﺑﺤﻴﺚ ﻳﻌﺮض اﻟﻔﺼﻞ
اﻷول ﻃﺮﻳﻘﺔ إﻧﺸﺎء ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت واﻟﺠﺪاول واﻟﻌﻼﻗﺎت ﰲ ،Microsoft SQL Serverﻣﻮﺿﺤﺎ اﻟﻔﺮق
ﺑني أﻧﻮاع اﻟﻌﻼﻗﺎت اﳌﻤﻜﻦ إﻧﺸﺎؤﻫﺎ ﺑني اﻟﺠﺪاول.
ﺑﻴﻨام ﻳﻌﺮض اﻟﻔﺼﻞ اﻟﺜﺎين ﻣﺨﺘﴫا ﻟﻠﻐﺔ اﻻﺳﺘﻌﻼم ﻋﻦ اﻟﺒﻴﺎﻧﺎت اﳌﺸﻬﻮرة ،SQLﺛﻢ ﻧﺒﺪأ رﺣﻠﺘﻨﺎ اﻟﻌﻤﻠﻴﺔ
ﻋﱪ ﻋﻤﻠﻴﺎت اﻟﺮﺑﻂ ﺑني اﻟﱪﻧﺎﻣﺞ وﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،ﺑﺎﻹﺿﺎﻓﺔ إﱃ أواﻣﺮ اﻹﺿﺎﻓﺔ واﻟﺘﻌﺪﻳﻞ واﻟﺤﺬف
واﻟﺒﺤﺚ واﻟﺘﻨﻘﻞ ﺑني اﻟﺒﻴﺎﻧﺎت ﺑﻄﺮﻳﻘﺘني ﻣﺨﺘﻠﻔﺘني.
3
ﰲ ﺣني ﻳﺒﻘﻰ اﻟﻔﺼﻞ اﻷﺧري ﻣﺠﺮد ﻣﻠﺤﻖ ،ﳌﻦ ﻳﺮﻳﺪ اﻟﺘﻌﺮف ﻋﲆ ﻛﻴﻔﻴﺔ إﻧﺠﺎز ﺑﻌﺾ اﳌﻬﺎم ﺑﺮﻣﺠﻴﺎ ،وﻗﻤﻨﺎ
ﺑﺈدراج ﻛﻮد ﻛﻞ ﻣﺸﻜﻠﺔ ﻣﺮدﻓﻴﻪ ﺑﴩح ﻣﻮﺟﺰ.
وﺗﺠﺪر اﻹﺷﺎرة إﱃ أﻧﻪ ﻳﻮﺟﺪ ﻛﺘﺎب آﺧﺮ ﻣامﺛﻞ ﻟﻬﺬا اﻟﻜﺘﺎب اﳌﻮﺟﻮد ﺑني ﻳﺪﻳﻚ ،وﻫﻮ ﻳﻌﺮض ﻧﻔﺲ
اﻷﻣﺜﻠﺔ اﳌﺪروﺳﺔ ﻟﻜﻦ ﻣﻊ ﻗﺎﻋﺪة ﺑﻴﺎﻧﺎت ﻣﻦ ﻧﻮع ،Microsoft Accessوﻫﻮ ﻳﺤﻤﻞ ﻧﻔﺲ اﺳﻢ اﻟﻜﺘﺎب
وﻣﺘﺎح ﻟﻠﺘﺤﻤﻴﻞ ﻋﲆ أﻛﺎدميﻴﺔ اﳌﱪﻣﺠني اﻟﻌﺮب.
ﻫﺬا وﻧﺴﺄل ﷲ ﻋﺰ وﺟﻞ اﻹﺧﻼص واﻟﺼﺪق واﻟﺘﻮﻓﻴﻖ واﻟﺴﺪاد ﻟﻨﺎ وﻟﺴﺎﺋﺮ اﳌﺴﻠﻤني ،وأن ﻳﺠﻌﻞ ﻫﺬا
اﻟﻌﻤﻞ اﳌﺘﻮاﺿﻊ ﺧﺎﻟﺼﺎ ﻟﻮﺟﻬﻪ اﻟﻜﺮﻳﻢ ،وأن ﻻ ﻳﺠﻌﻞ ﻟﻠﻨﻔﺲ ﻓﻴﻪ ﺣﻈﺎ.
4
ﻟﻠﻤﺮاﺳﻠﺔ ﻣﻦ أﺟﻞ ﻃﺮح اﻻﻗﱰاﺣﺎت واﳌﻼﺣﻈﺎت واﻟﺘﺴﺎؤﻻت
ﻧﻘﺪم ﻟﻜﻢ ﻋﻨﻮاﻧﻨﺎ اﻹﻟﻜﱰوين :
Khalid_ESSAADANI@Hotmail.fr
0673-07-51-05
5
ﺑﺴﻢ ﷲ ﻋﲆ ﺑﺮﻛﺔ ﷲ
6
:اﻟﺠﺰء اﻷول
ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت
Database
Base de Données
Donn
7
ﺗﻌﺘﱪ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت Databaseﻣﻦ أﻫﻢ اﳌﺼﻄﻠﺤﺎت اﻟﱪﻣﺠﻴﺔ وأﻛرثﻫﺎ ذﻳﻮﻋﺎ ،ﺑﺤﻴﺚ ﻧﺠﺪﻫﺎ ﻣﺮﻓﻘﺔ
ﻣﻊ ﻣﻌﻈﻢ أﻧﻮاع اﻟﺘﻄﺒﻴﻘﺎت ،وﻟﻌﻞ ذﻟﻚ راﺟﻊ إﱃ أﻫﻤﻴﺘﻬﺎ ﰲ ﺣﻔﻆ اﻟﺒﻴﺎﻧﺎت وﺗﻨﻈﻴﻤﻬﺎ وﺗﺴﻬﻴﻞ
اﺳﺘﻌامﻟﻬﺎ.
وﺗﻨﻘﺴﻢ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت إﱃ ﻧﻮﻋني:
ﻣﺤﻠﻴﺔ :ﺗﺴﺘﺨﺪم ﻣﻦ ﻃﺮف ﻣﺴﺘﺨﺪم وﺣﻴﺪ ﻋﲆ ﺟﻬﺎز واﺣﺪ.
ﻋﻦ ﺑﻌﺪ :وﺗﻜﻮن ﻣﺨﺰﻧﺔ ﻋﲆ أﺟﻬﺰة ﻋﻦ ﺑﻌﺪ ،وﻳﺘﻢ اﻟﻮﻟﻮج إﻟﻴﻬﺎ ﻋﻦ ﻃﺮﻳﻖ اﻟﺸﺒﻜﺎت
Networks
وﺣﺘﻰ ﻳﺴﻬﻞ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺒﻴﺎﻧﺎت ﻳﺘﻢ ﺗﺨﺰﻳﻨﻬﺎ ﻋﲆ ﺷﻜﻞ ﺟﺪاول ،Tablesﻛﻞ ﺟﺪول ﻳﻀﻢ ﻣﺠﻤﻮﻋﺔ
ﻣﻦ اﻟﺤﻘﻮل ،واﻟﺤﻘﻞ ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺣﻴﺰ ﻧﻘﻮم ﻓﻴﻪ ﺑﺤﻔﻆ ﺑﻌﺾ اﻟﺒﻴﺎﻧﺎت ،ﻓﻤﺜﻼ ﻟﻮ اﻓﱰﺿﻨﺎ أﻧﻨﺎ ﺑﺼﺪد
إﻧﺸﺎء ﻗﺎﻋﺪة ﺑﻴﺎﻧﺎت ﻟﻠﻤﺪرﺳﺔ ،ﻓﺴﻨﺤﺘﺎج إﱃ إﻧﺸﺎء ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺠﺪاول ﻣﺜﻞ :
ﺟﺪول اﻟﺘﻼﻣﻴﺬ :وﻓﻴﻪ ﻧﻘﻮم ﺑﺤﻔﻆ ﺑﻴﺎﻧﺎت اﻟﺘﻼﻣﻴﺬ ،اﻟﺤﻘﻮل اﳌﻤﻜﻦ إﻧﺸﺎؤﻫﺎ ﰲ ﻫﺬا
اﻟﺠﺪول )اﻻﺳﻢ ،اﻟﻌﻨﻮان ،اﻟﺴﻦ ،اﻟﺠﻨﺲ.(..
ﺟﺪول اﳌﻮاد اﻟﺘﻌﻠﻴﻤﻴﺔ :وﻓﻴﻪ ﻧﻘﻮم ﺑﺤﻔﻆ ﺑﻴﺎﻧﺎت اﳌﻮاد.
ﺟﺪول اﻟﻨﻘﻂ :وﻓﻴﻪ ﻧﻘﻮم ﺑﺤﻔﻆ اﻟﻨﻘﻂ اﻟﺘﻲ ﻳﻘﻮم اﳌﻌﻠﻤﻮن ﺑﺈدﺧﺎﻟﻬﺎ.
ﻃﺒﻌﺎ ﻫﺬا ﻣﺠﺮد ﻣﺜﺎل ﺗﻘﺮﻳﺒﻲ ،ﻓﺎﻟﺠﺪاول ﻻ ميﻜﻨﻨﺎ إﻧﺸﺎؤﻫﺎ ﻋﺸﻮاﺋﻴﺎ وﻟﻜﻦ ﺑﻌﺪ دراﺳﺔ وﺗﺤﻠﻴﻞ
ﻟﻠﻤﺴﺄﻟﺔ ،وﺗﻮﺟﺪ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﻟﻐﺎت ﺗﺤﻠﻴﻞ اﻟﺒﻴﺎﻧﺎت واﻟﺘﻲ ﺗﺴﺘﻌﻤﻞ ﻣﻦ أﺟﻞ ﺗﻔﺎدي ﻛﻞ اﻷﺧﻄﺎء
8
اﳌﻨﻄﻘﻴﺔ واﳌﻨﻬﺠﻴﺔ اﳌﻤﻜﻦ ﺣﺪوﺛﻬﺎ ﻋﲆ ﻣﺴﺘﻮى ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،وﻣﻦ ﺑني ﺗﻠﻚ اﻟﻠﻐﺎت ﻧﺬﻛﺮ :
UML,Merise...
إذن ﻓﻘﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻫﻲ مبﺜﺎﺑﺔ ﻣﻜﺘﺒﺔ ،واﻟﺠﺪاول ﻫﻲ مبﺜﺎﺑﺔ اﻟﺮﻓﻮف ،ﺑﺤﻴﺚ ﻳﺘﻢ ﺣﻔﻆ اﻟﺒﻴﺎﻧﺎت ﰲ
ﻫﺬه اﳌﻜﺘﺒﺔ ﻋﲆ رﻓﻮف ﺧﺎﺻﺔ ﺑﻬﺎ.
ﻟﻠﻮﻟﻮج إﱃ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت واﻟﺘﺤﻜﻢ ﻓﻴﻬﺎ ﻳﺤﺘﺎج اﳌﺴﺘﺨﺪم إﱃ ﻧﻈﺎم إدارة ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ،ﻫﻨﺎﻟﻚ
اﻟﻌﺪﻳﺪ ﻣﻦ ﺑﺮاﻣﺞ إدارة ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ،ﻧﴪد ﻟﻠﻤﺜﺎل ﻻ ﻟﻠﺤﴫ:
...SQL Server, Oracle, Microsoft ACCESS, MySQL, Sybase
ﻫﻨﺎك اﻟﻌﺪﻳﺪ ﻣﻦ اﻟﱪاﻣﺞ اﻟﺘﻲ ﺗﺨﻮل ﻟﻨﺎ إﻧﺸﺎء ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت واﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ،وﻟﻌﻞ أﺑﺮزﻫﺎ أوراﻛﻞ
،Oracleاﻟﺴﻴﻜﻮﻳﻞ ﺳريﻓﺮ ، SQL Serverﻣﻴﻜﺮوﺳﻮﻓﺖ أﻛﺴﻴﺲ ... Microsoft Access
ﰲ ﻫﺬا اﻟﺪرس ﺳﻮف ﻧﻨﺸﺊ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﺑﺎﻻﻋﺘامد ﻋﲆ ،Microsoft SQL Serverﺛﻢ ﺑﻌﺪ ذﻟﻚ
ﻧﻘﻮم ﺑﺮﺑﻂ ﻫﺬه اﻟﻘﺎﻋﺪة ﻣﻊ ﺑﺮﻧﺎﻣﺞ ﻧﻨﺸﺌﻪ ﺑﺎﻟﻔﻴﺠﻮال ﺑﺰﻳﻚ ،وﺳﻮف ﻧﺴﺘﻌﺮض أﻏﻠﺐ اﻟﻌﻤﻠﻴﺎت اﻟﺘﻲ
ﻗﺪ ﻧﺤﺘﺎﺟﻬﺎ ﻹﻧﺸﺎء ﺑﺮﻧﺎﻣﺞ ﻣﺘﻜﺎﻣﻞ ﻳﻌﻤﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت.
ﺧﻼﺻﺔ:
9
ﻋﲆ ﺑﺮﻛﺔ ﷲ
اﻵن إن ﺷﺎء ﷲ ﺳﻮف ﻧﻨﺘﻘﻞ إﱃ ﺑﺮﻧﺎﻣﺞ Microsoft SQL Serverﻟﻨﻘﻮم ﺑﺈﻧﺸﺎء ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت،
وﻟﻜﻦ ﻗﺒﻞ ذﻟﻚ ،دﻋﻨﻲ أوﺿﺢ ﻟﻚ ﻧﻘﻄﺔ ﻣﻌﻴﻨﺔ:
ﻟﻴﺲ ﻫﻨﺎﻟﻚ اﺧﺘﻼف ﻋﲆ ﻣﺴﺘﻮى اﻟﺸﻔﺮة اﻟﱪﻣﺠﻴﺔ ﻋﻨﺪ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺑﺎﻗﻲ أﻧﻈﻤﺔ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت إﻻ ﰲ
أﺷﻴﺎء ﺑﺴﻴﻄﺔ ،ﺑﺤﻴﺚ ﻳﺒﻘﻰ اﳌﺒﺪأ ﻫﻮ ﻫﻮ ،ﻓﺎﻟﺸﻔﺮة اﻟﺘﻲ ﺗﻘﻮم ﺑﺮﺑﻂ اﻟﱪﻧﺎﻣﺞ ﻣﻊ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻣﻦ
ﻧﻮع SQL Serverﻫﻲ ﻧﻔﺴﻬﺎ اﻟﺸﻔﺮة اﻟﺘﻲ ﺗﻘﻮم ﺑﺮﺑﻂ اﻟﱪﻧﺎﻣﺞ ﻣﻊ Microsoft office Accessﻣﻊ
اﺧﺘﻼف ﺑﺴﻴﻂ ﺗﻔﺮﺿﻪ ﺧﺼﻮﺻﻴﺔ ﻛﻞ ﻧﻈﺎم ﻗﻮاﻋﺪ.
ﰲ اﳌﺜﺎل اﻟﺬي ﺳﻨﻌﺮﺿﻪ ،ﺳﻨﺸﺘﻐﻞ ﻋﲆ ،SQL Server 2005إن ﻛﺎﻧﺖ ﻟﺪﻳﻚ ﻧﺴﺨﺔ أﻗﺪم ﻓﺎﻷﻣﺮ أﺳﻬﻞ
ﺑﻜﺜري ،وإن ﻛﺎﻧﺖ ﻟﺪﻳﻚ ﻧﺴﺨﺔ أﺣﺪث ﻓﺎﻷﻣﺮ ﺳﻴﺎن وﻟﻴﺲ ﻫﻨﺎك ﻓﺮق ﻛﺒري.
اذﻫﺐ إﱃ اﻟﻘﺎمئﺔ ،Startﺛﻢ ،All programsﺛﻢ ،Microsoft SQL Server 2005ﺛﻢ SQL Server
Managementﺳﻨﺨﺘﴫ اﻻﺳﻢ إﱃ :SSMSE
anagement Studio Express
10
11
ﻫﺬه ﻫﻲ اﻟﻨﺎﻓﺬة اﻟﺮﺋﻴﺴﻴﺔ ﻟﱪﻧﺎﻣﺞ ،SSMSEﻹﻧﺸﺎء ﻗﺎﻋﺪة ﺑﻴﺎﻧﺎت ﺟﺪﻳﺪة اذﻫﺐ إﱃ اﻟﺘﺒﻮﻳﺐ
Databaseواﺿﻐﻂ ﺑﻴﻤني اﳌﺎوس ،وﻗﻢ ﺑﺎﺧﺘﻴﺎر اﻷﻣﺮ New Databaseﻛام ﺗﻮﺿﺢ اﻟﺼﻮرة اﻟﺘﺎﻟﻴﺔ:
ﺳﻨﻨﺸﺊ ﻗﺎﻋﺪة ﺑﻴﺎﻧﺎت ﻹدارة اﻟﻄﻠﺒﺔ ،ﻓﻠﻨﻀﻊ اﺳﻤﻬﺎ إذن ،StudentBaseأو ﺿﻊ أي اﺳﻢ ﻳﺤﻠﻮ ﻟﻚ ﻓﻼ
دﻳﻜﺘﺎﺗﻮرﻳﺔ ﻫﻨﺎ ☺ ،ﺳﺘﻈﻬﺮ ﻟﻚ اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ ،ﻗﻢ ﺑﻜﺘﺎﺑﺔ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﰲ اﳌﺮﺑﻊ اﳌﺆﻃﺮ
ﺑﺎﻷﺧﴬ ،ﺛﻢ اﺿﻐﻂ ﻋﲆ :OK
12
اﻵن ﺗﻌﺎل ﺑﻨﺎ ﻟﻨﻨﴙء أول ﺟﺪول ﻟﻨﺎ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،وﻟﻌﻤﻞ ذﻟﻚ ادﺧﻞ إﱃ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت اﻟﺘﻲ
ﻗﻤﺖ ﺑﺈﻧﺸﺎﺋﻬﺎ ﺛﻢ اﻧﺰل إﱃ اﻟﺘﺒﻮﻳﺐ اﻟﻔﺮﻋﻲ Tablesواﺿﻐﻂ ﻋﻠﻴﻪ ﺑﻴﻤني اﳌﺎوس واﺧﱰ New Table
ﻛام ﺗﺒني اﻟﺼﻮرة اﻟﺘﺎﻟﻴﺔ:
ﻣﺎ ﻳﻬﻤﻨﺎ ﻫﻮ اﳌﻨﻄﻘﺔ اﳌﺤﺎﻃﺔ ﺑﺎﻟﻠﻮن اﻷﺣﻤﺮ ،ﻓﻜام ﺗﺮى اﻟﺠﺪول ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺤﻘﻮل،
ﻛﻞ ﺣﻘﻞ ﻳﺘﻮﻓﺮ ﻋﲆ اﺳﻢ ﻧﻘﻮم ﺑﻜﺘﺎﺑﺘﻪ ﰲ اﻟﻌﻤﻮد ،Column Nameوﻟﻪ ﻧﻮع ﺑﻴﺎﻧﺎت Data Typeأي
ﻧﻮع اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﻧﺮﻳﺪ ﺗﺨﺰﻳﻨﻬﺎ ﰲ ﻫﺬا اﻟﺤﻘﻞ )رﻗﻤﻴﺔ ،intﻧﺼﻴﺔ ،varcharﻣﻨﻄﻘﻴﺔ ،bitﺗﺎرﻳﺦ
13
(...، Datetimeأﻣﺎ اﻟﻌﻤﻮد اﻷﺧري Allow Nullsﻓﻬﻮ ميﻜﻨﻨﺎ ﻣﻦ ﺗﺤﺪﻳﺪ ﻣﺎ إن ﻛﺎن اﻟﺤﻘﻞ ﻳﺴﻤﺢ
ﺑﺘﺨﺰﻳﻦ ﻗﻴﻤﺔ ﻓﺎرﻏﺔ nullأم ﻻ.
ﺑﻌﺪ ﻫﺬه اﻹﻃﻼﻟﺔ ﺳﻮف ﻧﻘﻮم إن ﺷﺎء ﷲ ﺑﺈﻧﺸﺎء أول ﺟﺪول ﻟﻨﺎ ،وﻫﻮ ﺟﺪول اﻟﻄﻼب:
ﻋﻨﺪ اﻻﻧﺘﻬﺎء ﻣﻦ ﺗﺴﺠﻴﻞ اﻟﺤﻘﻮل ،ﺳﻮف ﻧﺬﻫﺐ إﱃ اﻟﺤﻘﻞ اﻷول ID_Studentوﻧﻀﻐﻂ ﻋﻠﻴﻪ ﺑﻴﻤني
اﻟﻔﺄرة وﻧﺨﺘﺎر ،Primary keyﺑﺎﻟﻔﺮﻧﺴﻴﺔ ،Clé Primaireﺑﺎﻟﻌﺮﺑﻴﺔ أﻋﺘﻘﺪ ﻣﻔﺘﺎح أﺳﺎﳼ ،وميﻜﻨﻨﺎ أﻳﻀﺎ
ﺗﺤﺪﻳﺪه ﻋﻦ ﻃﺮﻳﻖ اﻟﻘﺎمئﺔ اﻟﺘﺎﻟﻴﺔ:
14
واﻟﻐﺎﻳﺔ ﻣﻦ ﺟﻌﻞ اﻟﺤﻘﻞ ﺣﻘﻼ أﺳﺎﺳﻴﺎ ،ﻫﻮ ﺗﻔﺎدي ﺗﻜﺮار ﻋﻨﴫ ﻣﻌني أﻛرث ﻣﻦ ﻣﺮة ،ﻓﻤﺜﻼ ﻻ ﻳﺠﺐ أن
ﻧﺴﺠﻞ ﻃﺎﻟﺒني ﺑﻨﻔﺲ اﻟﺮﻗﻢ وإﻻ ﺣﺪث ﺧﻠﻂ ﻋﲆ ﻣﺴﺘﻮى اﻟﺒﻴﺎﻧﺎت.
ﺗﻌﺮﻳﻒ:
اﳌﻔﺘﺎح اﻟﺮﺋﻴﴘ دوره ﻫﻮ ﺗﺤﺪﻳﺪ ﺣﻘﻞ ﻣﻌني ﻳﻜﻮن ﻣﺘﻔﺮدا ،ﻻ ميﻜﻦ ﺗﻜﺮار ﻗﻴﻤﺘﻪ ،وﻻ ميﻜﻦ أن
ﺗﻜﻮن ﻗﻴﻤﺘﻪ ﻓﺎرﻏﺔ .Null
ﺑﻌﺪ ذﻟﻚ ﻧﻘﻮم ﺑﺈﻏﻼق اﻟﺠﺪول ،ﻓﺘﻈﻬﺮ ﻧﺎﻓﺬة ﺗﺤﺬﻳﺮﻳﺔ ﺗﺴﺄﻟﻨﺎ ﻫﻞ ﻧﺮﻳﺪ أن ﻧﺤﻔﻆ اﻟﺠﺪول ،ﻧﻀﻐﻂ
ﻋﲆ ﻧﻌﻢ ،ﺛﻢ ﻧﻌﻄﻲ ﻟﻠﺠﺪول اﺳام وﻟﻴﻜﻦ ﻣﺜﻼ .Student
ﺑﻨﻔﺲ اﻟﻄﺮﻳﻘﺔ اﻟﺴﺎﺑﻘﺔ ﻧﻨﺸﺊ ﺟﺪول اﳌﻮاد اﻟﺘﺪرﻳﺴﻴﺔ ،Coursesوذﻟﻚ ﺑﺎﻟﺬﻫﺎب إﱃ اﻟﻘﺎمئﺔ "إﻧﺸﺎء
ﺟﺪول" ﺛﻢ ﻧﻘﻮم ﺑﺘﺴﺠﻴﻞ اﻟﺤﻘﻮل اﻟﺘﺎﻟﻴﺔ وﻧﺤﺪد رﻗﻢ اﳌﺎدة ﻋﲆ اﻧﻪ ﻣﻔﺘﺎح أﺳﺎﳼ Primary Key
ﺣﺘﻰ ﻻ ﻳﺘﻢ ﺗﻜﺮاره أﻛرث ﻣﻦ ﻣﺮة.
15
ﻛام ﺗﻼﺣﻆ ﻓﺠﺪول اﳌﻮاد اﻟﺘﺪرﻳﺴﻴﺔ ﻳﺤﺘﻮي ﻓﻘﻂ ﻋﲆ رﻗﻢ اﳌﺎدة واﺳﻤﻬﺎ.
16
ﺑﺎﻟﻄﺒﻊ ﻟﺤﻔﻆ ﻧﻘﻄﺔ ﻣﻌﻴﻨﺔ ،ﺳﻨﺤﺘﺎج إﱃ اﺳﻢ اﻟﻄﺎﻟﺐ ﺻﺎﺣﺐ اﻟﻨﻘﻄﺔ ،وﻛﺬﻟﻚ إﱃ اﳌﺎدة اﻟﺘﻲ ﺣﺼﻞ
ﻓﻴﻬﺎ ﻋﲆ ﻫﺬه اﻟﻨﻘﻄﺔ ،ﻗﻢ ﺑﺘﺤﺪﻳﺪ اﳌﻔﺘﺎح اﻷﺳﺎﳼ وأﺣﻔﻆ اﻟﺠﺪول ﺑﺎﺳﻢ .Marks
ميﻜﻦ ﻟﺠﺪوﻟني أن ﻳﺮﺗﺒﻄﺎ ﻣﻌﺎ ،ﻋﻦ ﻃﺮﻳﻖ ﺣﻘﻞ ﻣﺸﱰك ﺑﻴﻨﻬام ،وميﻜﻦ ﻟﻬﺬا اﻟﱰاﺑﻂ ﺑني اﻟﺠﺪوﻟني أن ﻳﻜﻮن :
17
ﻋﻼﻗﺔ واﺣﺪ ﻷﻛرث )(One to Many / 1 à N
ﻧﺴﺘﻌﻤﻞ ﻫﺬه اﻟﻌﻼﻗﺔ ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻋﻨﴫ واﺣﺪ ﻣﺘﻔﺮد ﻣﻦ ﺟﺪول ﻣﻌني ﻣﺮﺗﺒﻄﺎ مبﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻌﻨﺎﴏ
ﰲ اﻟﺠﺪول اﻵﺧﺮ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ ﺣﺎﴐ ﰲ اﻟﺠﺪوﻟني ﻣﻌﺎ ، .وﻛﻤﺜﺎل ﻋﲆ ذﻟﻚ ﻧﻔﱰض أن ﻟﺪﻳﻨﺎ ﺟﺪول "
اﻟﺴ ﱠﻴﺎح" و ﺟﺪول " اﻹﻗﺎﻣﺔ ﰲ ﻓﻨﺪق".
ﱡ
ﻣﻦ اﳌﻌﻠﻮم أن ﺳﺎﺋﺤﺎ ميﻜﻦ أن ﻳﺤﺠﺰ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻹﻗﺎﻣﺎت ،ﺑﺤﻴﺚ ﻧﺠﺪ أن ﻛﻞ إﻗﺎﻣﺔ ﺣﺠﺰﻫﺎ ﻫﺬا
اﻟﺴﺎﺋﺢ ﺗﺤﺘﻮي ﻋﲆ اﻟﺮﻗﻢ اﻟﺨﺎص ﺑﻪ ،مبﻌﻨﻰ آﺧﺮ ﻟﻮ أردﻧﺎ اﻹﻃﻼع ﻋﲆ ﻛﻞ اﻹﻗﺎﻣﺎت اﻟﺘﻲ ﻗﺎم ﺑﻬﺎ اﻟﺴﺎﺋﺢ
اﻟﻔﻼين ،ﻳﻜﻔﻲ أن ﻧﺒﺤﺚ داﺧﻞ ﺟﺪول اﻹﻗﺎﻣﺎت ﻋﻦ اﳌﺮات اﻟﺘﻲ ﺗﻜﺮر ﻓﻴﻬﺎ رﻗﻤﻪ.
ﺗﺬﻛﺮ ﺟﻴﺪا:
ﻧﺴﺘﻌﻤﻞ ﻫﺬه اﻟﻌﻼﻗﺔ ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻋﻨﴫ واﺣﺪ ﻣﺘﻔﺮد ﻣﻦ ﺟﺪول ﻣﻌني ﻣﺮﺗﺒﻄﺎ مبﺠﻤﻮﻋﺔ ﻣﻦ
اﻟﻌﻨﺎﴏ ﰲ اﻟﺠﺪول اﻵﺧﺮ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ ﺣﺎﴐ ﰲ اﻟﺠﺪوﻟني ﻣﻌﺎ.
18
وﻛﻤﺜﺎل ﻋﲆ ذﻟﻚ ﻧﺬﻛﺮ ﺟﺪوﱄ "ﴍاء ﺳﻠﻌﺔ" و "ﻓﺎﺗﻮرة اﻟﴩاء" ،ﺑﺤﻴﺚ ﻧﺠﺪ أن ﻋﻤﻠﻴﺔ ﴍاء واﺣﺪة ﻟﻬﺎ
ﻓﺎﺗﻮرة واﺣﺪة ﺧﺎﺻﺔ ﺑﻬﺎ ،واﻟﻌﻜﺲ ﺻﺤﻴﺢ إذ ﻻ ميﻜﻦ ﻟﻔﺎﺗﻮرة واﺣﺪة ﻟﻬﺎ رﻗﻤﻬﺎ اﻟﺨﺎص أن ﺗﺼﺤﺐ أﻛرث
ﻣﻦ ﻋﻤﻠﻴﺔ ﴍاء.
ﺗﺬﻛﺮ ﺟﻴﺪا:
ﻋﻨﴫ ﻣﺘﻔﺮد واﺣﺪ ﻣﻦ أﺣﺪ اﻟﺠﺪوﻟني ﻣﺮﺗﺒﻂ ﺑﻌﻨﴫ ﻣﺘﻔﺮد واﺣﺪ ﻣﻦ اﻟﺠﺪول اﻵﺧﺮ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ
ﻳﻮﺟﺪ ﰲ اﻟﺠﺪوﻟني ﻣﻌﺎ.
ﰲ ﻫﺬه اﻟﺤﺎﻟﺔ ﻳﺠﺐ أن ﻳﻜﻮن ﻟﺠﺪول اﻟﻄﻼب ﺣﻘﻞ أﺳﺎﳼ ) ،(Primary Keyوﻛﺬﻟﻚ ﺟﺪول اﳌﻮاد ،ﺛﻢ
ﻧﻘﻮم ﺑﺈﻧﺸﺎء ﺟﺪول ﺛﺎﻟﺚ ﻳﻀﻢ اﻟﺤﻘﻠني اﻟﺮﺋﻴﺴﻴني ﻣﻌﺎ ،وﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﻫﻮ ﺟﺪول اﻟﻨﻘﺎط ،إذ ﺳﻨﺠﺪه
ﻳﻀﻢ رﻗﻢ اﻟﻄﺎﻟﺐ و رﻗﻢ اﳌﺎدة وﻫام ﺣﻘﻼن أﺳﺎﺳﻴﺎن ﰲ اﻟﺠﺪوﻟني اﳌﺮﺗﺒﻄني.
ﺗﺬﻛﺮ ﺟﻴﺪا:
اﻟﻌﺪﻳﺪ ﻣﻦ ﻋﻨﺎﴏ اﻟﺠﺪول اﻷول ﻣﺮﺗﺒﻄﺔ ﺑﺎﻟﻌﺪﻳﺪ ﻣﻦ ﻋﻨﺎﴏ اﻟﺠﺪول اﻟﺜﺎين ،ﻟﺬا وﺟﺐ إﻧﺸﺎء ﺟﺪول
ﺛﺎﻟﺚ ﻳﺮﺑﻂ ﺑﻴﻨﻬام ﻟﻪ ﺣﻘﻼن ﻫام اﳌﻔﺘﺎﺣﺎن اﻟﺮﺋﻴﺴﻴﺎن ﰲ اﻟﺠﺪوﻟني اﳌﺮﺗﺒﻄني.
19
א!نא "#א
אول،א
אول א،وﻹﻧﺸﺎء اﻟﻌﻼﻗﺎت ﺑني
اﻟﺠﺪاول ﰲ SQL Serverﻧﺬﻫﺐ إﱃ اﻟﺘﺒﻮﻳﺐ Database Diagramsوﻧﻀﻐﻂ ﻋﻠﻴﻪ ﺑﺎﳌﺎوس ﻟﺘﻄﺎﻟﻌﻨﺎ
اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ:
اﻟﻨﺎﻓﺬة أﻋﻼه ﺗﺴﺄﻟﻨﺎ ﻫﻞ ﻧﺮﻳﺪ إﻧﺸﺎء ﻛﺎﺋﻨﺎت ﺟﺪﻳﺪة ﺗﺤﺘﺎج إﱃ ﻋﻼﻗﺎت ﻓﻴام ﺑﻴﻨﻬﺎ ،اﺿﻐﻂ ﻋﲆ اﻷﻣﺮ
،Yesﺛﻢ ﻋﺪ إﱃ اﻟﺘﺒﻮﻳﺐ Database Diagramsواﺿﻐﻂ ﻋﻠﻴﻪ ﺑﻴﻤني اﳌﺎوس واﺧﱰ New Database
:Diagram
20
ﺳﺘﻈﻬﺮ ﻟﻚ اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ اﻟﺘﻲ ﺗﻄﻠﺐ ﻣﻨﻚ ﺗﺤﺪﻳﺪ اﻟﺠﺪاول اﻟﺘﻲ ﺗﺮﻳﺪ اﻟﺮﺑﻂ ﺑﻴﻨﻬﺎ ،ﰲ ﻣﺜﺎﻟﻨﺎ ﻧﺤﻦ
ﺳﻨﺨﺘﺎر اﻟﺠﺪاول اﻟﺜﻼﺛﺔ ﻟﻠﺮﺑﻂ ﺑﻴﻨﻬﺎ:
ﺛﻢ ﻧﻀﻐﻂ ﻋﲆ اﻟﺰر أﺿﻒ ،ﺑﺎﻟﻔﺮﻧﺴﻴﺔ ،Ajouterوﺑﺎﻹﻧﺠﻠﻴﺰﻳﺔ .Add
21
ﻹﻧﺸﺎء ﻋﻼﻗﺔ ﺑني ﺟﺪوﻟني ،ﻧﻀﻐﻂ ﻋﲆ اﳌﻔﺘﺎح اﻷﺳﺎﳼ وﻧﺠﺬﺑﻪ إﱃ ﻣﺜﻴﻠﻪ ﰲ اﻟﺠﺪول اﻵﺧﺮ ،ﰲ ﺣﺎﻟﺘﻨﺎ
ﻫﺬه ﺳﻮف ﻧﺬﻫﺐ إﱃ اﻟﺠﺪول Coursesوﻧﻀﻐﻂ ﻋﲆ اﻟﺤﻘﻞ ،ID_Courseوﻧﺠﺬﺑﻪ إﱃ اﻟﺤﻘﻞ
ID_Courseاﳌﻮﺟﻮد ﰲ اﻟﺠﺪول .Marks
ﻫﺬه اﻟﻨﺎﻓﺬة ﺗﺒني ﻟﻚ اﻟﺤﻘﻞ اﳌﺸﱰك وﻃﺒﻴﻌﺘﻪ ﰲ اﻟﺠﺪوﻟني اﳌﱰاﺑﻄني ،ﻛام ﺗﺮى ﻓﻬﻮ ﰲ ﺟﺪول اﳌﻮاد
Coursesﻋﺒﺎرة ﻋﻦ ﺣﻘﻞ أﺳﺎﳼ ،Primary keyوﰲ ﺟﺪول اﻟﻨﻘﺎط Marksﻫﻮ ﺣﻘﻞ ﺧﺎرﺟﻲ
،Foreign Keyﺑﻌﺪ أن ﺗﺘﺄﻛﺪ ﻣﻦ أن اﻟﺤﻘﻞ اﻟﺸﱰك ﻫﻮ ﻧﻔﺴﻪ ﰲ اﻟﺠﺪوﻟني ،اﺿﻐﻂ ﻋﲆ .OK
22
ﻫﺬه اﻟﻨﺎﻓﺬة متﻜﻨﻨﺎ ﻣﻦ ﺗﺤﺪﻳﺪ ﺧﺼﺎﺋﺺ اﻟﻌﻼﻗﺔ ﺑني اﻟﺠﺪوﻟني ،وأﻫﻢ ﻫﺬه اﻟﺨﺼﺎﺋﺺ :اﻟﺨﺎﺻﻴﺔ Insert
،And Update Specificationﻟﻮ ﺿﻐﻄﺖ ﻋﻠﻴﻬﺎ ﺳﺘﻈﻬﺮ ﻟﻚ اﻟﺨﺼﺎﺋﺺ اﻟﻔﺮﻋﻴﺔ اﻟﺘﺎﻟﻴﺔ:
23
اﻟﺨﺎﺻﻴﺘﺎن Delete Ruleو ،Update Ruleمتﻜﻨﺎﻧﻨﺎ ﻣﻦ ﺗﺤﺪﻳﺪ وﺿﻌﻴﺔ اﻟﺒﻴﺎﻧﺎت إذا ﺣﺬﻓﺖ أو ﻋﺪﻟﺖ
ﰲ اﻟﺠﺪول اﻟﺮﺋﻴﴘ )اﻟﺬي ﻫﺎﺟﺮ ﺣﻘﻠﻪ اﻷﺳﺎﳼ إﱃ اﻟﺠﺪول اﻵﺧﺮ( ،اﻓﱰاﺿﻴﺎ ﺗﻜﻮن ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺘني ﻫﻲ
،No Actionإذا أردت أن ﻳﺘﻢ ﺣﺬف اﻟﺒﻴﺎﻧﺎت ﻣﻦ اﻟﺠﺪول اﻟﺜﺎين مبﺠﺮد ﻣﺎ ﻳﺘﻢ ﺣﺬﻓﻬﺎ ﻣﻦ اﻟﺠﺪول
اﻟﺮﺋﻴﴘ ،أوي ﻳﺘﻢ ﺗﺤﺪﻳﺜﻬﺎ ﻛﻠام ﺣﺪﺛﺖ ﰲ اﻟﺠﺪول اﻟﺮﺋﻴﴘ ﻓام ﻋﻠﻴﻚ إﻻ اﺳﺘﺒﺪال اﻟﻘﻴﻤﺔ اﻻﻓﱰاﺿﻴﺔ
ﺑﺎﻻﺧﺘﻴﺎر Cascadeﻛام ﺗﻌﺮض اﻟﺼﻮرة اﻟﺘﺎﻟﻴﺔ:
أي أﻧﻪ إذا ﻗﻤﺖ ﺑﺤﺬف ﻣﺎدة ﻣﻌﻴﻨﺔ ﰲ ﺟﺪول اﳌﻮاد ﺳﻴﺘﻢ ﺣﺬف ﺟﻤﻴﻊ اﻟﻨﻘﻂ اﳌﺴﺠﻠﺔ ﰲ ﻫﺬه اﳌﺎدة
وﻧﻔﺲ اﻷﻣﺮ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻌﻤﻠﻴﺔ اﻟﺘﺤﺪﻳﺚ.
24
ﺑﻌﺪ أن ﺗﻀﻐﻂ OKﺳﺘﻼﺣﻆ ﺑﺄﻧﻪ ﺗﻢ رﺑﻂ اﻟﺠﺪوﻟني ﻋﱪ ﺧﻂ ﻳﺤﺘﻮي أﺣﺪ ﻃﺮﻓﻴﻪ ﻣﻔﺘﺎﺣﺎ دﻻﻟﺔ ﻋﲆ
اﻟﺠﺪول اﻟﺮﺋﻴﴘ ،واﻟﻄﺮف اﻟﺜﺎين ﻳﺤﺘﻮي ﻋﲆ رﻣﺰ ﻣﺎﻻ ﻧﻬﺎﻳﺔ دﻻﻟﺔ ﻋﲆ اﻟﺠﺪول اﻟﺬي ﻳﺤﺘﻮي ﻋﲆ اﻟﺤﻘﻞ
اﻟﺨﺎرﺟﻲ اﻟﻘﺎدم ﻣﻦ اﻟﺠﺪول اﻟﺮﺋﻴﴘ ،ﻣﻌﻨﻰ ﻫﺬا اﻟﻜﻼم أن ﻛﻞ ﻣﺎدة ﻣﻤﻜﻦ أن ﺗﺮﺗﺒﻂ ﺑﻨﻘﻄﺔ أو أﻛرث :
،أو ﺑﺎﻟﻀﻐﻂ ﻋﲆ ،Ctrl+Sﻣﻊ ﺗﺤﺪﻳﺪ اﺳﻢ ﻟﻞ ﻧﻘﻮم ﺑﺤﻔﻆ اﻟﻌﻼﻗﺎت ﺑﺎﻟﻀﻐﻂ ﻋﲆ أﻳﻘﻮﻧﺔ اﻟﺤﻔﻆ
.Diagram
25
اﻵن مل ﻳﺘﺒﻖ ﻟﻨﺎ ﺳﻮى ﻣﻞء اﻟﺠﺪاول ﺑﻘﻴﻢ أوﻟﻴﺔ ،وﻟﻔﻌﻞ ذﻟﻚ ﻧﻀﻐﻂ ﻋﲆ ﺟﺪول اﻟﻄﻠﺒﺔ ﺑﻴﻤني اﻟﻔﺄرة،
وﻧﺨﺘﺎر اﻷﻣﺮ "ﻓﺘﺢ ،ﺑﺎﻟﻔﺮﻧﺴﻴﺔ ،Ouvrirوﺑﺎﻹﻧﺠﻠﻴﺰﻳﺔ "Open
ﻟﺘﻈﻬﺮ ﻟﻨﺎ ﺑﻌﺪ ذﻟﻚ اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ:
ﻧﻘﻮم ﺑﺘﻌﺒﺌﺔ اﻟﺠﺪول ﺑﺒﻴﺎﻧﺎت اﻋﺘﺒﺎﻃﻴﺔ ،ﻣﺜﻼ:
26
ﻧﻘﻮم ﺑﻨﻔﺲ اﻟﴚء ﺑﺎﻟﻨﺴﺒﺔ ﻟﺠﺪول اﳌﻮاد :Courses
27
اﻟﺠﺰء اﻟﺜﺎين:
اﺳﺘﻮدﻳﻮ
28
ﻋﻤﻮﻣﻴﺎت ﺣﻮل ADO.Net
ﻛام ﻋﻮدﻧﺎﻛﻢ ﻓﻠﻦ ﻧﺮﻛﺰ ﻛﺜريا ﻋﲆ ﻣﺎﻫﻮ ﻧﻈﺮي ،وإمنﺎ ﺳﻨﻜﺘﻔﻲ ﻓﻘﻂ مبﺎ ﺗﺴﺘﻠﺰﻣﻪ اﻟﴬورة ،ﻟﻬﺬا ﺳﻨﻌﺮض
ﻫﻨﺎ ﺑﻌﺾ اﻟﺘﻌﺎرﻳﻒ واﳌﻌﻠﻮﻣﺎت اﻟﻨﻈﺮﻳﺔ اﳌﺨﺘﴫة ﻋﻦ ADO.Net
ﰲ اﻟﻔﻴﺠﻮال ﺑﺴﻴﻚ ،6ﺣﺘﻰ ﻳﺘﺴﻨﻰ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﻧﺴﺘﻌﻤﻞ ADOو ،DAOوﻟﻜﻦ ﰲ
Activex Data Object
اﻟﻔﻴﺠﻮال ﺑﺰﻳﻚ.ﻧﻴﺖ ،ﻧﺴﺘﻌﻤﻞ ADO.Netوﻫﻲ اﺧﺘﺼﺎر ل bject .Net
وﻫﻲ ﻣﻦ ﺑني اﻟﺘﻘﻨﻴﺎت اﻟﺠﺪﻳﺪة واﻟﻔﻌﺎﻟﺔ ﻟﻠﺘﻮاﺻﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ،ﻷﻧﻬﺎ ﺗﺘﻴﺢ ﻟﻨﺎ اﻻﺷﺘﻐﺎل ﻣﻊ
ﻣﺨﺘﻠﻒ أﻧﻮاع ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﺑﻄﺮﻳﻘﺔ ﻣﺘﺸﺎﺑﻬﺔ ﻣﻊ ﺗﻐﻴري ﻃﻔﻴﻒ ﻋﲆ ﻣﺴﺘﻮى اﻟﺸﻔﺮة.
و ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ أي ﻣﺼﺪر ﺑﻴﺎﻧﺎت ،ﻳﻠﺰﻣﻨﺎ إﻗﺤﺎم ﻣﺠﺎل اﻷﺳامء اﻟﺨﺎص ﺑﻪ ،وﺳﻨﻌﺮض ﰲ اﻟﺠﺪول اﻟﺘﺎﱄ
ﺑﻌﺾ ﻣﺼﺎدر اﻟﺒﻴﺎﻧﺎت اﻟﺮﺋﻴﺴﻴﺔ وأﻣﺎﻣﻬﺎ ﻣﺠﺎل اﻷﺳامء اﻟﺨﺎص ﺑﻬﺎ:
29
ﻛام ﺗﻌﻠﻢ ـ ﻋﺰﻳﺰي اﻟﻘﺎرئ ـ ﻓﻜﻞ ﻣﺠﺎل أﺳامء ﻳﻀﻢ ﻓﺌﺎت ﻣﻨﻀﻮﻳﺔ ﺗﺤﺘﻪ ،ﻓﻜﺬﻟﻚ ﺑﺎﻟﻨﺴﺒﺔ ﳌﺠﺎﻻت
اﻷﺳامء اﻟﺨﺎﺻﺔ ب ،ADO.Netﻓﻬﻲ ﺗﻀﻢ ﻛﺎﺋﻨﺎت ﻟﻜﻞ ﻣﻨﻬﺎ دوره اﻟﺨﺎص ،وﻫﻲ ﻣﻮﺣﺪة ﺑﺎﻟﻨﺴﺒﺔ ﻟﻜﻞ
ﻣﺼﺎدر اﻟﺒﻴﺎﻧﺎت أي أن ﻧﻔﺲ اﻟﻜﺎﺋﻨﺎت ﺳﻨﺤﺘﺎﺟﻬﺎ ﻣﻬام ﻛﺎن ﻧﻮع ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻓﻘﻂ ﻣﻊ ﺗﻐﻴري ﺑﺴﻴﻂ
ﰲ اﺳﻢ اﻟﻜﺎﺋﻦ.
:Connectionدور ﻫﺬا اﻟﻜﺎﺋﻦ ﻫﻮ اﻟﺮﺑﻂ ﺑني اﻟﺘﻄﺒﻴﻖ وﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،إذ أﻧﻪ ﻳﻘﻮم ﺑﻔﺘﺢ
اﺗﺼﺎل ﺑﻴﻨﻬام.
:Commandﻳﻘﻮم ﺑﺘﻨﻔﻴﺬ أﻣﺮ )إﺿﺎﻓﺔ ،ﺗﻌﺪﻳﻞ ،ﺣﺬف (..ﻋﲆ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت
:Readerﻳﻘﻮم ﺑﺎﻟﻘﺮاءة ﻣﻦ ﻣﺼﺪر اﻟﺒﻴﺎﻧﺎت ﻓﻘﻂ ) (ReadOnlyوﻳُﺴﺘﻌﻤﻞ ﻫﺬا اﻟﻜﺎﺋﻦ ﰲ
اﻟﻮﺿﻊ اﳌﺘﺼﻞ )(On-line Mode
:DataSetوﻫﻲ مبﺜﺎﺑﺔ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺒﻴﺎﻧﺎت ،وميﻜﻦ أن ﺗﻀﻢ ﺟﺪاول وﻋﻼﻗﺎت ﻛام ﻫﻮ اﻟﺤﺎل
ﻣﻊ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،ﻟﻬﺎ دور أﺳﺎﳼ ﰲ ﺗﻜﺪﻳﺲ اﻟﺒﻴﺎﻧﺎت ﰲ اﻟﺬاﻛﺮة .وﻳُﺴﺘﻌﻤﻞ ﻫﺬا اﻟﻜﺎﺋﻦ ﰲ
اﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ )(Off-line Mode
:DataAdapterﻟﻪ دور أﺳﺎﳼ إذ ﻳﻘﻮم مبﻞء اﻟﺪاﺗﺎﺳﻴﺖ ﺑﺎﻟﺒﻴﺎﻧﺎت ،وﻛﺬﻟﻚ ﻳﻘﻮم ﺑﻌﻤﻠﻴﺎت
اﻹﺿﺎﻓﺔ واﻟﺘﺤﺪﻳﺚ واﻟﺤﺬف ﰲ ﻣﺼﺪر اﻟﺒﻴﺎﻧﺎت.
30
ﻣﺮرﻧﺎ ﻗﺒﻞ ﻗﻠﻴﻞ ﻋﲆ ﻣﺼﻄﻠﺤني ﺟﺪﻳﺪﻳﻦ وﻫام :اﻟﻮﺿﻊ اﳌﺘﺼﻞ واﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ ،وﻫام وﺿﻌﺎن
ﻣﺨﺘﻠﻔﺎن ﰲ ADO.Netﻟﻠﺘﻮاﺻﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ،ﻟﻜﻞ واﺣﺪ ﻣﻤﻴﺰاﺗﻪ وﻛﺎﺋﻨﺎﺗﻪ ،وﻳﺸﱰﻛﺎن أﻳﻀﺎ ﰲ
ﺑﻌﺾ اﻟﻜﺎﺋﻨﺎت اﻷﺳﺎﺳﻴﺔ.
.1اﻟﻮﺿﻊ اﳌﺘﺼﻞ :ﻋﻨﺪﻣﺎ ﻧﺮﺑﻂ ﺑﺮﻧﺎﻣﺠﻨﺎ ﺑﻘﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﰲ ﻫﺬا اﻟﻮﺿﻊ ﻓﺎﳌﺮاﺣﻞ اﻟﺘﻲ منﺮ ﻣﻨﻬﺎ
ﻛام ﻳﲇ:
• ﻧﻘﻮم ﺑﻔﺘﺢ اﻻﺗﺼﺎل Connectionﻣﻊ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت
• ﻧﺠﺮي ﻋﻤﻠﻴﺎت اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ ﻋﲆ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻣﺒﺎﴍة
• ﻧﻐﻠﻖ اﻻﺗﺼﺎل Connection
.2اﻟﻮﺿﻊ ﻏري اﳌﺘﺼﻞ )اﳌﻨﻔﺼﻞ( :وﰲ ﻫﺬا اﻟﻮﺿﻊ ﺗﺼﺒﺢ اﳌﺮاﺣﻞ ﻛام ﻳﲇ:
• ﻧﻘﻮم ﺑﻔﺘﺢ اﻻﺗﺼﺎل Connection
• ﻧﻀﻊ ﻧﺴﺨﺔ ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت أو ﺟﺰء ﻣﻨﻬﺎ ﰲ اﻟﺬاﻛﺮة )ﻫﻞ ﺗﺘﺬﻛﺮ ﻣﺎ ﻗﻠﻨﺎ ﺣﻮل
اﻟﺪاﺗﺎﺳﻴﺖ؟(
• ﻧﻐﻠﻖ اﻻﺗﺼﺎل Connection
• ﻧﺠﺮي ﻋﻤﻠﻴﺎت اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ ﻋﲆ اﻟﻨﺴﺨﺔ اﳌﺤﻔﻮﻇﺔ ﻋﲆ اﻟﺬاﻛﺮة
• ﻋﻨﺪﻣﺎ ﻧﻨﺘﻬﻲ ،ﻧﻔﺘﺢ اﻻﺗﺼﺎل وﻧﺮﺳﻞ اﳌﻌﻄﻴﺎت اﻟﺠﺪﻳﺪة إﱃ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت اﻷﺻﻠﻴﺔ
ﻟﺘﺤﺪﻳﺜﻬﺎ ،ﺛﻢ ﻧﻐﻠﻖ اﻻﺗﺼﺎل.
31
ﻟﻐﺔ :SQL
ﻟيك ﻳﺘﻢ اﻟﺘﻮاﺻﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ،ﻳﺴﺘﺨﺪم ADO.Netﻟﻐﺔ اﻟﺴﻴﻜﻮﻳﻞ ، SQLﺑﺎﻟﻨﺴﺒﺔ ﻟﻺﺧﻮة
اﻟﺬﻳﻦ ﻟﻴﺴﺖ ﻟﻬﻢ دراﻳﺔ ﺑﻬﺬه اﻟﻠﻐﺔ ،ﻓﻬﻲ ﻟﻐﺔ ﻣﺘﺨﺼﺼﺔ ﰲ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﺣﻴﺚ ﺗﺘﻴﺢ ﻟﻨﺎ اﻟﻘﻴﺎم ﺑﻜﻞ
أﻧﻮاع اﻟﻌﻤﻠﻴﺎت ﻣﻦ إﺿﺎﻓﺔ وﺗﻌﺪﻳﻞ وﺣﺬف وﻏريﻫﺎ ﻋﲆ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت.
ﻣﻦ أراد اﻟﺘﻌﻤﻖ ﰲ ﻟﻐﺔ ،SQLﻓﻘﺪ أﻓﺮدﻧﺎ ﻟﻬﺎ ﻛﺘﺎﺑﺎ ﻛﺎﻣﻼ ﻣﻜﻮﻧﺎ ﻣﻦ زﻫﺎء 130ﺻﻔﺤﺔ ﺗﺤﺖ ﻣﺴﻤﻰ
"اﻟﴩح اﻟﻮاﰲ ﻟﺘﻌﻠﻢ ﻟﻐﺔ SQLﻣﻦ ﻧﺒﻌﻬﺎ اﻟﺼﺎﰲ" ميﻜﻨﻚ ﺗﺤﻤﻴﻠﻪ ﻣﻦ أﻛﺎدميﻴﺔ اﳌﱪﻣﺠني اﻟﻌﺮب أو
اﻟﺒﺤﺚ ﻋﻨﻪ ﰲ ﻣﺤﺮﻛﺎت اﻟﺒﺤﺚ ﻷﻧﻪ ﻣﻨﺘﴩ ﺑﻜرثة وهلل اﻟﺤﻤﺪ.
$ل W
إذا أردﻧﺎ أن ﻧﻀﻴﻒ ﻣﻌﻠﻮﻣﺎت ﻃﺎﻟﺐ ﺟﺪﻳﺪ ﻓﺴﻴﻜﻮن اﻻﺳﺘﻌﻼم ﻛام ﻳﲇ:
Insert into Student (ID_Student,First_Name,Last_Name,Age,Adress) values (¨1¨,¨Khalid¨,¨ESSAADANI¨,22,
)¨¨Fkih Ben Salah
وﻳﻌﻨﻲ ﻫﺬا اﻻﺳﺘﻌﻼم :ﻗﻢ ﺑﺤﺬف ﻛﻞ اﻷﺳﻄﺮ اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﲆ اﻟﺤﻘﻞ Field1ذو اﻟﻘﻴﻤﺔ ، Value1
اﻟﻨﺠﻤﺔ * ﺗﻌﻨﻲ "ﺟﻤﻴﻊ".
32
ﻣﺜﺎل:
ﻣﺜﺎل:
ﻣﺜﺎل:
ﺳﻨﻘﻮم ﺑﺠﻠﺐ ﺑﻴﺎﻧﺎت ﻛﻞ اﻟﺘﻼﻣﻴﺬ اﻟﺬﻳﻦ ﻳﺴﻜﻨﻮن ﰲ ﻣﺪﻳﻨﺔ اﻟﺮﻳﺎض:
"Select * From Student Where Adress= "Riad
33
اﻟﺘﻄﺒﻴﻖ
اﻓﺘﺢ ﻣﴩوﻋﺎ ﺟﺪﻳﺪا ﰲ اﻟﻔﻴﺠﻮال اﺳﺘﻮدﻳﻮ ﻣﻦ ﻧﻮع ،Windows Forms Applicationﺳﻤﻪ ﻛام
ﺗﺮﻳﺪ:
ﺳﻮف ﻧﻘﻮم ﺑﻌﺮض ﻻﺋﺤﺔ ﺗﻀﻢ ﻛﻞ اﻟﻄﻠﺒﺔ اﳌﺴﺠﻠني ﻋﻨﺪﻧﺎ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،وﻟﻠﻘﻴﺎم ﺑﺬﻟﻚ إذﻫﺐ إﱃ
ﻋﻠﺒﺔ اﻷدوات وﻗﻢ ﺑﺎﻟﺒﺤﺚ ﻋﻦ DataGridViewﺛﻢ ﻗﻢ ﺑﺠﺬﺑﻬﺎ إﱃ اﻟﻔﻮرم.
:DataGridView
ﻫﻲ ﻋﺒﺎرة ﻋﻦ أداة ﺗﻘﻮم ﺑﻌﺮض اﻟﺒﻴﺎﻧﺎت ﻋﲆ ﺷﻜﻞ ﺟﺪول )أﺳﻄﺮ و أﻋﻤﺪة( ،ﻛام متﻜﻨﻨﺎ أﻳﻀﺎ ﻣﻦ
إﺟﺮاء ﻋﻤﻠﻴﺎت اﻹﺿﺎﻓﺔ واﻟﺤﺬف واﻟﺘﻌﺪﻳﻞ ﻋﻠﻴﻬﺎ دون اﻟﺤﺎﺟﺔ إﱃ اﺳﺘﻌامل أدوات أﺧﺮى
34
:DGV إﱃDataGridView ﻗﻢ ﺑﺘﻐﻴري اﺳﻢ
35
اﻵن ﻗﻢ ﺑﺎﻟﻀﻐﻂ ﻣﺮﺗني ﻋﲆ اﻟﻔﻮرم ﻟﻨﻨﺘﻘﻞ إﱃ ﻧﺎﻓﺬة اﻟﻜﻮد:
أول ﳾء ﺳﻨﻘﻮم ﺑﻪ ،ﻫﻮ ﺟﻠﺐ ﻣﺠﺎل اﻷﺳامء Namespaceاﻟﺬي ﺳﻴﺘﻴﺢ ﻟﻨﺎ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﺎﻋﺪة
اﻟﺒﻴﺎﻧﺎت ﻣﻦ ﻧﻮع ،SQL Serverوﻫﻮ ، System.Data.SqlClientوﻳﺨﺘﻠﻒ ﻫﺬا اﳌﺠﺎل ﺣﺴﺐ ﻧﻮع
ﺑﺮﻧﺎﻣﺞ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ،ﻓﻤﺜﻼ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻞ Microsoft Accessﻓﻤﺠﺎل اﻷﺳامء
System.Data.
System.Data.OleDb ﻫﻮ:
إذن ﺳﻮف ﻧﻘﻮم ﺑﺎﻟﺬﻫﺎب إﱃ أول ﺳﻄﺮ ﰲ ﻧﺎﻓﺬة اﻟﻜﻮد ،وﻧﺠﻠﺐ ﻣﺠﺎل اﻷﺳامء اﻟﺨﺎص ﺑﻘﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت
ﻣﻦ ﻧﻮع .SQL Server
Imports System.Data.SqlClient
Data.SqlClient
Public Class Form1
End Sub
End Class
36
وﻟﻔﻌﻞ ذﻟﻚ ﻧﻌﻠﻦ ﻋﲆ ﻛﺎﺋﻦ ﻣﻦ ﻧﻮع،ﺑﻌﺪ ذﻟﻚ ﻧﻘﻮم ﺑﺈﻧﺸﺎء اﻻﺗﺼﺎل ﻣﻊ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت
.SqlConnection
Imports System.Data.SqlClient
Data.SqlClient
Public Class Form1
End Sub
End Class
SQL وميﻜﻨﻚ ﻧﺴﺨﻪ ﻣﻦ، وﻫﻮ اﺳﻢ اﻟﺴريﭬﺮ اﻟﺬي ﺗﻮﺟﺪ ﻋﻠﻴﻪ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت:Server
وﻧﺴﺦ اﻻﺳﻢ ﻛام،Properties ﻋﱪ اﻟﻀﻐﻂ ﺑﻴﻤني اﳌﺎوس ﻋﲆ اﻟﺴريﭬﺮ ﺛﻢ اﺧﺘﻴﺎرServer
:ﺗﻌﺮض اﻟﺼﻮر اﻟﺘﺎﻟﻴﺔ
37
1
2
38
ﻧﺴﺘﻄﻴﻊ اﺳﺘﺒﺪال اﺳﻢ اﻟﺤﺎﺳﻮب ﺑﺎﻟﻨﻘﻄﺔ " ".أو اﻟﻜﻠﻤﺔ ") "(localدﻻﻟﺔ ﻋﲆ أﻧﻨﺎ ﻧﺸﺘﻐﻞ ﻋﲆ ﺳريﭬﺮ
ﻣﺤﲇ وﻟﻴﺲ ﻋﲆ ﺷﺒﻜﺔ.
إن ﻛﻨﺖ ﺗﺴﺘﺨﺪم SQL Authenticationﰲ SQL Serverﻟﻠﻮﻟﻮج إﱃ اﻟﺴريﭬﺮ ،ﻓﻘﻢ ﺑﺈﻋﻄﺎء
اﻟﻘﻴﻤﺔ falseﻟﻬﺬه اﻟﺨﺎﺻﻴﺔ ،وأﺿﻒ اﻟﺨﺎﺻﻴﺘني اﻟﺘﺎﻟﻴﺘني:
ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء ﺳﻠﺴﻠﺔ اﻟﺮﺑﻂ ﺑني اﻟﱪﻧﺎﻣﺞ وﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،ﺳﻨﺠﻠﺐ اﻵن ﺑﻴﺎﻧﺎت ﺟﺪول اﻟﻄﻼب وﻧﻈﻬﺮﻫﺎ
ﰲ اﻟﺪاﺗﺎﻏﺮﻳﺪﻓﻴﻮ ،وﻟﻠﻘﻴﺎم ﺑﺬﻟﻚ ﺳﻨﺤﺘﺎج إﱃ ﻛﺎﺋﻨني اﺛﻨني:
39
رأﻳﻨﺎ، ﺑﺠﻠﺒﻪSqlDataAdapter وﻫﻲ مبﺜﺎﺑﺔ ﺟﺪول ﻟﺘﺨﺰﻳﻦ ﻣﺎ ﺳﻴﻘﻮم:DataTable
DataTable أﻣﺎ، ﻫﻮ مبﺜﺎﺑﺔ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺠﺪاولDataSet ﻓﻴام ﺳﺒﻖ أن ﻛﺎﺋﻦ اﻟﺪاﺗﺎﺳﻴﺖ
و،DataTable ﻫﻲ ﻣﺠﻤﻮﻋﺔ ﻣﻦDataSet مبﻌﻨﻰ آﺧﺮ ميﻜﻨﻨﺎ اﻟﻘﻮل أن،ﻓﻬﻮ ﺟﺪول واﺣﺪ
وميﻜﻨﻨﺎDataColumn و ﺧﺎﻧﺎتDataRow ﻫﺬه اﻷﺧرية ﻋﺒﺎرة ﻋﻦ ﺟﺪول ﻓﻴﻪ أﺳﻄﺮ
:اﺳﺘﻌامل اﻟﻜﺎﺋﻦ اﻟﺬي ﻧﺮﻳﺪ
.DataTable ﰲ ﻣﺜﺎﻟﻨﺎ ﻫﺬا ﺳﻨﺸﺘﻐﻞ ﻋﲆ
:أي أن ﺷﻔﺮة اﻹﻋﻼن ﺳﺘﻜﻮن ﻛام ﻳﲇ
Imports System.Data.SqlClient
Data.SqlClient
Public Class Form1
Dim Con As New SqlConnection("Server=.\SQLEXPRESS;
Sql SQLEXPRESS;
Database= StudentBase; Integrated Security=true")
Security=true
Dim Da As SqlDataAdapter
DataAdapter
Dim Dt As New DataTable
40
Private Sub Form1_Load(ByVal
Form1_Load( sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
:ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﻟﺸﻔﺮة اﻟﺘﺎﻟﻴﺔ
Imports System.Data.SqlClient
Data.SqlClient
Public Class Form1
Dim Con As New SqlConnection("Server=.\SQLEXPRESS;
Sql SQLEXPRESS;
Database= StudentBase; Integrated Security=true")
Security=true
Dim Da As SqlDataAdapter
DataAdapter
Dim Dt As New DataTable
41
Private Sub Form1_Load(ByVal
Form1_Load( sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
Da = New SqlDataAdapter(
DataAdapter("Select * From Student",
Student" Con)
Da.Fill(Dt)
DGV.DataSource = Dt
End Sub
End Class
SqlDataAdapter ﰲ اﻟﺴﻄﺮ اﻷول ﻗﻤﻨﺎ ﺑﺈرﺳﺎل اﺳﺘﻌﻼم ﺟﻠﺐ اﻟﺒﻴﺎﻧﺎت ﻣﻦ اﻟﻘﺎﻋﺪة ﺑﺎﻻﻋﺘامد ﻋﲆ
ﺛﻢ ﺑﻌﺪ ذﻟﻚ أﻓﺮﻏﻨﺎ ﻣﺎ ﻗﺎم ﺑﺠﻠﺒﻪ ﰲ، اﻟﺘﻲ ﻳﻨﺒﻐﻲ أن ميﺮ ﻋﱪﻫﺎCon وﺣﺪدﻧﺎ ﻟﻪ ﺳﻠﺴﺔ اﻻﺗﺼﺎل
.DataTable ﻣﻦ ﻫﺬهDataGridView وﰲ اﻷﺧري ﻗﻤﻨﺎ مبﻞء،Fill ﻋﻦ ﻃﺮﻳﻖ اﻟﺪاﻟﺔDataTable
ﻟﻴﻨﺘﻬﻲ ﺑﻬﺎDataTable ﺑﺈﺣﻀﺎر اﻟﺒﻴﺎﻧﺎت وﻣﻦ ﺗﻢ وﺿﻌﻬﺎ ﰲSqlDataAdapter
DataAdapter ﻛام ﺗﺮى ﻓﻘﺪ ﻗﺎم
.DataGridView اﻷﻣﺮ ﰲ آﺧﺮ اﳌﻄﺎف ﻋﲆ
42
إذا أردﻧﺎ أن ﻧﻈﻬﺮ ﻛﻞ اﻟﺤﻘﻮل ﻣﻦ ﻏري ﺣﺎﺟﺔ إﱃ ﴍﻳﻂ اﻟﺘﻤﺮﻳﺮ Scrollbarﻓﻴﺠﺐ أن ﻧﻀﻴﻒ اﻟﺴﻄﺮ
اﻟﺘﺎﱄ ﻣﻦ اﻟﻜﻮد ﰲ :Form1_Load
DGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
ميﻜﻨﻨﺎ اﻟﻘﻴﺎم ﺑﻨﻔﺲ اﻷﻣﺮ ﻋﻦ ﻃﺮﻳﻖ ﻧﺎﻓﺬة اﻟﺨﺼﺎﺋﺺ اﻟﺨﺎﺻﺔ ب DataGridViewﺛﻢ ﻧﺬﻫﺐ إﱃ
اﻟﺨﺎﺻﻴﺔ AutoSizeColumnsModeو ﻧﻀﺒﻄﻬﺎ ﻋﲆ اﻟﻘﻴﻤﺔ .Fill
أﺗﻮﻗﻊ أن ﺗﺼﻞ إﱃ ﻧﻔﺲ اﻟﻨﺘﻴﺠﺔ إذا اﺗﺒﻌﺖ ﻣﻌﻲ ﻧﻔﺲ اﳌﺮاﺣﻞ ،ﰲ ﺣﺎﻟﺔ ﺣﺪوث اﻟﻌﻜﺲ أﺳﺘﺠﺪﻳﻚ أن
ﺗﻌﻴﺪ ﻗﺮاءة اﻟﺘﻄﺒﻴﻖ ﺣﺮﻓﺎ ﺣﺮﻓﺎ.
اﻵن ﺳﻨﻐري إن ﺷﺎء ﷲ ﻣﻈﻬﺮ اﻟﻔﻮرم ﻟﻴﺼﺒﺢ ﻛام ﻳﲇ ،ﺣﺘﻰ ﻧﺘﻤﻜﻦ ﻣﻦ ﺗﻌﻠﻢ أﺷﻴﺎء أﺧﺮى:
43
اﻷدوات اﳌﺴﺘﻌﻤﻠﺔ ﰲ اﻟﻔﻮرم:
أداة ﻣﺠﻤﻊ اﻷدوات :GroupBoxوﻫﻲ ﺗﻠﻚ اﻹﻃﺎرات اﻟﺒﻴﻀﺎء اﻟﻈﺎﻫﺮة ﰲ اﻟﻔﻮرم واﻟﺘﻲ ﺗﺤﻴﻂ
ﺑﻜﻞ ﻣﺠﻤﻮﻋﺔ ﻋﲆ ﺣﺪة.
أداة ﻣﺮﺑﻊ اﻟﻨﺺ : TextBoxوﻫﻲ ﻣﺮﺑﻌﺎت اﻟﻨﺺ اﳌﻮﺿﻮﻋﺔ ﰲ ﺟﺰء اﳌﻌﻠﻮﻣﺎت
Informations
أداة اﻟﺪاﺗﺎﻏﺮﻳﺪﻓﻴﻮ :DataGridViewوﻫﻲ ذﻟﻚ اﳌﺴﺘﻄﻴﻞ اﻟﺮﻣﺎدي
أداة اﻟﺰر :Buttonوﻫﻲ ﻛﻞ اﻷزرار اﳌﻮﺟﻮدة ﰲ أﺳﻔﻞ اﻟﻔﻮرم
44
:Informationsﻣﻦ ﺧﻼﻟﻪ ﺳﻨﻘﻮم ﺑﺈﻇﻬﺎر ﻣﻌﻠﻮﻣﺎت اﻟﻄﺎﻟﺐ ﻋﻨﺪ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻴﺔ
اﻟﺒﺤﺚ ،وﻛﺬﻟﻚ ﺳﻨﺴﺘﻌﻤﻠﻪ ﻣﻦ أﺟﻞ إﺿﺎﻓﺔ ﻃﺎﻟﺐ ﺟﺪﻳﺪ.
:Students Listوﺗﻘﻮم ﺑﻌﺮض ﻛﻞ اﻟﻄﻠﺒﺔ اﳌﻮﺟﻮدﻳﻦ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،وﻛﺬﻟﻚ
اﻟﻄﻠﺒﺔ اﻟﺬﻳﻦ ﺗﺘﻢ إﺿﺎﻓﺘﻬﻢ.
:Updateوﻛام ﺗﻼﺣﻆ ﻓﻬﺬا اﻟﺠﺰء ﻳﻀﻢ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻷزرار وﻫﻲ ﻛﺎﻟﺘﺎﱄ:
:Newوميﻜﻨﻨﺎ ﻣﻦ ﺗﻔﺮﻳﻎ ﻣﺤﺘﻮى اﻟﺠﺰء .Informations
:Addوميﻜﻨﻨﺎ ﻣﻦ إﺿﺎﻓﺔ ﻃﺎﻟﺐ ﺟﺪﻳﺪ.
:Deleteوميﻜﻨﻨﺎ ﻣﻦ ﺣﺬف ﻃﺎﻟﺐ ﻣﻦ ﺟﺪول اﻟﻄﻼب.
:Editوميﻜﻨﻨﺎ ﻣﻦ ﺗﻌﺪﻳﻞ ﺑﻴﺎﻧﺎت اﻟﻄﻼب.
:Findوميﻜﻨﻨﺎ ﻣﻦ اﻟﺒﺤﺚ ﻋﻦ ﻣﻌﻠﻮﻣﺎت ﻃﺎﻟﺐ ﻣﻌني ﻋﻦ ﻃﺮﻳﻖ رﻗﻤﻪ.
:Exitوميﻜﻨﻨﺎ ﻣﻦ اﻟﺨﺮوج ﻣﻦ اﻟﱪﻧﺎﻣﺞ.
:Navigationوميﻜﻨﻨﺎ ﻣﻦ اﻟﺘﻨﻘﻞ ﺑني اﻟﻄﻼب ﺑﺎﻻﻋﺘامد ﻋﲆ أزرار اﻟﺘﻨﻘﻞ.
ﺳﻨﻮرد ﺷﻔﺮات ﻛﻞ ﻫﺬه اﻷزرار اﻵن وﺳرنﻓﻖ ذﻟﻚ ﺑﴩح دﻗﻴﻖ ﺣﺘﻰ ﺗﺮﺳﺦ اﻟﺸﻔﺮات ﰲ أذﻫﺎﻧﻨﺎ.
ﻟﻺﺷﺎرة ﻓﻘﻂ ،ﺳﻨﺴﺘﻌﻤﻞ إن ﺷﺎء ﷲ اﻟﻮﺿﻌني ﻣﻌﺎ )اﳌﺘﺼﻞ وﻏري اﳌﺘﺼﻞ( ﺣﺘﻰ ﻧﺘﻤﻜﻦ ﻣﻦ إﺗﻘﺎن
اﻟﻄﺮﻳﻘﺘني ﻣﻌﺎ.
45
.1اﻟﺰر اﻷول :New
ﻣﻦ ﺧﻼل دوره ،ﻳﺘﻀﺢ أن ﻻ ﻋﻼﻗﺔ ﻟﻪ ب ADO.Netﻓﻬﻮ زر ﺑﺴﻴﻂ ﻳﻘﻮم ﻓﻘﻂ مبﺴﺢ ﻣﺤﺘﻮى اﻟﺨﺎﻧﺎت
اﻟﻨﺼﻴﺔ ،وﺑﺎﻟﺘﺎﱄ ﻓﺸﻔﺮﺗﻪ ﻫﻲ ﻛﺎﻟﺘﺎﱄ:
ﻛام ﺗﺮون ﻓﺈن ﻛﻞ أدوات اﻟﺘﻴﻜﺴﺖ ﺑﻮﻛﺲ ﻣﻮﺟﻮدة داﺧﻞ أداة ، GroupBox1وﻟﺬﻟﻚ ﻗﻤﻨﺎ ﺑﺘﻔﺮﻳﻐﻬﺎ ﰲ
دﻓﻌﺔ واﺣﺪة ﻋﻮض ﺗﻔﺮﻳﻎ ﻛﻞ ﺗﻴﻜﺴﺖ ﺑﻮﻛﺲ ﰲ ﺳﻄﺮ !
أﻣﺎ ﻓﻴام ﻳﺨﺺ اﻟﺴﻄﺮ )( TxtID.Focusﻓﻴﻘﻮم ﺑﻮﺿﻊ ﻣﺆﴍ اﻟﻔﺄرة ﰲ أول ﺗﻴﻜﺴﺖ ﺑﻮﻛﺲ .
46
ﻣﻦ أﺟﻞ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻴﺎت اﻹﺿﺎﻓﺔCommand ﻓﺎﻟﻮﺿﻊ اﳌﺘﺼﻞ ﻳﺴﺘﻌﻤﻞ اﻟﻜﺎﺋﻦ،ﻛام رأﻳﻨﺎ ﻓﻴام ﺳﺒﻖ
.واﻟﺤﺬف واﻟﺘﻌﺪﻳﻞ
: وﻧﻀﻐﻂ ﻋﻠﻴﻪ ﻣﺮﺗني وﻧﻜﺘﺐ اﻟﺸﻔﺮة اﻟﺘﺎﻟﻴﺔAdd ﺳﻨﺘﻮﺟﻪ إﱃ زر اﻹﺿﺎﻓﺔ،اﻵن ﺑﻌﺪ أن أﻋﻠﻨﺎ ﻋﻨﻪ
Try
Cmd = New SqlCommand("Insert
"Insert Into Student Values
('" & Me.TxtID.Text
.TxtID.Text & "','" _
& Me.TxtFname.Text
.TxtFname.Text & "','" &
Me.TxtLname.Text
.TxtLname.Text & "', '" _
& Me.TextAge.Text & "','" &
Me.TextAdress.Text
.TextAdress.Text & "')", Con)
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Student
"Student added successfully !",
!"
MsgBoxStyle.Information)
Dt.Clear()
Form1_Load(sender, e)
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
End Try
47
ﻗﺪ ﻳﺒﺪو اﻟﺴﻄﺮ اﻟﺨﺎص ب Commandﻏﺮﻳﺒﺎ ﻧﻮﻋﺎ ﻣﺎ ،ﻧﻈﺮا ﻟﻜرثة اﻟﺮﻣﻮز ﻓﻴﻪ وﻟﻜﻦ ﻻ ﻋﻠﻴﻚ ،ﺳﻨﴩﺣﻪ
א!ن'ذنא( W
SqlCommandﻳﺄﺧﺬ ﺑﺎراﻣﱰﻳﻦ ،أوﻟﻬام ﻧﺺ اﻻﺳﺘﻌﻼم اﳌﺮاد ﺗﻨﻔﻴﺬه ،واﻟﺜﺎين اﺳﻢ ﻛﺎﺋﻦ اﻻﺗﺼﺎل.
Sql اﻟﻜﺎﺋﻦ
ﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ،ﻧﺺ اﻻﺳﺘﻌﻼم ﻋﺒﺎرة ﻋﻦ أﻣﺮ اﻹﺿﺎﻓﺔ :
"'( Insert Into Student Values & Me.TxtID.Text
_ "'.TxtID.Text & "',
& Me.TxtFname.Text
& "'.TxtFname.Text & "',
Me.TxtLname.Text
_ "' .TxtLname.Text & "',
& Me.TextAge.Text
& "'.TextAge.Text & "',
Me.TextAdress.Text
)'" & .TextAdress.Text
ﻧﻀﻊ اﻟﻘﻴﻢ اﻟﺘﻲ ﻧﺮﻳﺪ إﺿﺎﻓﺘﻬﺎ ﺑني ﻣﺰدوﺟﺘني )""(وﻧﻔﺼﻞ ﺑﻴﻨﻬﺎ ﺑﻔﻮاﺻﻞ) ،(,أﻣﺎ اﻟﻜﻮت )'( ﻓﻬﻮ ﻳﺴﺘﻌﻤﻞ
ﻓﻘﻂ ﻋﻨﺪﻣﺎ ﻳﻜﻮن اﻟﺤﻘﻞ ﻧﺼﻴﺎ ،وﻟﻜﻦ ﺗﻔﺎدﻳﺎ ﻟﻮﻗﻮع أي أﺧﻄﺎء ﻧﻘﻮم ﺑﻜﺘﺎﺑﺘﻪ ﰲ ﻛﻞ اﻟﺤﻘﻮل مبﺎ ﰲ ذﻟﻚ
اﻟﺤﻘﻮل اﻟﺮﻗﻤﻴﺔ ،أﻣﺎ رﻣﺰ اﻷﻧﺪرﺳﻜﻮر ) _ ( ﻓﻨﺴﺘﻌﻤﻠﻪ ﻟﻠﺮﺑﻂ ﺑني اﻷﺳﻄﺮ ،وميﻜﻨﻨﺎ اﻻﺳﺘﻐﻨﺎء ﻋﻨﻪ إذا
ﻛﺘﺒﻨﺎ ﻛﻞ اﻻﺳﺘﻌﻼم ﰲ ﺳﻄﺮ واﺣﺪ.
ﺑﺈﻣﻜﺎﻧﻨﺎ وﺿﻊ اﻻﺳﺘﻌﻼم ﰲ ﻣﺘﻐري ﻧﴢ ﻣﻦ ﻧﻮع Stringﺛﻢ ﻧﻀﻊ اﺳﻢ ﻫﺬا اﳌﺘﻐري ﰲ اﻟﺒﺎراﻣﱰ اﻷول ﻣﻦ
اﻟﻜﺎﺋﻦ:
48
& "'( Dim SQL As String = "Insert Into Student Values
_ "'Me.TxtID.Text & "',
& Me.TxtFname.Text
& "'.TxtFname.Text & "',
Me.TxtLname.Text
_ "' .TxtLname.Text & "',
& Me.TextAge.Text
& "'.TextAge.Text & "',
Me.TextAdress.Text
")'" & .TextAdress.Text
إذا متﻜﻨﺖ ﻣﻦ اﺳﺘﻴﻌﺎب ﻫﺬا اﻟﺴﻄﺮ ﻓﺎﻟﺒﺎﻗﻲ أﺳﻬﻞ ﺑﻜﺜري ،وإن وﺟﺪت أدىن ﺻﻌﻮﺑﺔ ﻓﺮاﺟﻌﻪ ﺟﻴﺪا
وﺣﺎول أن ﺗﻔﻬﻤﻪ أﻛرث ،وإن اﻗﺘﴣ اﻷﻣﺮ ﺟﺮﺑﻪ ﻋﻤﻠﻴﺎ.
ﺑﻌﺪ ﻛﺘﺎﺑﺔ أﻣﺮ اﻻﺳﺘﻌﻼم ،وﺗﺤﺪﻳﺪ ﻛﺎﺋﻦ اﻻﺗﺼﺎل وﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﻫﻮ ،Conﻧﻘﻮم ﺑﻔﺘﺢ اﻻﺗﺼﺎل ﻋﻦ
ﻃﺮﻳﻖ
)(Con.Open
)(Cmd.ExecuteNonQuery
ﺛﻢ ﻧﻘﻮم ﺑﺘﻔﺮﻳﻎ اﻟﻜﺎﺋﻦ Dtﺣﺘﻰ ﻻ ﺗﺘﻜﺮر اﻟﺒﻴﺎﻧﺎت اﻟﻘﺪميﺔ ،ﺑﻌﺪﻫﺎ ﻧﻘﻮم ﺑﺎﻟﻨﺪاء ﻋﲆ ﺣﺪث ﺗﺤﻤﻴﻞ
اﻟﻔﻮرم Form1_Loadاﻟﺬي ﺳﻴﻘﻮم ﺑﺈﻋﺎدة ﻣﻞء Dtﻣﻦ ﺟﺪﻳﺪ ﺛﻢ ﻳﻈﻬﺮﻫﺎ ﻋﲆ اﻟﺪاﺗﻐﺮﻳﺪﭬﻴﻮ.
49
Dt.Clear()
Form1_Load(sender, e)
Try..Catch ﻋﻨﺪ ﺣﺪوث أي ﺧﻄﺄ ﺳﺘﻈﻬﺮ اﻟﺮﺳﺎﻟﺔ اﳌﻮﺟﻮدة ﰲ اﻟﺠﺰء اﻟﺜﺎين ﻣﻦ
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!", MsgBoxStyle.Critical)
End Try
.Cmdb وﻟﻨﺴﻤﻪSqlCommandBuilder
CommandBuilderأوﻻ ﻧﻌﻠﻦ ﻋﻦ اﻟﻜﺎﺋﻦ
وﻣﻦ ﺗﻢ أي ﺗﻌﺪﻳﻞ ﻳﻘﻮم ﺑﻪ ﻫﺬا اﻷﺧري ﻳﺘﻢ، ﻛَ َ َﱪا ِﻣ ْﱰSqlDataAdapter ﻳﺄﺧﺬ ﻫﺬا اﻟﻜﺎﺋﻦ اﺳﻢ اﻟﻜﺎﺋﻦ
.ﺗﻔﻌﻴﻠﻪ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت
50
Dim Cmd As New SqlCommand
Sql
Dim Dr As SqlDataReader
DataReader
Dim Cmdb As New SqlCommandBuilder
Sql
Try
Dim R As DataRow = Dt.NewRow
R(0) = TxtID.Text
R(1) = TxtFname.Text
R(2) = TxtLname.Text
R(3) = TextAge.Text
R(4) = TextAdress.Text
Dt.Rows.Add(R)
Cmdb = New SqlCommandBuilder(Da)
Da.Update(Dt)
MsgBox("Student
"Student added successfully !",
!",
MsgBoxStyle.Information)
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
oxStyle.Critical)
End Try
وﻛﻴﻔﻴﺔ ﻣﻠﺌﻪ ﻋﻦ ﻃﺮﻳﻖ ﻣﺮﺑﻌﺎت اﻟﻨﺺ )اﻟﻘﻴﻢ اﳌﺮادDt ﺗﺄﻣﻞ ﺟﻴﺪا ﻃﺮﻳﻘﺔ إﻧﺸﺎء ﺳﻄﺮ ﻓﺎرغ ﰲ
و ﰲ اﻷﺧري ﻛﻴﻒ ﻓﻌﻠﻨﺎ اﻟﺘﺤﺪﻳﺚ ﺑﻮاﺳﻄﺔ،Dt وﻛﻴﻒ ﻗﻤﻨﺎ ﺑﺈﺿﺎﻓﺔ اﻟﺴﻄﺮ اﳌﻨﺸﺄ إﱃ،(إﺿﺎﻓﺘﻬﺎ
: وﻫﺬان اﻟﺴﻄﺮان ﻫام ﺑﻴﺖ اﻟﻘﺼﻴﺪ ﰲ ﺷﻔﺮة اﻹﺿﺎﻓﺔ ﰲ اﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ،اﻟﺴﻄﺮﻳﻦ
Try
Dim R As DataRow = Dt.NewRow
R(0) = TxtID.Text
R(1) = TxtFname.Text
R(2) = TxtLname.Text
R(3) = TextAge.Text
51
R(4) = TextAdress.Text
Dt.Rows.Add(R)
Cmdb = New SqlCommandBuilder(Da)
Da.Update(Dt)
MsgBox("Student
"Student added successfully !",
!",
MsgBoxStyle.Information)
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
End Try
إذا اﺳﺘﻌﴡ ﻋﻠﻴﻚ أﻣﺮ ﻣﻌني ﻓﺎﺳﺄل ﷲ أن ﻳﻌﻴﻨﻚ وﺳﺎﻣﺤﻨﻲ ﻋﲆ،أمتﻨﻰ أن ﺗﻜﻮن اﻟﴩوح ﻣﻔﻬﻮﻣﺔ
ﻷن ﻫﺬه اﻟﺸﻔﺮات ﺳﻬﻠﺔ ﺟﺪا وﺑﺎﳌامرﺳﺔ ﺳﺘﻐﺪو،ﺗﻘﺼريي واﺑﺬل ﻣﺠﻬﻮدا وإن ﺷﺎء ﷲ ﺳﺘﻔﻬﻤﻪ ِﺑ ُﻴ ْﴪ
وﻟﻜﻦ اﺣﺬر، ﺣﺘﻰ ﻳﺘﺄىت ﻟﻚ ﻣﻘﺎرﻧﺘﻬام واﺳﺘﻴﻌﺎﺑﻬام،ﺳﺎﺋﻐﺔ ﻛﴩب اﳌﺎء ﻓﻴام ﻳﲇ ﺳﻨﴪد اﻟﺸﻔﺮﺗني ﻣﻌﺎ
: ﻓﻠﻠﺸﻔﺮﺗني ﻧﻔﺲ اﻟﺪور،أن ﺗﻨﻔﺬﻫام ﻣﺮة واﺣﺪة
'On-line
line Mode
Try
Cmd = New SqlCommand("Insert
"Insert Into Student Values
('" & Me.TxtID.Text
.TxtID.Text & "','" _
& Me.TxtFname.Text
.TxtFname.Text & "','" &
Me.TxtLname.Text
.TxtLname.Text & "', '" _
& Me.TextAge.Text
.TextAge.Text & "','" &
Me.TextAdress.Text
.TextAdress.Text & "')",
Con)
Con.Open()
Cmd.ExecuteNonQuery()
52
Con.Close()
MsgBox("Student
"Student added successfully !",
!",
MsgBoxStyle.Information)
Dt.Clear()
Form1_Load(sender, e)
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
MsgBoxStyle.Critical)
End Try
'Off-line
line Mode
Try
Dim R As DataRow = Dt.NewRow
R(0) = TxtID.Text
R(1) = TxtFname.Text
R(2) = TxtLname.Text
R(3) = TextAge.Text
R(4) = TextAdress.Text
Dt.Rows.Add(R)
Cmdb = New SqlCommandBuilder(Da)
Da.Update(Dt)
MsgBox("Student
"Student added successfully !",
!",
MsgBoxStyle.Information)
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
End Try
End Sub
53
Delete زر اﻟﺤﺬف.3
، ﻳﻄﻠﺐ ﻣﻦ اﳌﺴﺘﺨﺪم ﻛﺘﺎﺑﺔ رﻗﻢ اﻟﻄﺎﻟﺐ اﳌﺮاد ﺣﺬﻓﻪ،ﻋﻨﺪ اﻟﻀﻐﻂ ﻋﲆ ﻫﺬا اﻟﺰر ﻳﻈﻬﺮ ﻣﺪﺧﻞ ﻟﻠﻨﺺ
. ﻳﺘﻢ ﺣﺬف اﻟﻄﺎﻟﺐ ﻣﺒﺎﴍةOK ﺑﻌﺪ ﻛﺘﺎﺑﺔ رﻗﻢ اﻟﻄﺎﻟﺐ واﻟﻀﻐﻂ ﻋﲆ
وﰲ ﺣﺎﻟﺔ اﻟﻌﻜﺲ ﺗﻈﻬﺮ رﺳﺎﻟﺔ،ﰲ ﺣﺎﻟﺔ ﺣﺬف اﻟﻄﺎﻟﺐ ﺗﻈﻬﺮ رﺳﺎﻟﺔ ﺗﻌﻠﻢ اﳌﺴﺘﺨﺪم ﺑﻨﺠﺎح اﻟﻌﻤﻠﻴﺔ
.ﺗﻨﺒﺊ اﳌﺴﺘﺨﺪم ﺑﺬﻟﻚ
54
: ﺑﺎﳌﻨﺎﺳﺒﺔ ﺳﺘﻈﻬﺮ ﻟﻠﻤﺴﺘﺨﺪم اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ،ﺛﻢ ﺣﻔﻈﻨﺎ ﻓﻴﻪ اﻟﻘﻴﻤﺔ اﳌﺪﺧﻠﺔ ﺑﻮاﺳﻄﺔ اﳌﺴﺘﺨﺪم
Input = InputBox("Enter
"Enter The ID of Student To Delete !",
!"
"Delete")
.ﺛﻢ ﻧﻘﻮم ﺑﺘﻨﻔﻴﺬ اﺳﺘﻌﻼم ﺣﺬف اﻟﻄﺎﻟﺐ اﻟﺬي ﻳﺘﻮاﻓﻖ رﻗﻤﻪ ﻣﻊ اﻟﻘﻴﻤﺔ اﳌﺪﺧﻠﺔ ﻣﻦ ﻃﺮف اﳌﺴﺘﺨﺪم
ﻟﻨﻤﻸﻫﺎ ﺑﺎﻟﺒﻴﺎﻧﺎت اﻟﺠﺪﻳﺪة ﻋﻦ ﻃﺮﻳﻖDt ﺛﻢ ﻧﻔﺮغ،ﰲ اﻷﺧري ﻧﻘﻮم ﺑﺈﻇﻬﺎر رﺳﺎﻟﺔ ﺗﻔﻴﺪ ﺑﺤﺬف اﻟﻄﺎﻟﺐ
.اﻟﻨﺪاء ﻋﲆ ﺣﺪث ﺗﺤﻤﻴﻞ اﻟﻔﻮرم
MsgBox("Student
"Student Deleted Successfully",
Successfully",
MsgBoxStyle.Information)
Dt.Clear()
Form1_Load(sender, e)
55
: Off-line Mode ﰲ اﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ: ﺛﺎﻧﻴﺎ
Dim Input As String
Try
Input = InputBox("Enter
InputBox("Enter The ID of Student To
Delete !", "Delete")
"Delete"
For i As Integer = 0 To Dt.Rows.Count - 1
If Input = Dt.Rows(i).Item(0) Then
Dt.Rows(i).Delete()
Cmdb = New SqlCommandBuilder(Da)
CommandBuilder(Da)
Da.Update(Dt)
MsgBox("Student
"Student Deleted Successfully",
Successfully"
MsgBoxStyle.Information)
Exit Sub
End If
Next
MsgBox(
MsgBox("Not Found !")
Catch ex As Exception
MsgBox(
MsgBox("Some errors was occured !",
,
MsgBoxStyle.Critical)
End Try
، ﻋﻦ اﻟﻄﺎﻟﺐ اﻟﺬي ﻳﺤﻤﻞ اﻟﺮﻗﻢ اﳌﺪﺧﻞDt ﺑﻌﺪ ذﻟﻚ ﻧﻘﻮم ﺑﺎﻟﺒﺤﺚ داﺧﻞ،ﻧﻔﺲ اﻟﺨﻄﻮات اﻟﺴﺎﺑﻘﺔ
وﰲ ﻛﻞ ﻣﺮة ﻧﻘﻮم مبﻘﺎرﻧﺔ ﺑني ﻗﻴﻤﺔ، إﱃ آﺧﺮ ﻋﻨﴫDt وذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﺬﻫﺎب ﻣﻦ أول ﻋﻨﴫ ﰲ
. وﺑني رﻗﻢ اﻟﻄﺎﻟﺐ اﻟﺬي ﻧﺼﻞ إﻟﻴﻪInput اﳌﺘﻐري
ﻧﻘﻮم ﺑﺤﺬﻓﻪ اﺑﺘﺪاﺋﻴﺎ ﻣﻦ، وﺑني رﻗﻢ اﻟﻄﺎﻟﺐ اﳌﺒﺤﻮث ﻋﻨﻪInput إذا ﺗﺤﻘﻖ ﴍط اﻟﺘﻮاﻓﻖ ﺑني اﳌﺘﻐري
ﺑﻌﺪ ذﻟﻚ ﻧﻌﻴﺪ ﺗﺤﻤﻴﻞ اﻟﻔﻮرم ﻟﺘﺤﺪﻳﺚ،Cmdb ﺛﻢ ﻧﻔﻌﻞ اﻟﺤﺬف ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻋﻦ ﻃﺮﻳﻖDt
.ﻣﺤﺘﻮى اﻟﺪاﺗﺎﻏﺮﻳﺪﻓﻴﻮ
56
: واﻵن ﺳﻨﻌﺮض ﺷﻔﺮيت اﻟﺤﺬف ﰲ ﻛﻼ اﻟﻮﺿﻌني ﺣﺘﻰ ﺗﺘﻀﺢ اﻟﺮؤﻳﺔ
'Off-line
line Mode
Dim Input As String
Try
Input = InputBox("Enter
InputBox("Enter The ID of Student To
Delete !", "Delete")
For i As Integer = 0 To Dt.Rows.Count - 1
If Input = Dt.Rows(i).Item(0) Then
Dt.Rows(i).Delete()
Cmdb = New SqlCommandBuilder(Da)
CommandBuilder(Da)
Da.Update(Dt)
MsgBox("Student Deleted Successfully",
MsgBox("Student Successfully"
MsgBoxStyle.Information)
Exit Sub
End If
Next
57
MsgBox("Not
"Not Found !")
!"
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
End Try
58
:Find زر اﻟﺒﺤﺚ.4
وﻋﻨﺪ اﻟﻌﺜﻮر ﻋﻠﻴﻪ ﺗﻈﻬﺮ ﺑﻴﺎﻧﺎﺗﻪ ﰲ،أﻣﺎ دور ﻫﺪا اﻟﺰر ﻓﻬﻮ اﻟﺒﺤﺚ ﻋﻦ ﻃﺎﻟﺐ ﻣﻌني ﺑﺎﻻﻋﺘامد ﻋﲆ رﻗﻤﻪ
.ﺧﺎﻧﺎت اﻟﻨﺺ
وﻗﻠﻨﺎ ﺑﺄن دوره ﻫﻮDataReader ﻛﻨﺎ ﻗﺪ ذﻛﺮﻧﺎ ﻛﺎﺋﻨﺎ اﺳﻤﻪ،ﰲ ﺑﺪاﻳﺔ ﺣﺪﻳﺜﻨﺎ ﻋﻦ ﻛﺎﺋﻨﺎت اﻟﻮﺿﻊ اﳌﺘﺼﻞ
ﻛام ﻳﺘﻴﺢ ﻟﻨﺎ إﻣﻜﺎﻧﻴﺔ اﺳﺘﻐﻼل اﻟﻘﻴﻢ اﳌﻘﺮوءة ﻟﻨﻈﻬﺮﻫﺎ، ﺑﺠﻠﺒﻬﺎCommand ﻗﺮاءة اﻟﺒﻴﺎﻧﺎت اﻟﺘﻲ ﻳﻘﻮم
.ﰲ ﻋﻤﻠﻴﺔ اﻟﺒﺤﺚ
59
ﺗﻔﺎدﻳﺎ ﻟﻠﺨﺮوج ﻋﻦ ﺳﻴﺎق،ﻳﺘﻮﻓﺮ ﻫﺬا اﻟﻜﺎﺋﻦ ﻋﲆ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺪوال ﻟﻦ ﻧﺘﻄﺮق إﱃ ذﻛﺮﻫﺎ ﻫﻨﺎ
وﻟﻜﻦ ﺳﻨﻘﻮم ـ إن ﺷﺎء ﷲ ـ إذا أﺗﻴﺤﺖ ﻟﻨﺎ ﻓﺮﺻﺔ أﺧﺮى ﺑﺒﺴﻂ ﻛﻞ ﻫﺬه اﻟﻜﺎﺋﻨﺎت وﻏريﻫﺎ ﰲ،اﻟﺴﻠﺴﻠﺔ
.ﻛﺘﺎب آﺧﺮ
. ﺑﻨﻔﺲ اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﻧﻐﻠﻖ ﺑﻬﺎ اﻻﺗﺼﺎلDataReader ﻋﻨﺪ ﻧﻬﺎﻳﺔ ﻗﺮاءة اﻟﺒﻴﺎﻧﺎت ﻧﻘﻮم ﺑﺈﻏﻼق
60
إن اﺳﺘﻌﺼﻴﺘﻬﺎ ﻋﻠﻴﻚ ﺑﻬﺬا اﻟﺪﻋﺎء اﻟﺠﻤﻴﻞ اﻟﺬي ﻋﻠﻴﻚ... وﺳﺘﻬﻀﻤﻬﺎ ﰲ ﳌﺢ اﻟﺒﴫ،اﻗﺮأ اﻟﺸﻔﺮة ﺑﺘﻤﻌﻦ
وأﻧﺖ ﺗﺠﻌﻞ اﻟﺤﺰن إذا ﺷﺌﺖ، " اﻟﻠﻬﻢ ﻻ ﺳﻬﻞ إﻻ ﻣﺎ ﺟﻌﻠﺘﻪ ﺳﻬﻼ:مبﻼزﻣﺘﻪ ﻛﻠام اﺳﺘﺼﻌﺒﺖ أﻣﺮا ﻣﺎ
" ﺳﻬﻼ
'Off-line
line Mode
Dim Input As String
Try
Input = InputBox("Enter
InputBox( The ID of Student To
Search !", "Search")
61
For i As Integer = 0 To Dt.Rows.Count - 1
If Input = Dt.Rows(i).Item(0) Then
Me.TxtID.Text = Dt.Rows(i).Item(0)
Me.TxtID.Text
Me.TxtLname.Text = Dt.Rows(i).Item(1)
Me.TxtLname.Text
Me.TxtFname.Text = Dt.Rows(i).Item(2)
Me.TxtFname.Text
Me.TextAge.Text = Dt.Rows(i).Item(3)
Me.TextAge.Text
Me.TextAdress.Text = Dt.Rows(i).Item(4)
Me.TextAdress.Text
Exit Sub
End If
Next
MsgBox("Not
"Not Found !")
!"
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
End Try
End Sub
62
:Edit زر اﻟﺘﻌﺪﻳﻞ.5
ﺑﻌﺪ اﻟﻌﺜﻮر ﻋﻠﻴﻪ، ﻳﻨﺒﻐﻲ أن ﻧﻘﻮم أوﻻ ﺑﻌﻤﻴﻠﺔ اﻟﺒﺤﺚ ﻋﻦ اﻟﻄﺎﻟﺐ اﳌﺮاد ﺗﻐﻴري ﺑﻴﺎﻧﺎﺗﻪ،ﻗﺒﻞ اﻟﺘﻌﺪﻳﻞ
(ﻧﻌﺪل اﻟﺒﻴﺎﻧﺎت ﺛﻢ ﻧﻀﻐﻂ ﻋﲆ ﻫﺬا اﻟﺰر )رﻛﺰ ﺟﻴﺪا ﰲ ﻫﺬه اﻟﺨﻄﻮات
أي رﻗﻢ اﻟﻄﺎﻟﺐ اﳌﺮادTxtID ﻋﻦ اﻟﻄﺎﻟﺐ اﻟﺬي رﻗﻤﻪ ﻳﺴﺎوي اﻟﺮﻗﻢ اﳌﻜﺘﻮب ﰲDt ﻧﻘﻮم ﺑﺎﻟﺒﺤﺚ ﰲ
ﺑﺎﻟﻘﻴﻢ اﻟﺠﺪﻳﺪة اﳌﻜﺘﻮﺑﺔ ﰲ ﺧﺎﻧﺎتDt ﺑﻌﺪ اﻟﻌﺜﻮر ﻋﻠﻴﻪ ﻧﻘﻮم ﺑﺈﺑﺪال اﻟﻘﻴﻢ اﻟﻘﺪميﺔ اﳌﺨﺰﻧﺔ ﰲ،ﺗﻌﺪﻳﻠﻪ
.CommandBuilder ﺛﻢ ﻧﻔﻌﻞ اﻟﺘﻌﺪﻳﻞ ﻋﻦ ﻃﺮﻳﻖ،اﻟﻨﺺ
64
:ﻓﻴام ﻳﲇ ﺳﻨﻮرد ﻛﻠﺘﺎ اﻟﺸﻔﺮﺗني
'Off-line
line Mode
Try
For i = 0 To Dt.Rows.Count - 1
If Dt.Rows(i).Item(0) = TxtID.Text Then
Dt.Rows(i).Item(0) = TxtID.Text
Dt.Rows(i).Item(1) = TxtFname.Text
Dt.Rows(i).Item(2) = TxtLname.Text
Dt.Rows(i).Item(3) = TextAge.Text
Dt.Rows(i).Item(4) = TextAdress.Text
65
Cmdb = New SqlCommandBuilder(Da)
CommandBuilder(Da)
Da.Update(Dt)
MsgBox("Student Edited Successfully",
MsgBox("Student Successfully"
MsgBoxStyle.Information)
End If
Next
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
gBoxStyle.Critical)
End Try
End Sub
66
.6زر اﻟﺨﺮوج :Exit
ﻗﻢ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻴﻪ ﻣﺮﺗني واﻛﺘﺐ اﻟﻜﻠﻤﺔ اﻟﺘﺎﻟﻴﺔ:
Private Sub Exit_Click(ByVal
ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Exit.Click
End
End Sub
اﻵن اﻧﺘﻬﻴﻨﺎ وهلل اﻟﺤﻤﺪ ﻣﻦ اﻟﻌﻤﻠﻴﺎت اﻟﺮﺋﻴﺴﻴﺔ ﻣﻦ إﺿﺎﻓﺔ و ﺣﺬف وﺑﺤﺚ وﺗﻌﺪﻳﻞ ،ﺑﻘﻲ ﻟﻨﺎ اﻵن إن
ﺷﺎء ﷲ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻴﺔ اﻟﺘﻨﻘﻞ ﺑني ﺳﺠﻼت اﻟﻄﻼب ،وﻫﺬه اﻟﻌﻤﻠﻴﺔ ﻣﻦ أﺳﻬﻞ ﻣﺎ ﻳﻜﻮن ،ﺳﻨﻘﻮم ﺑﺈﻧﺸﺎء
إﺟﺮاء Procedureﻧﺴﻤﻴﻪ )( MoveDataﻳﺘﻠﻘﻰ رﺗﺒﺔ اﻟﺴﺠﻞ ﻛﺒﺎراﻣﱰ MoveData (Position as
) ،Integerﺛﻢ ﻳﺬﻫﺐ إﱃ ﺗﻠﻚ اﻟﺮﺗﺒﺔ وﻳﻈﻬﺮ ﻗﻴﻤﻬﺎ ﰲ ﺧﺎﻧﺎت اﻟﻨﺺ.
67
Sub MoveData(ByVal
ByVal Position As Integer)
TxtID.Text = Dt.Rows(Position).Item(0)
TxtFname.Text = Dt.Rows(Position).Item(1)
TxtLname.Text = Dt.Rows(Position).Item(2)
TextAge.Text = Dt.Rows(Position).Item(3)
TextAdress.Text = Dt.Rows(Position).Item(4)
End Sub
Index : وﻟﻨﺴﻤﻪ ﻣﺜﻼ، ﻧﻘﻮم ﺑﺎﻹﻋﻼن ﻋﻦ ﻣﺘﻐري رﻗﻤﻲ ﻋﺎم،ﻗﺒﻞ اﻟﻨﺪاء ﻋﲆ ﻫﺬا اﻹﺟﺮاء ﰲ أزرار اﻟﺘﻨﻘﻞ
Imports System.Data.SqlClient
Data.SqlClient
Public Class Form1
Dim Con As New SqlConnection("Server=.\SQLEXPRESS;
Sql SQLEXPRESS;
Database= StudentBase; Integrated Security=true")
Security=true
Dim Da As SqlDataAdapter
DataAdapter
Dim Dt As New DataTable
Dim Cmd As New SqlCommand
Sql
Dim Dr As SqlDataReader
DataReader
Dim Cmdb As New SqlCommandBuilder
Sql
Dim Index As Integer
ﻧﺬﻫﺐ إﱃ زر "اﻷول" وﻧﻘﻮم ﺑﺎﻟﻨﺪاء ﻋﲆ ﻫﺬا،اﻵن ﻧﻄﺒﻖ ﻣﺎ ﺗﺤﺪﺛﻨﺎ ﻋﻨﻪ ﻗﺒﻞ ﻗﻠﻴﻞ
:0 اﻹﺟﺮاء ﻣﻊ ﺗﻐﻴري ﻗﻴﻤﺔ اﻟﺮﺗﺒﺔ ب
Index = 0
MoveData(Index)
End Sub
68
MoveData(Index)
End Sub
If Index = 0 Then
MsgBox(
MsgBox("This is the first student",
,
MsgBoxStyle.Critical)
Exit Sub
End If
Index = Index - 1
MoveData(Index)
End Sub
.ﻧﺘﺤﻘﻖ ﻣﻦ اﻟﺮﺗﺒﺔ ﰲ ﻛﻞ ﻣﺮة ﺣﺘﻰ ﻻ ﻳﻘﻊ ﺧﻄﺄ ﻋﻨﺪ اﻟﻀﻐﻂ اﳌﺘﻮاﺻﻞ ﻋﲆ ﻫﺬا اﻟﺰر
69
متﺮﻳﻦ ﺗﺤﺼﻴﲇ :
ﺣﺘﻰ ﻧﻘﻮم ﺑﺘﺤﺼﻴﻞ و ﻓﻬﻢ ﻛﻞ اﻟﺸﻔﺮات اﻟﺘﻲ أوردﻧﺎﻫﺎ آﻧﻔﺎ ،ﺳﻨﺴﻌﻰ إﱃ إﻧﺠﺎز ﻫﺬا اﻟﺘﻤﺮﻳﻦ اﳌامﺛﻞ )
أو ﺑﺎﻷﺣﺮى ﺳﺘﺴﻌﻰ ﻟﺬﻟﻚ وﺣﺪك ،ﻛﺎن ﷲ ﰲ ﻋﻮﻧﻚ (
اﳌﻄﻠﻮب ﻣﻨﻚ ﻋﺰﻳﺰي اﻟﻘﺎرئ أن ﺗﻨﺠﺰ اﻟﻔﻮرم اﻟﺘﺎﱄ اﻟﺬي ﻳﻘﻮم ﺑﺈدارة اﳌﻮاد ،ﺑﺤﻴﺚ ﻣﻦ ﺧﻼﻟﻪ ﻳﺴﺘﻄﻴﻊ
اﳌﺴﺘﺨﺪم أن ﻳﺸﺎﻫﺪ ﻛﻞ اﳌﻮاد اﳌﺤﻔﻮﻇﺔ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ،وﻛﺬا إﻣﻜﺎﻧﻴﺔ اﻟﺘﻌﺪﻳﻞ ﻋﻠﻴﻬﺎ وﺣﺬﻓﻬﺎ و
إﺿﺎﻓﺔ ﻣﻮاد ﺟﺪﻳﺪة ،زﻳﺎدة ﻋﲆ أزرار اﻟﺘﻨﻘﻞ ﺑني ﺳﺠﻼت اﳌﻮاد.
اﻷﻣﺮ ﺑﺴﻴﻂ ﺟﺪا ،ﻛﻞ ﻣﺎ ﻋﻠﻴﻚ ﻫﻮ ﻣﺮاﺟﻌﺔ اﻟﺸﻔﺮات اﻟﺴﺎﺑﻘﺔ و ﻣﺤﺎوﻟﺔ اﺳﺘﻴﻌﺎﺑﻬﺎ أﻛرث ،و إن ﺷﺎء ﷲ
ﺳﺘﻨﺠﺰه ﰲ وﻗﺖ ﻳﺴري !
70
اﻟﺠﺰء اﻟﺜﺎﻟﺚ:
71
، أردت أن أﻗﺪم ﻓﻴام ﻳﲇ ﴍح ﻛﻴﻔﻴﺔ إﻧﺠﺎز ﻓﻮرم إﺿﺎﻓﺔ اﻟﻨﻘﺎط ﻟﻠﻄﻼب ﰲ اﳌﻮاد اﻟﺘﺪرﻳﺴﻴﺔ،ﺑﴫاﺣﺔ
إذ أن ﺑﺮﻧﺎﻣﺞ إدارة، وﻷن اﻟﺘﺤﻠﻴﻞ أﺻﻼ ﻟﻴﺲ ﻛﺎﻣﻼ،وﻟﻜﻨﻨﻲ ارﺗﺄﻳﺖ إﻟﻐﺎء ذﻟﻚ ﻷن اﻟﻜﺘﺎب ﺳﻴﻄﻮل ﻛﺜريا
أﻣﺎ ﰲ ﺳﻠﺴﻠﺘﻨﺎ ﻫﺬه ﻓﻨﺤﻦ ﻧﺮﻛﺰ ﻓﻘﻂ ﻋﲆ ﻣﺎ ﻫﻮ ﻋﻤﲇ،اﻟﻄﻼب ﻳﺘﻄﻠﺐ ﺗﺤﻠﻴﻼ ﻗﺒﻞ ﺑﺪاﻳﺔ اﻹﻧﺠﺎز
. إذ ﺑﺈﺗﻘﺎﻧﻚ ﻟﻬﺬا اﻟﺘﻄﺒﻴﻖ ﺳﺘﻐﺪو ﻗﺎدرا إن ﺷﺎء ﷲ ﻋﲆ إﻧﺠﺎز ﻏريه ﻣﻬام ﻛﺎن ﻧﺺ اﳌﴩوع،ﻓﺤﺴﺐ
وﻻ ﻳﻬﻢ اﳌﺜﺎل اﻟﺬي، ﻣﺎ ﻳﻬﻢ ﰲ ﺳﻠﺴﻠﺘﻨﺎ ﻫﺬه ﻫﻮ اﻟﺘﻤﻜﻦ ﻣﻦ إﻧﺠﺎز اﻷﻋامل ﺑﺎﺣﱰاﻓﻴﺔ،ﻛام ﻗﻠﺖ
. ﻷن اﻟﻐﺮض ﻟﻴﺲ ﻫﻮ اﳌﺜﺎل ﻧﻔﺴﻪ وﻟﻜﻦ اﻟﻐﺮض ﻫﻮ ﺗﻌﻠﻢ ﺗﻘﻨﻴﺎت إﻧﺠﺎزه،ﻧﻌﻄﻴﻪ
ﻏري أن ﻫﺬا ﻟﻦ ميﻨﻌﻨﺎ ﻣﻦ إﻳﺮاد ﺑﻌﺾ اﻷﻛﻮاد اﻟﺘﻲ ﻗﺪ ﺗﺤﺘﺎﺟﻬﺎ إن ﺷﺎء ﷲ ﰲ ﺑﻌﺾ اﻟﺘﻄﺒﻴﻘﺎت اﳌﺮﺗﺒﻄﺔ
.ﺑﻘﺎﻋﺪة ﺑﻴﺎﻧﺎت
72
End Class
ﻧﻘﻮم ﺑﺠﻠﺐ اﻟﺒﻴﺎﻧﺎت اﳌﺮاد إﻇﻬﺎرﻫﺎ ﰲ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ ،إﺿﺎﻓﺔ إﱃ اﻟﺤﻘﻞ اﻟﺮﺋﻴﴘ )ﻟﻴﺲ ﴐورﻳﺎ إذا ﻛﺎن
اﻟﻐﺮض ﻫﻮ اﻹﻇﻬﺎر ﻓﻘﻂ( ،ﺑﻌﺪ ذﻟﻚ ﻧﻘﻮم ﺑﻮﺿﻊ اﻟﺒﻴﺎﻧﺎت اﳌﺠﻠﻮﺑﺔ ﻣﻦ ﻃﺮف DataAdapterوﻧﻀﻌﻬﺎ
ﰲ .DataTable
Me.ComboBox1.DataSource
.ComboBox1.DataSource = Dt
ﺛﻢ ﻧﺤﺪد اﻟﺤﻘﻞ اﳌﺮاد إﻇﻬﺎره ﺑﺎﻻﻋﺘامد ﻋﲆ اﻟﺨﺎﺻﻴﺔ ،DisplayMemberﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﺳﻨﻈﻬﺮ
اﻻﺳﻢ اﻟﺸﺨﴢ واﻟﻌﺎﺋﲇ ﻣﻌﺎ ،وﻟﻌﻠﻚ ﻻﺣﻈﺖ ذﻟﻚ ﰲ اﻻﺳﺘﻌﻼم اﻟﺬي ﻗﻤﻨﺎ ﺑﻪ ،إذ ﻗﻤﻨﺎ ﺑﺪﻣﺠﻬام ﻣﻌﺎ.
Me.ComboBox1.DisplayMember
".ComboBox1.DisplayMember = "FullName
73
اﻟﺸﻔﺮة اﻟﺜﺎﻧﻴﺔ :ﻛﻴﻔﻴﺔ إﻇﻬﺎر ﺑﻴﺎﻧﺎت ﻣﻌﻴﻨﺔ ﻋﻨﺪ اﺧﺘﻴﺎر ﻋﻨﴫ ﻣﻦ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ
Combobox
اﻟﺤﺪث اﻟﺬي ﻳﺘﻮﻟﺪ ﻋﻨﺪﻣﺎ ﻧﻘﻮم ﺑﺎﺧﺘﻴﺎر ﻋﻨﴫ ﻣﻦ اﻟﻘﺎمئﺔ اﳌﻨﺴﺪﻟﺔ ComboBoxﻳﺴﻤﻰ
،SelectedIndexChangedوﺑﺎﻟﺘﺎﱄ ﻓﺸﻔﺮﺗﻨﺎ ﻫﺬه ﻳﺠﺐ أن ﻧﻀﻌﻬﺎ ﺿﻤﻦ ﻫﺬا اﻟﺤﺪث ،وﻟﺘﻔﺎدي وﻗﻮع
أي ﺧﻄﺄ أﺛﻨﺎء اﻟﺘﻨﻔﻴﺬ ﻧﻀﻴﻒ اﻷﻣﺮ : Try…Catch
Try
)(Dt2.Clear
Da = New SqlDataAdapter("select
"select Adress From
Student Where ID_Student=" & ComboBox1.SelectedValue & "",
)Con
)Da.Fill(Dt2
Me.TextBox1.Text
).TextBox1.Text = Dt2.Rows(0).Item(0
Catch ex As Exception
Exit Sub
End Try
End Sub
ﻓﻘﻂ ﻟﻺﺷﺎرة ﻻ ﻳﻠﺰﻣﻨﺎ اﺳﺘﻌامل DataTableواﺣﺪ ،ﻷﻧﻪ ﻻ ﻳﻌﻘﻞ أن ﻳﻜﻮن ﻫﻮ ﻣﺼﺪر اﻟﺒﻴﺎﻧﺎت وﰲ
ﻧﻔﺲ اﻟﻮﻗﺖ ﻫﻮ اﻟﻨﺘﻴﺠﺔ ،ﻟﺬا وﺟﺐ اﻹﻋﻼن ﻋﻦ ﻣﺘﻐري آﺧﺮ وﻟﻨﺴﻤﻪ ﻣﺜﻼ Dt2ﻛام ﰲ اﻷمنﻮذج أﻋﻼه.
أول ﺳﻄﺮ ﻳﻘﻮم ﺑﺘﻔﺮﻳﻎ Dt2ﻋﻨﺪ ﻛﻞ اﺧﺘﻴﺎر ،ﻣﻦ أﺟﻞ ﻣﻠﺌﻪ ﺑﺎﻟﺒﻴﺎﻧﺎت اﻟﺠﺪﻳﺪة ،ﺑﻌﺪ ذﻟﻚ منﻠﺆه ﺑﺎﻟﻄﺮق
اﻟﺘﻲ رأﻳﻨﺎﻫﺎ آﻧﻔﺎ ،ﺛﻢ ﻧﻈﻬﺮ اﻟﺤﻘﻞ اﻟﺬي ﻧﺮﻳﺪ ،ﺑﻌﺪ اﻟﺘﻨﻔﻴﺬ ﺳﺘﻜﻮن اﻟﻨﺘﻴﺠﺔ ﻛام ﻳﲇ :
74
ﻋﻨﺪ اﺧﺘﻴﺎر اﺳﻢ اﻟﻄﺎﻟﺐ ،ﺳﻴﻈﻬﺮ ﻋﻨﻮاﻧﻪ ﰲ ﺧﺎﻧﺔ اﻟﻨﺺ اﻟﺴﻔﻠﻴﺔ.
ﻟﻌﻠﻚ ﻻﺣﻈﺖ أن اﻟﻌﺪﻳﺪ ﻣﻦ اﻟﱪاﻣﺞ واﳌﻮاﻗﻊ ﺗﺴﺘﻌﻤﻞ ﻫﺬه اﻟﺘﻘﻨﻴﺔ ﰲ اﻟﺒﺤﺚ ،إذ مبﺠﺮد ﻣﺎ ﺗﺒﺪأ ﻛﺘﺎﺑﺔ
اﻷﺣﺮف اﻷوﱃ ﻟﻠﺒﺤﺚ ،ﻳﻘﻮم اﻟﱪﻧﺎﻣﺞ ﺗﻠﻘﺎﺋﻴﺎ ﺑﺈﻛامل اﻷﺣﺮف اﳌﺘﺒﻘﻴﺔ.
اﻟﺸﻔﺮة اﻟﺘﻲ ﺳﻨﻌﺮﺿﻬﺎ ﺑﻌﺪ ﻗﻠﻴﻞ ،ﺗﻘﻮم ﺑﺈﻧﺠﺎز ﻫﺬه اﳌﻬﻤﺔ ،وﻫﺬه ﺻﻮرة ﻋﲆ اﻟﻨﺘﻴﺠﺔ اﳌﺮﺗﻘﺒﺔ :
75
، وﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﻫﻮ اﻷﻧﺴﺐ،KeyUp اﻟﺤﺪث اﻟﺬي ﻳﺘﻮﻟﺪ ﻋﻨﺪ اﻟﻀﻐﻂ ﻋﲆ زر ﰲ ﻟﻮﺣﺔ اﳌﻔﺎﺗﻴﺢ ﻫﻮ
وﻣﻦ ﺗﻢ إﻛامل،ﻷﻧﻪ ﻋﻨﺪ اﻟﻀﻐﻂ ﻋﲆ ﻛﻞ زر ﻧﻘﻮم ﺑﻌﻤﻠﻴﺔ اﻟﺒﺤﺚ داﺧﻞ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ واﳌﻘﺎرﻧﺔ
.اﻟﺤﺮوف اﳌﻜﺘﻮﺑﺔ
If bo = True Then
Exit Sub
End If
actual = Me.ComboBox1.Text
.ComboBox1.Text
index = Me.ComboBox1.FindString(actual)
.ComboBox1.FindString(actual)
76
If index > -11 Then
found = Me.ComboBox1.Items(index).ToString
Me.ComboBox1.Items(index).ToString
Me.ComboBox1.SelectedIndex
.ComboBox1.SelectedIndex = index
Me.ComboBox1.SelectionStart
.ComboBox1.SelectionStart = actual.Length
Me.ComboBox1.SelectionLength
.ComboBox1.SelectionLength = found.Length
End If
End Sub
ﻻ ﺗﻨﺰﻋﺞ ﻣﻦ ﻫﺬه اﻟﺸﻔﺮة ،ﻷﻧﻬﺎ ﻫﻜﺬا ﺗﺒﺪو ﻋﻨﺪ أول وﻫﻠﺔ ،رﻛﺰ ﻣﻌﻲ ﰲ اﻟﴩح وﺳﺘﻜﺘﺸﻒ ﺑﺄن اﻷﻣﺮ
: ﻳﺴري ﺟﺪا
اﳌﺘﻐري indexﻣﻦ ﻧﻮع رﻗﻤﻲ ،دوره ﻫﻮ اﻟﺒﺤﺚ ﻋﻦ رﺗﺒﺔ اﻟﻌﻨﴫ اﻟﺬي ﻳﺸﺒﻪ ﰲ ﺑﺪاﻳﺘﻪ اﻟﻨﺺ اﳌﻜﺘﻮب،
مبﻌﻨﻰ آﺧﺮ ،ﻟﻮ ﻛﺎن اﻟﻨﺺ اﳌﻜﺘﻮب ﻫﻮ KARIMﻓﺈﻧﻪ ﺳﻴﺬﻫﺐ وﻳﺒﺤﺚ داﺧﻞ ﻋﻨﺎﴏ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ
ﻋﻦ رﺗﺒﺔ اﻟﻌﻨﴫ اﻟﺬي ﻳﺒﺪأ ﺑﻨﻔﺲ اﻷﺣﺮف .KARIM
ﺑﻌﺪ اﻟﻌﺜﻮر ﻋﲆ رﺗﺒﺔ اﻟﻌﻨﴫ اﳌﻄﺎﺑﻖ ﻣﺒﺪﺋﻴﺎ ﻟﻠﻨﺺ اﳌﻜﺘﻮب ،ﻧﻘﻮم ﺑﺘﺨﺰﻳﻦ ﻗﻴﻤﺘﻪ ﰲ اﳌﺘﻐري .found
ﺣﺘﻰ ﻻ ﺗﺨﺘﻠﻂ ﻋﻠﻴﻚ اﳌﻔﺎﻫﻴﻢ ،ﻓﺮﺗﺒﺔ اﻟﻌﻨﴫ ﻫﻲ رﻗﻤﻪ اﻟﱰﺗﻴﺒﻲ داﺧﻞ اﻟﻘﺎمئﺔ ،أﻣﺎ ﻗﻴﻤﺘﻪ ﻓﻬﻲ اﻟﻌﻨﴫ
ذاﺗﻪ أي ﻧﺺ اﻟﻌﻨﴫ.
77
. ﻓﻬﻮ ﻳﺴﺎوي ﻗﻴﻤﺔ اﻟﻨﺺ اﳌﻜﺘﻮب ﰲ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲactual أﻣﺎ اﳌﺘﻐري اﻟﻨﴢ
Dim bo As Boolean = e.KeyCode = Keys.Back _
Or e.KeyCode = Keys.Left _
Or e.KeyCode = Keys.Right _
Or e.KeyCode = Keys.Up _
Or e.KeyCode = Keys.Down _
Or e.KeyCode = Keys.Delete _
Or e.KeyCode = Keys.PageDown _
Or e.KeyCode = Keys.PageUp _
Or e.KeyCode = Keys.End _
Or e.KeyCode = Keys.Home
زر اﻟﺤﺬف واﻟﺮﺟﻮع إﱃ اﻟﺨﻠﻒ و أزرار: ﻧﻘﻮم ﻓﻴﻪ ﺑﺤﻔﻆ ﺣﺎﻟﺔ اﻷزرار اﻟﻮاردة أﻋﻼه وﻫﻲbo اﳌﺘﻐري
.اﻷﺳﻬﻢ وﻏريﻫﺎ ﻣﻦ اﻷزرار اﻟﺘﻲ ﻳﻨﺒﻐﻲ أن ﺗ ُﺴﺘﺜﻨﻰ ﻣﻦ ﻋﻤﻠﻴﺔ اﻟﻜﺘﺎﺑﺔ
If bo = True Then
Exit Sub
End If
ﻧﻘﻮمbo ﻓﺈن ﻛﺎن ﻳﺴﺎوي أﺣﺪ اﻷزرار اﳌﺤﻔﻮﻇﺔ ﰲ اﳌﺘﻐري،ﻧﺘﺄﻛﺪ ﻣﻦ اﻟﺰر اﻟﺬي ﺿﻐﻂ ﻋﻠﻴﻪ اﳌﺴﺘﺨﺪم
. ﻓﺴﻴﻨﻔﺬ ﺑﺎﻗﻲ اﻟﻜﻮد، أﻣﺎ إذا ﻛﺎن اﻟﺰر اﳌﻀﻐﻮط ﺧﻼف ذﻟﻚ،ﺑﺈﻟﻐﺎء ﺑﺎﻗﻲ اﻟﻜﻮد
actual = Me.ComboBox1.Text
.ComboBox1.Text
index = Me.ComboBox1.FindString(actual)
.ComboBox1.FindString(actual)
78
اﻟﺴﻄﺮ اﻷول ﻳﻘﻮم ﺑﺘﺨﺰﻳﻦ اﻟﻨﺺ اﳌﻜﺘﻮب ﰲ اﳌﺘﻐري ،actualأﻣﺎ اﻟﺴﻄﺮ اﻟﺜﺎين ﻓﻴﻘﻮم ﺑﺎﻟﺒﺤﺚ ﻋﻦ رﺗﺒﺔ
اﻟﻌﻨﴫ اﻟﺬي ﻳﺸﺒﻪ ﰲ ﺑﺪاﻳﺎﺗﻪ اﻟﻨﺺ اﳌﻜﺘﻮب ،وذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﺪاﻟﻪ FindString
If index > -1 Then
found = Me.ComboBox1.Items(index).ToString
.ComboBox1.Items(index).ToString
Me.ComboBox1.SelectedIndex
.ComboBox1.SelectedIndex = index
Me.ComboBox1.SelectionStart
.ComboBox1.SelectionStart = actual.Length
Me.ComboBox1.Selection
.ComboBox1.SelectionLength = found.Length
End If
ﻧﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺔ اﳌﺘﻐري indexﻓﺈن ﻛﺎﻧﺖ أﺻﻐﺮ ﻣﻦ -1ﻓﻬﺬا ﻳﻌﻨﻲ ﺑﺄﻧﻪ ﻻ ﻳﻮﺟﺪ أي ﻋﻨﴫ ﻟﻪ ﺑﺪاﻳﺔ
ﻣﺸﺎﺑﻬﺔ ﻟﻠﻨﺺ اﳌﻜﺘﻮب ،أﻣﺎ إن ﻛﺎﻧﺖ ﻗﻴﻤﺘﻪ أﻛﱪ ﻣﻦ -1ﻓﻬﺬا ﻳﺪل ﻋﲆ أﻧﻪ ﺗﻢ اﻟﻌﺜﻮر ﻋﲆ ﻋﻨﴫ
ﻳﺒﺘﺪئ ﺑﺎﻟﻨﺺ اﳌﻜﺘﻮب.
ﺑﻌﺪ ﺗﺤﻘﻖ اﻟﴩط ،أي اﻟﻌﺜﻮر ﻋﲆ ﻋﻨﴫ ﻳﺒﺪأ ﺑﺎﻟﻨﺺ اﳌﻜﺘﻮب داﺧﻞ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ ،ﻧﻘﻮم ﺑﺤﻔﻆ ﻗﻴﻤﺔ
اﻟﻌﻨﴫ اﳌﻌﺜﻮر ﻋﻠﻴﻪ ﰲ اﳌﺘﻐري ،foundﺛﻢ ﻧﻐري اﻟﻌﻨﴫ اﻻﻓﱰاﴈ ﺑﺎﻟﻌﻨﴫ اﳌﻌﺜﻮر ﻋﻠﻴﻪ وﻧﻈﻬﺮه ﰲ
اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ ،ﺑﻌﺪ ذﻟﻚ ﻧﻘﻮم ﺑﺘﺤﺪﻳﺪ ﺗﺘﻤﺔ اﻟﻨﺺ اﳌﻜﺘﻮب ﻋﻦ ﻃﺮﻳﻖ اﻟﺪاﻟﺔ ،SelectionStartوﰲ
اﻷﺧري ﻧﺤﺪد ﻃﻮل اﻟﺘﺤﺪﻳﺪ SelectionLengthوﻫﻮ ﻳﺒﺪأ ﻣﻦ ﻧﻬﺎﻳﺔ اﻟﻨﺺ اﳌﻜﺘﻮب إﱃ ﻧﻬﺎﻳﺔ اﻟﻌﻨﴫ
اﳌﻌﺜﻮر ﻋﻠﻴﻪ.
أرﻫﻘﺘﻚ ﺑﺒﻌﺾ اﻟﻜﻠامت...وﻟﻜﻦ واﻟﺤﻖ ﻳﻘﺎل ،مل أﺟﺪ أﻳﴪ ﻣﻦ ذﻟﻚ ﻟﻠﴩح ﻛﺎن ﷲ ﰲ ﻋﻮﻧﻚ
79
اﻟﺸﻔﺮة اﻟﺮاﺑﻌﺔ :ﻛﻴﻔﻴﺔ إﻇﻬﺎر ﺑﻴﺎﻧﺎت ﺳﻄﺮ ﻣﻦ اﻟﺪاﺗﺎﻏﺮﻳﺪﭬﻴﻮ ﻋﲆ ﺧﺎﻧﺎت اﻟﻨﺺ
مبﺠﺮد ﺗﺤﺪﻳﺪه
ﻋﻨﺪ ﺗﺤﺪﻳﺪ ﺳﻄﺮ ﻣﻌني ﻣﻦ أداة اﻟﺪاﺗﺎﻏﺮﻳﺪﭬﻴﻮ ،ﻓﺈن اﻟﺘﺤﺪﻳﺪ ﻳﺸﻤﻞ ﻓﻘﻂ اﻟﺨﺎﻧﺔ اﳌﻀﻐﻮط ﻋﻠﻴﻬﺎ،
وﻟﺠﻌﻞ اﻟﺘﺤﺪﻳﺪ ﻳﺸﻤﻞ ﻛﻞ اﻟﺴﻄﺮ ﻗﻢ ﺑﺎﻟﺬﻫﺎب إﱃ ﻧﺎﻓﺬة اﻟﺨﺼﺎﺋﺺ وﻏري ﻗﻴﻤﺔ اﻟﺨﺼﻴﺼﺔ
SelectionModeﻣﻦ اﻟﻘﻴﻤﺔ اﻻﻓﱰاﺿﻴﺔ إﱃ اﻟﻘﻴﻤﺔ FullRowSelectﻛام ﺗﻮﺿﺢ اﻟﺼﻮرة أﺳﻔﻠﻪ:
80
ﻫﺬه اﳌﺮة ﺳﻴﺼﺒﺢ ﺗﺤﺪﻳﺪ اﻟﺴﻄﺮ ﻛﺎﻣﻼ :
ﻧﻌﻮد إﱃ اﻟﺴﺆال ،اﳌﻄﻠﻮب ﻣﻨﺎ ﻫﺬه اﳌﺮة ﻫﻮ ﺗﺤﺪﻳﺪ ﺑﻴﺎﻧﺎت اﻟﺴﻄﺮ اﳌﺤﺪد ﻋﲆ ﺧﺎﻧﺎت اﻟﻨﺺ ﻋﻨﺪ
اﻟﻀﻐﻂ ﻋﻠﻴﻪ ،اﻟﺤﺪث اﳌﻨﺎﺳﺐ ﻟﻬﺬه اﻟﺤﺎﻟﺔ ﻫﻮ Clickاﻟﺨﺎص ﺑﺎﻟﺪاﺗﺎﻏﺮﻳﺪﭬﻴﻮ ،ﺛﻢ ﻧﻜﺘﺐ اﻟﺸﻔﺮة
اﻟﺘﺎﻟﻴﺔ:
81
Private Sub DGV_Click(ByVal
DGV_Click( sender As Object, ByVal e As
System.EventArgs) Handles DGV.Click
Try
Me.TxtID.Text
.TxtID.Text = DGV.Rows(Pos).Cells(0).Value
Me.TxtFname.Text
.TxtFname.Text = DGV.Rows(Pos).Cells(1).Value
Me.TxtLname.Text
.TxtLname.Text = DGV.Rows(Pos).Cells(2).Value
Me.TextAge.Text
.TextAge.Text = DGV.Rows(Pos).Cells(3).Value
Me.TextAdress.Text
.TextAdress.Text = DGV.Rows(Pos).Cells(4).Value
Catch ex As Exception
Exit Sub
End Try
End Sub
ﺛﻢ أﻇﻬﺮﻧﺎ ﻗﻴﻤﺔ ﻛﻞ، ﻣﻦ أﺟﻞ ﺣﻔﻆ رﺗﺒﺔ اﻟﺴﻄﺮ اﳌﺤﺪدPos ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼن ﻋﻦ ﻣﺘﻐري رﻗﻤﻲ أﺳﻤﻴﻨﺎه
.ﺧﻠﻴﺔ ﻣﻨﻪ ﻋﲆ ﺧﺎﻧﺔ ﻧﺺ
82
ﺳﻨﺨﺘﺎر ﻣﻨﻬﺎ اﻟﺨﺎﺻﻴﺔ BackColorو ﻧﻐريﻫﺎ إﱃ اﻟﻠﻮن اﻟﺬي ﻧﺮﻳﺪ ،وﻫﺬه ﺻﻮرة ﻟﻠﻨﺘﻴﺠﺔ اﻟﺘﻲ ﺣﺼﻠﺖ
ﻋﻠﻴﻬﺎW
83
اﻟﺸﻔﺮة اﻟﺴﺎدﺳﺔ :ﻛﻴﻔﻴﺔ اﻟﺒﺤﺚ ﰲ ﺧﺎﻧﺔ ﻧﺺ TextBoxو إﻇﻬﺎر اﻟﻨﺘﺎﺋﺞ ﰲ
داﺗﺎﻏﺮﻳﺪﻓﻴﻮ
اﻟﺤﺪث اﳌﺮﺗﺒﻂ ﺑﺎﻟﺘﻴﻜﺴﺖ ﺑﻮﻛﺲ ،اﻟﺬي ﻳﺘﻮﻟﺪ ﻋﻨﺪ ﻋﻤﻠﻴﺔ اﻟﻜﺘﺎﺑﺔ ﻳﺴﻤﻰ .TextChanged
)(Dt.Clear
(Da = New SqlDataAdapter
DataAdapter("Select
"Select * From Student where
)First_Name like '%" & TextBox1.Text & "%'", Con
)Da.Fill(Dt
DataGridView1.DataSource = Dt
End Sub
اﻟﻜﻠﻤﺔ likeﺗﻌﻮض ﻋﻼﻣﺔ ﺗﺴﺎوي "=" ﻋﻨﺪﻣﺎ ﻧﺮﻳﺪ اﻟﺒﺤﺚ ﻋﻦ ﺑﻴﺎﻧﺎت ﻟﺴﻨﺎ ﻣﺘﺄﻛﺪﻳﻦ ﻣﻦ ﺗﻄﺎﺑﻘﻬﺎ ﻣﻊ
ﻛﻠﻤﺔ اﻟﺒﺤﺚ ،وﺗﺴﺘﻌﻤﻞ ﻛﻠﻤﺔ likeﻣﻊ رﻣﺰ اﻟﻨﺴﺒﺔ اﳌﺌﻮﻳﺔ " "%اﻟﺬي إذا وﺿﻌﻨﺎه ﰲ اﻷول ﻳﻌﻨﻲ :أن
اﳌﻬﻢ ﻣﻦ اﻟﺒﺤﺚ ﻫﻮ ﻣﺎ وراءه ،وإذا وﺿﻌﻨﺎه ﰲ اﻷﺧري ﻓﻴﻌﻨﻲ :أن اﳌﻬﻢ ﻣﻦ اﻟﺒﺤﺚ ﻫﻮ ﻣﺎ ﻗﺒﻠﻪ ،أﻣﺎ إذا
ﻗﻤﻨﺎ ﺑﻮﺿﻌﻪ ﰲ اﻟﺠﻬﺘني ﻣﻌﺎ ﻓﻴﻌﻨﻲ :أن اﳌﻬﻢ ﻫﻮ اﻟﺒﺤﺚ ﻋﻦ ﻛﻞ ﻛﻠﻤﺔ ﺗﺤﺘﻮي ﻋﲆ اﻟﺤﺮوف اﳌﺒﺤﻮث
ﻋﻨﻬﺎ ﻣﻬام ﻛﺎﻧﺖ اﻟﺒﺪاﻳﺔ أو اﻟﻨﻬﺎﻳﺔ.
84
ﻛﻴﻔﻴﺔ اﻟﺒﺤﺚ اﻟﻌﺎم )اﻟﺒﺤﺚ ﻋﻦ أي ﻛﻠﻤﺔ ﰲ اﻟﺠﺪول ﺗﺘﻮاﻓﻖ ﻧﺴﺒﻴﺎ:اﻟﺸﻔﺮة اﻟﺴﺎﺑﻌﺔ
(ﻣﻊ اﳌﺒﺤﻮث ﻋﻨﻪ
: اﻻﺧﺘﻼف ﺳﻴﻜﻮن ﻓﻘﻂ ﰲ اﻻﺳﺘﻌﻼم،ﺟﻮاب ﻫﺬا اﻟﺴﺆال ﻣﺜﻞ اﻟﺠﻮاب اﻟﺴﺎﺑﻖ
Private Sub TextBox1_TextChanged(ByVal
TextBox1_TextChanged( sender As
System.Object, ByVal e As System.EventArgs) Handles
TextBox1.TextChanged
Dt.Clear()
Da = New SqlDataAdapter(
DataAdapter("Select
"Select * From Student where
First_Name+Last_Name+Adress like '%" & TextBox1.Text & "%'",
Con)
Da.Fill(Dt)
DataGridView1.DataSource = Dt
End Sub
." ﻟﺠﻌﻞ اﻟﺒﺤﺚ ﻣﺘﻌﺪد وﻟﻴﺲ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ واﺣﺪ+" اﺳﺘﻌﻤﻠﻨﺎ ﻋﻤﻠﻴﺔ اﻟﺪﻣﺞ ﺑني اﻟﺤﻘﻮل ﺑﺎﻟﻌﻼﻣﺔ زاﺋﺪ
85
اﻟﺸﻔﺮة اﻟﺜﺎﻣﻨﺔ :ﻛﻴﻔﻴﺔ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻴﺎت اﻹﺿﺎﻓﺔ واﻟﺤﺬف واﻟﺘﻌﺪﻳﻞ ﻣﺒﺎﴍة ﻋﲆ
اﻟﺪاﺗﺎﻏﺮﻳﺪﻓﻴﻮ
وﻫﺬه ﻣﻦ أﺟﻤﻞ اﻟﺸﻔﺮات اﻟﺘﻲ ﺗﻠﺨﺺ ﻛﻞ اﻟﻌﻤﻠﻴﺎت اﻟﺘﻲ رأﻳﻨﺎﻫﺎ ﺳﺎﺑﻘﺎ ﰲ ﺳﻄﺮﻳﻦ ﻓﻘﻂ ،ﺳﻴﻜﻮن
اﻟﺘﻌﺪﻳﻞ واﻹﺿﺎﻓﺔ واﻟﺤﺬف ﻋﲆ اﻟﺪاﺗﺎﻏﺮﻳﺪﭬﻴﻮ ،وﻋﻨﺪ اﻻﻧﺘﻬﺎء ﻳﻘﻮم اﳌﺴﺘﺨﺪم ﺑﺎﻟﻀﻐﻂ ﻋﲆ زر
اﻟﺘﻔﻌﻴﻞ.
End Sub
86
ﺗﻢ وهلل اﻟﺤﻤﺪ
87
اﻟﻠﻬﻢ اﺟﻌﻞ أﻋامﻟﻨﺎ
ﺧﺎﻟﺼﺔ ﻟﻮﺟﻬﻚ اﻟﻜﺮﻳﻢ
88
اﻟﺨﺎمتﺔ:
ﻧﺮﺟﻮ ﻣﻦ ﷲ اﻟﻌﲇ اﻟﻘﺪﻳﺮ أن ﻧﻜﻮن ﻗﺪ وﻓﻘﻨﺎ ﰲ أداء اﳌﻬﻤﺔ ﻋﲆ أﺣﺴﻦ وﺟﻪ ،وﻧﺘﻤﻨﻰ أن ﻳﻜﻮن ﻫﺬا
اﻟﻌﻤﻞ اﳌﺘﻮاﺿﻊ ﻗﺪ أﺿﺎف إﻟﻴﻚ ﻳﺎ أﺧﻲ اﻟﻜﺮﻳﻢ وﻳﺎ أﺧﺘﻲ اﻟﻜﺮميﺔ ﺷﻴﺌﺎ ﻣﻦ اﳌﻌﻠﻮﻣﺎت ،وﻻ ﺗﻨﺴﻮا أﻧﻬﺎ
اﻟﺨﻄﻰ اﻷوﱃ وﻣﺎ زال ﻟﻨﺎ ﻣﻌﻜﻢ إن ﺷﺎء ﷲ ﺧﻄﻮات ،وﰲ ﻛﻞ ﺧﻄﻮة ﺳﻨﺤﺎول أن ﻧﺮﻓﻊ ﻣﻦ
ﻣﺴﺘﻮﻳﺎﺗﻨﺎ.
ﰲ اﻟﺨﻄﻮة اﻟﻘﺎدﻣﺔ إن ﺷﺎء ﷲ ﺳﻮف ﻧﺘﻌﺮف ﻋﲆ ﻛﻴﻔﻴﺔ اﻟﺮﺑﻂ ﺑني اﻟﻔﻴﺠﻮال اﺳﺘﻮدﻳﻮ و SQL
Serverﺑﻮاﺳﻄﺔ اﻹﺟﺮاءات اﳌﺨﺰﻧﺔ ،Stored Proceduresﻣﻊ ﻛﻴﻔﻴﺔ إﻧﺸﺎء اﻟﺘﻘﺎرﻳﺮ ﻋﻦ ﻃﺮﻳﻖ
Crystal Report
ﰲ اﻧﺘﻈﺎر اﻟﺨﻄﻮة اﻟﺜﺎﻟﺜﺔ ﻣﻦ ﻫﺬه اﻟﺴﻠﺴﻠﺔ اﻟﻀﻤﻨﻴﺔ "ﺧﻄﻮة إﱃ اﻷﻣﺎم" اﻟﺘﺎﺑﻌﺔ ﻟﺴﻠﺴﺔ "ﻛﻦ أﺳﺪا"،
ﺗﻘﺒﻠﻮا ﻣﻨﺎ أزىك اﻟﺸﻜﺮ ،وﻻ ﺗﻨﺴﻮﻧﺎ وواﻟﺪﻳﻨﺎ وﻛﻞ اﳌﺴﻠﻤني ﻣﻦ ﺻﺎﻟﺢ دﻋﺎﺋﻜﻢ ،ﻛام ﻻ ﺗﻨﺴﻮﻧﺎ ﻣﻦ
اﻧﺘﻘﺎداﺗﻜﻢ وﺗﺴﺎؤﻻﺗﻜﻢ ،وﺳﻨﺴﻌﻰ ﻗﺪر اﳌﺴﺘﻄﺎع إﱃ إﺟﺎﺑﺘﻜﻢ واﻷﺧﺬ ﺑﻨﺼﺎﺋﺤﻜﻢ ،وﻟﻠﻤﺮاﺳﻠﺔ ﻫﺬا
Khalid_ESSAADANI@Hotmail.fr ﻋﻨﻮاﻧﻨﺎ اﻹﻟﻜﱰوين:
0673-07-51-05
89