Vous êtes sur la page 1sur 89

  

‫ ‬

‫رﺑﻂ ‪SQL Server‬‬


‫ﻣﻊ اﻟﻔﻴﺠﻮال ﺑﺴﻴﻚ دوت ﻧﻴﺖ‬
‫ﻣﻦ اﻟﺼﻔﺮ‬
‫ﻣﻦ إﻋﺪاد ‪ :‬ﺧﺎﻟﺪ اﻟﺴﻌﺪاين‬

‫‪2‬‬
‫ﺑﺴﻢ ﷲ اﻟﺮﺣامن اﻟﺮﺣﻴﻢ‬
‫ﺑﺴﻢ ﷲ واﻟﺼﻼة واﻟﺴﻼم ﻋﲆ رﺳﻮل ﷲ‪ ،‬وﻋﲆ آﻟﻪ وﺻﺤﺒﻪ وﻣﻦ واﻻه وﺑﻌﺪ‪،‬‬

‫ﻓﺈن ﻫﺬه اﻟﺼﻔﺤﺎت اﳌﻌﺮوﺿﺔ ﺑني ﻳﺪﻳﻚ أﺧﻲ اﻟﻜﺮﻳﻢ ‪ /‬أﺧﺘﻲ اﻟﻜﺮميﺔ‪ ،‬ﺗﻢ إﺻﺪارﻫﺎ ﻗﺒﻞ ﺳﻨﺘني ﺿﻤﻦ‬
‫ﺳﻠﺴﻠﺔ ﺧﻄﻮة إﱃ اﻷﻣﺎم اﻟﺘﻲ ﻛﻨﺎ ﻗﺪ اﻋﺘﺰﻣﻨﺎ ﻋﲆ إﻳﺼﺎﻟﻬﺎ إﱃ ﻋﴩ ﺧﻄﻮات‪ ،‬ﻟﻜﻨﻨﺎ ﺗﻮﻗﻔﻨﺎ ﻋﻨﺪ اﻟﺨﻄﻮة‬
‫اﻟﺜﺎﻧﻴﺔ ومل ﻧﻜﻤﻞ ﺑﻌﺪﻫﺎ ﻷﻧﻨﺎ اﻧﺸﻐﻠﻨﺎ ﺑﺎﻟﻜﺘﺎﺑﺔ ﰲ ﻣﺴﺎﺋﻞ أﺧﺮى‪ ،‬ﻓﻘﺪر ﷲ ﺑﻌﺪ ﻣﺪة أن أﻓﺘﺢ ﻫﺬا اﳌﻠﻒ‬
‫ﻷﻋﺪﻟﻪ وأﻧﻘﺤﻪ ﰲ ﻧﺴﺨﺔ ﺟﺪﻳﺪة ﻟﻴﻠﺒﻲ ﺣﺎﺟﺔ اﳌﺘﻌﻠﻤني‪ ،‬ﻷن اﻟﻨﺴﺨﺔ اﻟﺴﺎﺑﻘﺔ ﻛﺎﻧﺖ ﺗﻌﺮض ﺻﻮر‬
‫اﻟﱪاﻣﺞ اﳌﺴﺘﻌﻤﻠﺔ ﺑﺎﻟﻠﻐﺔ اﻟﻔﺮﻧﺴﻴﺔ‪ ،‬واﻷﺻﻞ أن ﻫﺬه اﻟﻠﻐﺔ ﻟﻴﺴﺖ ﻣﺘﺪاوﻟﺔ ﰲ ﺑﺎﻗﻲ اﻷﻗﻄﺎر اﻟﻌﺮﺑﻴﺔ‬
‫ﺑﺎﺳﺘﺜﻨﺎء ﺑﻠﺪان اﳌﻐﺮب اﻟﻌﺮيب ﻟﺬﻟﻚ ﻛﺎن ﻣﻦ اﻟﺠﻴﺪ اﺳﺘﺒﺪال اﻟﺼﻮر اﻟﻔﺮﻧﺴﻴﺔ ﺑﺼﻮر إﻧﺠﻠﻴﺰﻳﺔ ﻷن ذﻟﻚ‬
‫أوﺿﺢ وأﺑﻠﻎ‪.‬‬

‫ﺑﺎﻹﺿﺎﻓﺔ إﱃ ﺗﻨﺴﻴﻖ اﻷﻛﻮاد‪ ،‬ﻓﻘﺪ ﻗﻤﻨﺎ ﺑﺈﻟﻐﺎء اﻟﺨﻠﻔﻴﺔ اﻟﺘﻲ ﻛﻨﺎ ﻧﻀﻌﻬﺎ ﺧﻠﻒ اﻷﻛﻮاد‪ ،‬وﻗﻤﻨﺎ ﺑﺘﻜﺒري ﺣﺠﻢ‬
‫ﺧﻂ اﻟﻜﻮد ﻟﻴﻜﻮن واﺿﺤﺎ وﻗﺎﺑﻼ ﻟﻠﻨﺴﺦ ﺑﺴﻬﻮﻟﺔ‪.‬‬

‫ﻫﺬا وإن ﻣﻮﺿﻮع ﻫﺬا اﻟﻜﺘﺎب ﻫﻮ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﰲ اﻟﻔﻴﺠﻮال ﺑﺴﻴﻚ دوت ﻧﻴﺖ‪ ،‬ﺑﺤﻴﺚ ﻳﻌﺮض اﻟﻔﺼﻞ‬
‫اﻷول ﻃﺮﻳﻘﺔ إﻧﺸﺎء ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت واﻟﺠﺪاول واﻟﻌﻼﻗﺎت ﰲ ‪ ،Microsoft SQL Server‬ﻣﻮﺿﺤﺎ اﻟﻔﺮق‬
‫ﺑني أﻧﻮاع اﻟﻌﻼﻗﺎت اﳌﻤﻜﻦ إﻧﺸﺎؤﻫﺎ ﺑني اﻟﺠﺪاول‪.‬‬

‫ﺑﻴﻨام ﻳﻌﺮض اﻟﻔﺼﻞ اﻟﺜﺎين ﻣﺨﺘﴫا ﻟﻠﻐﺔ اﻻﺳﺘﻌﻼم ﻋﻦ اﻟﺒﻴﺎﻧﺎت اﳌﺸﻬﻮرة ‪ ،SQL‬ﺛﻢ ﻧﺒﺪأ رﺣﻠﺘﻨﺎ اﻟﻌﻤﻠﻴﺔ‬
‫ﻋﱪ ﻋﻤﻠﻴﺎت اﻟﺮﺑﻂ ﺑني اﻟﱪﻧﺎﻣﺞ وﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‪ ،‬ﺑﺎﻹﺿﺎﻓﺔ إﱃ أواﻣﺮ اﻹﺿﺎﻓﺔ واﻟﺘﻌﺪﻳﻞ واﻟﺤﺬف‬
‫واﻟﺒﺤﺚ واﻟﺘﻨﻘﻞ ﺑني اﻟﺒﻴﺎﻧﺎت ﺑﻄﺮﻳﻘﺘني ﻣﺨﺘﻠﻔﺘني‪.‬‬
‫‪3‬‬
‫ﰲ ﺣني ﻳﺒﻘﻰ اﻟﻔﺼﻞ اﻷﺧري ﻣﺠﺮد ﻣﻠﺤﻖ‪ ،‬ﳌﻦ ﻳﺮﻳﺪ اﻟﺘﻌﺮف ﻋﲆ ﻛﻴﻔﻴﺔ إﻧﺠﺎز ﺑﻌﺾ اﳌﻬﺎم ﺑﺮﻣﺠﻴﺎ‪ ،‬وﻗﻤﻨﺎ‬
‫ﺑﺈدراج ﻛﻮد ﻛﻞ ﻣﺸﻜﻠﺔ ﻣﺮدﻓﻴﻪ ﺑﴩح ﻣﻮﺟﺰ‪.‬‬

‫وﺗﺠﺪر اﻹﺷﺎرة إﱃ أﻧﻪ ﻳﻮﺟﺪ ﻛﺘﺎب آﺧﺮ ﻣامﺛﻞ ﻟﻬﺬا اﻟﻜﺘﺎب اﳌﻮﺟﻮد ﺑني ﻳﺪﻳﻚ‪ ،‬وﻫﻮ ﻳﻌﺮض ﻧﻔﺲ‬
‫اﻷﻣﺜﻠﺔ اﳌﺪروﺳﺔ ﻟﻜﻦ ﻣﻊ ﻗﺎﻋﺪة ﺑﻴﺎﻧﺎت ﻣﻦ ﻧﻮع ‪ ،Microsoft Access‬وﻫﻮ ﻳﺤﻤﻞ ﻧﻔﺲ اﺳﻢ اﻟﻜﺘﺎب‬
‫وﻣﺘﺎح ﻟﻠﺘﺤﻤﻴﻞ ﻋﲆ أﻛﺎدميﻴﺔ اﳌﱪﻣﺠني اﻟﻌﺮب‪.‬‬

‫ﻫﺬا وﻧﺴﺄل ﷲ ﻋﺰ وﺟﻞ اﻹﺧﻼص واﻟﺼﺪق واﻟﺘﻮﻓﻴﻖ واﻟﺴﺪاد ﻟﻨﺎ وﻟﺴﺎﺋﺮ اﳌﺴﻠﻤني‪ ،‬وأن ﻳﺠﻌﻞ ﻫﺬا‬
‫اﻟﻌﻤﻞ اﳌﺘﻮاﺿﻊ ﺧﺎﻟﺼﺎ ﻟﻮﺟﻬﻪ اﻟﻜﺮﻳﻢ‪ ،‬وأن ﻻ ﻳﺠﻌﻞ ﻟﻠﻨﻔﺲ ﻓﻴﻪ ﺣﻈﺎ‪.‬‬

‫ﺧﺎﻟﺪ اﻟﺴﻌﺪاين ‪27/10/2013‬‬

‫"ﻳﺎ أﻳﻬﺎ اﻟﺬﻳﻦ آﻣﻨﻮا اﺗﻘﻮا ﷲ و ﻗﻮﻟﻮا ﻗﻮﻻ ﺳﺪﻳﺪا‪.‬‬


‫ﻳﺼﻠﺢ ﻟﻜﻢ أﻋامﻟﻜﻢ و ﻳﻐﻔﺮ ﻟﻜﻢ ذﻧﻮﺑﻜﻢ وﻣﻦ ﻳﻄﻊ‬
‫ﷲ و رﺳﻮﻟﻪ ﻓﻘﺪ ﻓﺎز ﻓﻮزا ﻋﻈﻴام"‬
‫اﻷﺣﺰاب ‪ 70 :‬و ‪71‬‬

‫ ‬
‫‪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‬‬

‫ﺑﻌﺪ ﻓﺘﺢ ﺑﺮﻧﺎﻣﺞ ‪ SSMSE‬ﺳﺘﻈﻬﺮ ﻟﻨﺎ اﻟﺸﺎﺷﺔ اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪10‬‬
‫ ‬
‫ ‬

‫ﻗﻢ ﺑﺎﻟﻮﻟﻮج إﱃ اﻟﱪﻧﺎﻣﺞ ﺑﺎﻟﻀﻐﻂ ﻋﲆ اﻟﺰر ‪ ،Connect‬ﺳﺘﻈﻬﺮ ﻟﻚ اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪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‬‬
‫ ‬
‫ﻛام ﺗﻼﺣﻆ ﻓﺠﺪول اﳌﻮاد اﻟﺘﺪرﻳﺴﻴﺔ ﻳﺤﺘﻮي ﻓﻘﻂ ﻋﲆ رﻗﻢ اﳌﺎدة واﺳﻤﻬﺎ‪.‬‬

‫ﻧﻘﻮم ﺑﺤﻔﻆ اﻟﺠﺪول ﺑﺎﺳﻢ ‪.Courses‬‬

‫اﻵن ﺳﻨﻨﺸﺊ ﺟﺪول اﻟﻨﻘﻂ ‪ Marks‬وﺣﻘﻮﻟﻪ ﻛام ﻳﲇ‪:‬‬

‫ ‬
‫‪16‬‬
‫ﺑﺎﻟﻄﺒﻊ ﻟﺤﻔﻆ ﻧﻘﻄﺔ ﻣﻌﻴﻨﺔ‪ ،‬ﺳﻨﺤﺘﺎج إﱃ اﺳﻢ اﻟﻄﺎﻟﺐ ﺻﺎﺣﺐ اﻟﻨﻘﻄﺔ‪ ،‬وﻛﺬﻟﻚ إﱃ اﳌﺎدة اﻟﺘﻲ ﺣﺼﻞ‬
‫ﻓﻴﻬﺎ ﻋﲆ ﻫﺬه اﻟﻨﻘﻄﺔ‪ ،‬ﻗﻢ ﺑﺘﺤﺪﻳﺪ اﳌﻔﺘﺎح اﻷﺳﺎﳼ وأﺣﻔﻆ اﻟﺠﺪول ﺑﺎﺳﻢ ‪.Marks‬‬

‫ﻫﺬه ﻫﻲ اﻟﺠﺪاول اﻟﺘﻲ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﻬﺎ‪:‬‬

‫اﻟﻌﻼﻗﺎت ﺑني اﻟﺠﺪاول‪:‬‬

‫ميﻜﻦ ﻟﺠﺪوﻟني أن ﻳﺮﺗﺒﻄﺎ ﻣﻌﺎ‪ ،‬ﻋﻦ ﻃﺮﻳﻖ ﺣﻘﻞ ﻣﺸﱰك ﺑﻴﻨﻬام‪ ،‬وميﻜﻦ ﻟﻬﺬا اﻟﱰاﺑﻂ ﺑني اﻟﺠﺪوﻟني أن ﻳﻜﻮن ‪:‬‬

‫‪One to Many / 1 à N‬‬


‫‪One to One / 1 à 1‬‬
‫ ‬
‫‪Many to Many / N à M‬‬

‫‪17‬‬
‫ﻋﻼﻗﺔ واﺣﺪ ﻷﻛرث )‪(One to Many / 1 à N‬‬
‫ﻧﺴﺘﻌﻤﻞ ﻫﺬه اﻟﻌﻼﻗﺔ ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻋﻨﴫ واﺣﺪ ﻣﺘﻔﺮد ﻣﻦ ﺟﺪول ﻣﻌني ﻣﺮﺗﺒﻄﺎ مبﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻌﻨﺎﴏ‬
‫ﰲ اﻟﺠﺪول اﻵﺧﺮ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ ﺣﺎﴐ ﰲ اﻟﺠﺪوﻟني ﻣﻌﺎ‪ ، .‬وﻛﻤﺜﺎل ﻋﲆ ذﻟﻚ ﻧﻔﱰض أن ﻟﺪﻳﻨﺎ ﺟﺪول "‬
‫اﻟﺴ ﱠﻴﺎح" و ﺟﺪول " اﻹﻗﺎﻣﺔ ﰲ ﻓﻨﺪق"‪.‬‬
‫ﱡ‬

‫ﻣﻦ اﳌﻌﻠﻮم أن ﺳﺎﺋﺤﺎ ميﻜﻦ أن ﻳﺤﺠﺰ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻹﻗﺎﻣﺎت‪ ،‬ﺑﺤﻴﺚ ﻧﺠﺪ أن ﻛﻞ إﻗﺎﻣﺔ ﺣﺠﺰﻫﺎ ﻫﺬا‬
‫اﻟﺴﺎﺋﺢ ﺗﺤﺘﻮي ﻋﲆ اﻟﺮﻗﻢ اﻟﺨﺎص ﺑﻪ‪ ،‬مبﻌﻨﻰ آﺧﺮ ﻟﻮ أردﻧﺎ اﻹﻃﻼع ﻋﲆ ﻛﻞ اﻹﻗﺎﻣﺎت اﻟﺘﻲ ﻗﺎم ﺑﻬﺎ اﻟﺴﺎﺋﺢ‬
‫اﻟﻔﻼين‪ ،‬ﻳﻜﻔﻲ أن ﻧﺒﺤﺚ داﺧﻞ ﺟﺪول اﻹﻗﺎﻣﺎت ﻋﻦ اﳌﺮات اﻟﺘﻲ ﺗﻜﺮر ﻓﻴﻬﺎ رﻗﻤﻪ‪.‬‬

‫ﺗﺬﻛﺮ ﺟﻴﺪا‪:‬‬

‫ ﻧﺴﺘﻌﻤﻞ ﻫﺬه اﻟﻌﻼﻗﺔ ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻋﻨﴫ واﺣﺪ ﻣﺘﻔﺮد ﻣﻦ ﺟﺪول ﻣﻌني ﻣﺮﺗﺒﻄﺎ مبﺠﻤﻮﻋﺔ ﻣﻦ‬
‫ اﻟﻌﻨﺎﴏ ﰲ اﻟﺠﺪول اﻵﺧﺮ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ ﺣﺎﴐ ﰲ اﻟﺠﺪوﻟني ﻣﻌﺎ‪.‬‬

‫ﻋﻼﻗﺔ واﺣﺪ ﻟﻮاﺣﺪ )‪(One to One / 1 à 1‬‬


‫وﻫﺬه اﻟﺤﺎﻟﺔ اﺳﺘﺜﻨﺎﺋﻴﺔ‪ ،‬وﻧﺎدرا ﻣﺎ ﻧﺼﺎدﻓﻬﺎ ﰲ ﺗﺤﻠﻴﻠﻨﺎ ﻟﻨﻈﺎم ﻣﺎ‪ ،‬وﺗﺘﻤﺜﻞ ﻫﺬه اﻟﻌﻼﻗﺔ ﰲ ﻛﻮن ﻋﻨﴫ‬
‫ﻣﺘﻔﺮد واﺣﺪ ﻣﻦ أﺣﺪ اﻟﺠﺪوﻟني ﻣﺮﺗﺒﻂ ﺑﻌﻨﴫ ﻣﺘﻔﺮد واﺣﺪ ﻣﻦ اﻟﺠﺪول اﻵﺧﺮ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ ﻳﻮﺟﺪ ﰲ‬
‫اﻟﺠﺪوﻟني ﻣﻌﺎ‪.‬‬

‫‪18‬‬
‫وﻛﻤﺜﺎل ﻋﲆ ذﻟﻚ ﻧﺬﻛﺮ ﺟﺪوﱄ "ﴍاء ﺳﻠﻌﺔ" و "ﻓﺎﺗﻮرة اﻟﴩاء"‪ ،‬ﺑﺤﻴﺚ ﻧﺠﺪ أن ﻋﻤﻠﻴﺔ ﴍاء واﺣﺪة ﻟﻬﺎ‬
‫ﻓﺎﺗﻮرة واﺣﺪة ﺧﺎﺻﺔ ﺑﻬﺎ‪ ،‬واﻟﻌﻜﺲ ﺻﺤﻴﺢ إذ ﻻ ميﻜﻦ ﻟﻔﺎﺗﻮرة واﺣﺪة ﻟﻬﺎ رﻗﻤﻬﺎ اﻟﺨﺎص أن ﺗﺼﺤﺐ أﻛرث‬
‫ﻣﻦ ﻋﻤﻠﻴﺔ ﴍاء‪.‬‬

‫ﺗﺬﻛﺮ ﺟﻴﺪا‪:‬‬

‫ﻋﻨﴫ ﻣﺘﻔﺮد واﺣﺪ ﻣﻦ أﺣﺪ اﻟﺠﺪوﻟني ﻣﺮﺗﺒﻂ ﺑﻌﻨﴫ ﻣﺘﻔﺮد واﺣﺪ ﻣﻦ اﻟﺠﺪول اﻵﺧﺮ ﺑﻮاﺳﻄﺔ ﺣﻘﻞ‬
‫ ‬
‫ﻳﻮﺟﺪ ﰲ اﻟﺠﺪوﻟني ﻣﻌﺎ‪.‬‬
‫ ‬

‫ﻋﻼﻗﺔ أﻛرث ﻷﻛرث )‪(Many to Many / N à M‬‬


‫وﻫﺬه اﻟﻌﻼﻗﺔ ﻫﻲ اﻷﻛرث ﺗﺮددا وﺷﻴﻮﻋﺎ‪ ،‬وﻛﻤﺜﺎل ﻟﻬﺎ اﻟﺠﺪاول اﻟﺘﻲ ﺗﺤﺪﺛﻨﺎ ﻋﻨﻬﺎ ﰲ أول اﻟﺪرس‪ ،‬إذ أن‬
‫اﻟﻌﻼﻗﺔ ﺑني اﻟﻄﻼب واﳌﻮاد اﻟﺘﺪرﻳﺴﻴﺔ ﻫﻲ ﻋﻼﻗﺔ ﻣﺘﻌﺪدة‪ ،‬ﺑﺤﻴﺚ ميﻜﻦ ﻟﻠﻄﺎﻟﺐ اﻟﻮاﺣﺪ أن ﻳَ ْﺪ ُر َس‬
‫ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﳌﻮاد‪ ،‬وميﻜﻦ ﻟﻠامدة اﻟﻮاﺣﺪة أن ﻳَ ْﺪ ُر َﺳ َﻬﺎ اﻟﻌﺪﻳﺪ ﻣﻦ اﻟﻄﻼب‪.‬‬

‫ﰲ ﻫﺬه اﻟﺤﺎﻟﺔ ﻳﺠﺐ أن ﻳﻜﻮن ﻟﺠﺪول اﻟﻄﻼب ﺣﻘﻞ أﺳﺎﳼ )‪ ،(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‬ﺳﺘﻼﺣﻆ ﺑﺄﻧﻪ ﺗﻢ رﺑﻂ اﻟﺠﺪوﻟني ﻋﱪ ﺧﻂ ﻳﺤﺘﻮي أﺣﺪ ﻃﺮﻓﻴﻪ ﻣﻔﺘﺎﺣﺎ دﻻﻟﺔ ﻋﲆ‬
‫اﻟﺠﺪول اﻟﺮﺋﻴﴘ‪ ،‬واﻟﻄﺮف اﻟﺜﺎين ﻳﺤﺘﻮي ﻋﲆ رﻣﺰ ﻣﺎﻻ ﻧﻬﺎﻳﺔ دﻻﻟﺔ ﻋﲆ اﻟﺠﺪول اﻟﺬي ﻳﺤﺘﻮي ﻋﲆ اﻟﺤﻘﻞ‬
‫اﻟﺨﺎرﺟﻲ اﻟﻘﺎدم ﻣﻦ اﻟﺠﺪول اﻟﺮﺋﻴﴘ‪ ،‬ﻣﻌﻨﻰ ﻫﺬا اﻟﻜﻼم أن ﻛﻞ ﻣﺎدة ﻣﻤﻜﻦ أن ﺗﺮﺗﺒﻂ ﺑﻨﻘﻄﺔ أو أﻛرث ‪:‬‬

‫اﻵن ﻧﻘﻮم ﺑﻨﻔﺲ اﻟﴚء ﻣﻊ اﻟﺠﺪول ‪ ، Student‬ﻧﻀﻐﻂ ﻋﲆ اﳌﻔﺘﺎح اﻷﺳﺎﳼ ‪ ID_Student‬وﻧﻘﻮم‬


‫ﺑﺠﺮه إﱃ ﻣﺜﻴﻠﻪ ﰲ اﻟﺠﺪول ‪.Marks‬‬

‫ﻟﻴﺼﺒﺢ اﻟﺸﻜﻞ اﻟﻨﻬﺎيئ ﻟﻠﻌﻼﻗﺎت ﺑني اﻟﺠﺪاول ﻛام ﻳﲇ‪:‬‬

‫ ‬

‫‪ ،‬أو ﺑﺎﻟﻀﻐﻂ ﻋﲆ ‪ ،Ctrl+S‬ﻣﻊ ﺗﺤﺪﻳﺪ اﺳﻢ ﻟﻞ‬ ‫ﻧﻘﻮم ﺑﺤﻔﻆ اﻟﻌﻼﻗﺎت ﺑﺎﻟﻀﻐﻂ ﻋﲆ أﻳﻘﻮﻧﺔ اﻟﺤﻔﻆ‬
‫‪.Diagram‬‬

‫‪25‬‬
‫اﻵن مل ﻳﺘﺒﻖ ﻟﻨﺎ ﺳﻮى ﻣﻞء اﻟﺠﺪاول ﺑﻘﻴﻢ أوﻟﻴﺔ‪ ،‬وﻟﻔﻌﻞ ذﻟﻚ ﻧﻀﻐﻂ ﻋﲆ ﺟﺪول اﻟﻄﻠﺒﺔ ﺑﻴﻤني اﻟﻔﺄرة‪،‬‬
‫وﻧﺨﺘﺎر اﻷﻣﺮ "ﻓﺘﺢ‪ ،‬ﺑﺎﻟﻔﺮﻧﺴﻴﺔ ‪ ،Ouvrir‬وﺑﺎﻹﻧﺠﻠﻴﺰﻳﺔ ‪"Open‬‬

‫ ‬
‫ﻟﺘﻈﻬﺮ ﻟﻨﺎ ﺑﻌﺪ ذﻟﻚ اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫ ‬
‫ﻧﻘﻮم ﺑﺘﻌﺒﺌﺔ اﻟﺠﺪول ﺑﺒﻴﺎﻧﺎت اﻋﺘﺒﺎﻃﻴﺔ‪ ،‬ﻣﺜﻼ‪:‬‬

‫‪26‬‬
‫ ‬
‫ﻧﻘﻮم ﺑﻨﻔﺲ اﻟﴚء ﺑﺎﻟﻨﺴﺒﺔ ﻟﺠﺪول اﳌﻮاد ‪:Courses‬‬

‫ ‬
‫ ‬

‫‪27‬‬
‫اﻟﺠﺰء اﻟﺜﺎين‪:‬‬

‫رﺑﻂ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻣﻊ اﻟﻔﻴﺠﻮال‬

‫اﺳﺘﻮدﻳﻮ‬

‫‪28‬‬
‫ﻋﻤﻮﻣﻴﺎت ﺣﻮل ‪ADO.Net‬‬
‫ﻛام ﻋﻮدﻧﺎﻛﻢ ﻓﻠﻦ ﻧﺮﻛﺰ ﻛﺜريا ﻋﲆ ﻣﺎﻫﻮ ﻧﻈﺮي‪ ،‬وإمنﺎ ﺳﻨﻜﺘﻔﻲ ﻓﻘﻂ مبﺎ ﺗﺴﺘﻠﺰﻣﻪ اﻟﴬورة‪ ،‬ﻟﻬﺬا ﺳﻨﻌﺮض‬
‫ﻫﻨﺎ ﺑﻌﺾ اﻟﺘﻌﺎرﻳﻒ واﳌﻌﻠﻮﻣﺎت اﻟﻨﻈﺮﻳﺔ اﳌﺨﺘﴫة ﻋﻦ ‪ADO.Net‬‬

‫ﰲ اﻟﻔﻴﺠﻮال ﺑﺴﻴﻚ ‪ ،6‬ﺣﺘﻰ ﻳﺘﺴﻨﻰ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﻧﺴﺘﻌﻤﻞ ‪ ADO‬و ‪ ،DAO‬وﻟﻜﻦ ﰲ‬
‫‪Activex Data Object‬‬
‫اﻟﻔﻴﺠﻮال ﺑﺰﻳﻚ‪.‬ﻧﻴﺖ‪ ،‬ﻧﺴﺘﻌﻤﻞ ‪ ADO.Net‬وﻫﻲ اﺧﺘﺼﺎر ل ‪bject .Net‬‬

‫وﻫﻲ ﻣﻦ ﺑني اﻟﺘﻘﻨﻴﺎت اﻟﺠﺪﻳﺪة واﻟﻔﻌﺎﻟﺔ ﻟﻠﺘﻮاﺻﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت‪ ،‬ﻷﻧﻬﺎ ﺗﺘﻴﺢ ﻟﻨﺎ اﻻﺷﺘﻐﺎل ﻣﻊ‬
‫ﻣﺨﺘﻠﻒ أﻧﻮاع ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﺑﻄﺮﻳﻘﺔ ﻣﺘﺸﺎﺑﻬﺔ ﻣﻊ ﺗﻐﻴري ﻃﻔﻴﻒ ﻋﲆ ﻣﺴﺘﻮى اﻟﺸﻔﺮة‪.‬‬

‫و ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ أي ﻣﺼﺪر ﺑﻴﺎﻧﺎت‪ ،‬ﻳﻠﺰﻣﻨﺎ إﻗﺤﺎم ﻣﺠﺎل اﻷﺳامء اﻟﺨﺎص ﺑﻪ‪ ،‬وﺳﻨﻌﺮض ﰲ اﻟﺠﺪول اﻟﺘﺎﱄ‬
‫ﺑﻌﺾ ﻣﺼﺎدر اﻟﺒﻴﺎﻧﺎت اﻟﺮﺋﻴﺴﻴﺔ وأﻣﺎﻣﻬﺎ ﻣﺠﺎل اﻷﺳامء اﻟﺨﺎص ﺑﻬﺎ‪:‬‬

‫ﻣﺼﺪر اﻟﺒﻴﺎﻧﺎت‬ ‫ﻣﺠﺎل اﻷﺳامء‬

‫ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت اﻟﺨﺎﺻﺔ ب‬


‫‪System.Data.SqlClient‬‬
‫‪Microsoft SQL Server‬‬

‫ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت اﻟﺨﺎﺻﺔ ب‬


‫‪System.‬‬
‫‪System.Data.OleDb‬‬
‫‪Microsoft ACCESS‬‬

‫ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت اﻟﺨﺎﺻﺔ ب ‪ORACLE‬‬ ‫‪System.Data.OracleClient‬‬

‫‪29‬‬
‫ﻛام ﺗﻌﻠﻢ ـ ﻋﺰﻳﺰي اﻟﻘﺎرئ ـ ﻓﻜﻞ ﻣﺠﺎل أﺳامء ﻳﻀﻢ ﻓﺌﺎت ﻣﻨﻀﻮﻳﺔ ﺗﺤﺘﻪ‪ ،‬ﻓﻜﺬﻟﻚ ﺑﺎﻟﻨﺴﺒﺔ ﳌﺠﺎﻻت‬
‫اﻷﺳامء اﻟﺨﺎﺻﺔ ب ‪ ،ADO.Net‬ﻓﻬﻲ ﺗﻀﻢ ﻛﺎﺋﻨﺎت ﻟﻜﻞ ﻣﻨﻬﺎ دوره اﻟﺨﺎص‪ ،‬وﻫﻲ ﻣﻮﺣﺪة ﺑﺎﻟﻨﺴﺒﺔ ﻟﻜﻞ‬
‫ﻣﺼﺎدر اﻟﺒﻴﺎﻧﺎت أي أن ﻧﻔﺲ اﻟﻜﺎﺋﻨﺎت ﺳﻨﺤﺘﺎﺟﻬﺎ ﻣﻬام ﻛﺎن ﻧﻮع ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻓﻘﻂ ﻣﻊ ﺗﻐﻴري ﺑﺴﻴﻂ‬
‫ﰲ اﺳﻢ اﻟﻜﺎﺋﻦ‪.‬‬

‫اﻟﻜﺎﺋﻨﺎت اﻷﺳﺎﺳﻴﺔ اﻟﺨﺎﺻﺔ ب ‪ 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‬ﻣﻦ ﻧﺒﻌﻬﺎ اﻟﺼﺎﰲ" ميﻜﻨﻚ ﺗﺤﻤﻴﻠﻪ ﻣﻦ أﻛﺎدميﻴﺔ اﳌﱪﻣﺠني اﻟﻌﺮب أو‬
‫اﻟﺒﺤﺚ ﻋﻨﻪ ﰲ ﻣﺤﺮﻛﺎت اﻟﺒﺤﺚ ﻷﻧﻪ ﻣﻨﺘﴩ ﺑﻜرثة وهلل اﻟﺤﻤﺪ‪.‬‬

‫ﻹﺿﺎﻓﺔ ﻋﻨﴫ ﺟﺪﻳﺪ إﱃ ﺟﺪول‪ ،‬ﻓﺼﻴﻐﺔ اﻹﺿﺎﻓﺔ ﺗﻜﻮن ﻛام ﻳﲇ‪:‬‬

‫)¨‪Insert into Table1 (Field1,Field2) values (¨Value1¨,¨Value2‬‬

‫‪$‬ل‪ W‬‬

‫إذا أردﻧﺎ أن ﻧﻀﻴﻒ ﻣﻌﻠﻮﻣﺎت ﻃﺎﻟﺐ ﺟﺪﻳﺪ ﻓﺴﻴﻜﻮن اﻻﺳﺘﻌﻼم ﻛام ﻳﲇ‪:‬‬
‫‪Insert into Student (ID_Student,First_Name,Last_Name,Age,Adress) values (¨1¨,¨Khalid¨,¨ESSAADANI¨,22,‬‬
‫)¨‪¨Fkih Ben Salah‬‬ ‫ ‬

‫ﻟﺤﺬف ﻋﻨﴫ ﻣﻦ ﺟﺪول‪ ،‬ﻓﺎﻟﺼﻴﻐﺔ ﻛام ﻳﲇ‪:‬‬

‫"‪Delete * From Table1 Where Field1="Value1‬‬

‫وﻳﻌﻨﻲ ﻫﺬا اﻻﺳﺘﻌﻼم‪ :‬ﻗﻢ ﺑﺤﺬف ﻛﻞ اﻷﺳﻄﺮ اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﲆ اﻟﺤﻘﻞ ‪ Field1‬ذو اﻟﻘﻴﻤﺔ ‪، Value1‬‬
‫اﻟﻨﺠﻤﺔ * ﺗﻌﻨﻲ "ﺟﻤﻴﻊ"‪.‬‬
‫‪32‬‬
‫ﻣﺜﺎل‪:‬‬

‫ﺳﻨﻘﻮم ﺑﺤﺬف ﻛﻞ اﻟﻄﻠﺒﺔ اﻟﺬﻳﻦ ﻳﻔﻮق ﻋﻤﺮﻫﻢ ‪ 20‬ﺳﻨﺔ‪ :‬‬

‫‪Delete * From Student Where Age > 20‬‬

‫ﻟﺘﻌﺪﻳﻞ ﻋﻨﴫ ﰲ ﺟﺪول ﻣﻌني‪ ،‬ﻓﺎﻟﺼﻴﻐﺔ ﻫﻜﺬا‪:‬‬

‫‪Value1", Field2= "Value2 ",...‬‬


‫‪Update Table1 Set Field1="Value1‬‬ ‫ ‬

‫ﻣﺜﺎل‪:‬‬

‫ﺳﻨﻘﻮم ﺑﺘﻐﻴري اﻻﺳﻢ اﻟﺸﺨﴢ ﻟﻠﻄﺎﻟﺐ ﺻﺎﺣﺐ اﻟﺮﻗﻢ ‪:2‬‬


‫"‪Update Student Set First_Name="Habib‬‬
‫=‪First_Name‬‬ ‫‪Where ID_Student=2‬‬
‫ ‬

‫ﻟﺠﻠﺐ اﻟﺒﻴﺎﻧﺎت ﻣﻦ ﺟﺪول أو ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺠﺪاول‪ ،‬ﻓﺎﻟﺼﻴﻐﺔ ﻛام ﻳﲇ‪:‬‬


‫‪Select Field1, Field2 From Table1‬‬

‫ﻣﺜﺎل‪:‬‬
‫ﺳﻨﻘﻮم ﺑﺠﻠﺐ ﺑﻴﺎﻧﺎت ﻛﻞ اﻟﺘﻼﻣﻴﺬ اﻟﺬﻳﻦ ﻳﺴﻜﻨﻮن ﰲ ﻣﺪﻳﻨﺔ اﻟﺮﻳﺎض‪:‬‬
‫"‪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‬‬

‫‪Private Sub Form1_Load(ByVal‬‬


‫(‪Form1_Load‬‬ ‫‪sender As System.Object, ByVal‬‬
‫‪e As System.EventArgs) Handles MyBase.Load‬‬

‫‪End Sub‬‬
‫‪End Class‬‬

‫‪36‬‬
‫ وﻟﻔﻌﻞ ذﻟﻚ ﻧﻌﻠﻦ ﻋﲆ ﻛﺎﺋﻦ ﻣﻦ ﻧﻮع‬،‫ﺑﻌﺪ ذﻟﻚ ﻧﻘﻮم ﺑﺈﻧﺸﺎء اﻻﺗﺼﺎل ﻣﻊ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‬
.SqlConnection

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

Private Sub Form1_Load(ByVal


Form1_Load( sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load

End Sub
End Class

 

:‫ ﻟﻪ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺒﺎراﻣﱰات وﻫﻲ ﻛام ﻳﲇ‬ConnectionString ‫ﻛام ﺗﺮى ﻓﻨﺺ اﻻﺗﺼﺎل‬

SQL ‫ وميﻜﻨﻚ ﻧﺴﺨﻪ ﻣﻦ‬،‫ وﻫﻮ اﺳﻢ اﻟﺴريﭬﺮ اﻟﺬي ﺗﻮﺟﺪ ﻋﻠﻴﻪ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‬:Server
‫ وﻧﺴﺦ اﻻﺳﻢ ﻛام‬،Properties ‫ ﻋﱪ اﻟﻀﻐﻂ ﺑﻴﻤني اﳌﺎوس ﻋﲆ اﻟﺴريﭬﺮ ﺛﻢ اﺧﺘﻴﺎر‬Server
:‫ﺗﻌﺮض اﻟﺼﻮر اﻟﺘﺎﻟﻴﺔ‬

37
‫‪1‬‬

‫اﻧﺴﺦ ﻫﺬا اﻹﺳﻢ‬

‫‪2‬‬

‫‪38‬‬
‫ﻧﺴﺘﻄﻴﻊ اﺳﺘﺒﺪال اﺳﻢ اﻟﺤﺎﺳﻮب ﺑﺎﻟﻨﻘﻄﺔ "‪ ".‬أو اﻟﻜﻠﻤﺔ ")‪ "(local‬دﻻﻟﺔ ﻋﲆ أﻧﻨﺎ ﻧﺸﺘﻐﻞ ﻋﲆ ﺳريﭬﺮ‬
‫ﻣﺤﲇ وﻟﻴﺲ ﻋﲆ ﺷﺒﻜﺔ‪.‬‬

‫‪ :Database‬وﻫﻮ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت اﻟﺘﻲ ﻧﺮﻳﺪ اﻻﺗﺼﺎل ﺑﻬﺎ‪.‬‬


‫‪abase‬‬
‫‪ :Integrated Security‬وﻫﻲ ﻃﺮﻳﻘﺔ اﻟﺪﺧﻮل إﱃ اﻟﺴريﭬﺮ‪ ،‬ﻫﻞ ﻫﻮ ﻣﺤﻤﻲ ﺑﻜﻠﻤﺔ‬
‫ﻣﺮور أم ﻻ‪ ،‬ﰲ ﺣﺎﻟﺘﻨﺎ اﻟﺪﺧﻮل إﱃ اﻟﺴريﭬﺮ ﻳﻜﻮن ﺑﺸﻜﻞ ﻣﺒﺎﴍ ﻋﱪ ‪Windows‬‬
‫‪ ،Authentication‬أي ﻻ ﻳﻮﺟﺪ ﻋﻨﺪﻧﺎ اﺳﻢ ﻣﺴﺘﺨﺪم وﻛﻠﻤﺔ ﻣﺮور ﻟﻠﻮﻟﻮج إﻟﻴﻪ‪.‬‬

‫إن ﻛﻨﺖ ﺗﺴﺘﺨﺪم ‪ SQL Authentication‬ﰲ ‪ SQL Server‬ﻟﻠﻮﻟﻮج إﱃ اﻟﺴريﭬﺮ‪ ،‬ﻓﻘﻢ ﺑﺈﻋﻄﺎء‬
‫اﻟﻘﻴﻤﺔ ‪ false‬ﻟﻬﺬه اﻟﺨﺎﺻﻴﺔ‪ ،‬وأﺿﻒ اﻟﺨﺎﺻﻴﺘني اﻟﺘﺎﻟﻴﺘني‪:‬‬

‫‪User ID‬‬ ‫اﺳﻢ اﳌﺴﺘﺨﺪم اﻟﺬي ﺗﺴﺘﺨﺪﻣﻪ‬


‫‪Password‬‬ ‫ﻛﻠﻤﺔ اﳌﺮور‬

‫ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء ﺳﻠﺴﻠﺔ اﻟﺮﺑﻂ ﺑني اﻟﱪﻧﺎﻣﺞ وﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‪ ،‬ﺳﻨﺠﻠﺐ اﻵن ﺑﻴﺎﻧﺎت ﺟﺪول اﻟﻄﻼب وﻧﻈﻬﺮﻫﺎ‬
‫ﰲ اﻟﺪاﺗﺎﻏﺮﻳﺪﻓﻴﻮ‪ ،‬وﻟﻠﻘﻴﺎم ﺑﺬﻟﻚ ﺳﻨﺤﺘﺎج إﱃ ﻛﺎﺋﻨني اﺛﻨني‪:‬‬

‫‪ :SqlDataAdapter‬ودوره ﻫﻮ ﺗﻨﻔﻴﺬ اﺳﺘﻌﻼﻣﺎت ‪ SQL‬اﻟﺘﻲ رأﻳﻨﺎﻫﺎ ﺳﺎﺑﻘﺎ‪.‬‬


‫‪DataAdapter‬‬

‫‪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

 

‫ وﻧﺠﻠﺐ ﺑﻴﺎﻧﺎت ﺟﺪول اﻟﻄﻼب ﺑﺎﺳﺘﻌامل‬Form1_Load ‫اﻵن ﺳﻨﺬﻫﺐ إﱃ اﻟﺤﺪث‬


،‫ وﰲ اﻷﺧري ﻧﻘﻮم ﺑﻌﺮض اﻟﺒﻴﺎﻧﺎت ﰲ اﻟﺪاﺗﺎﻏﺮﻳﺪﻓﻴﻮ‬،DataTable ‫ ﺛﻢ ﻧﺨﺰن ذﻟﻚ ﰲ‬، SqlDataAdapter
:‫ﻛام ﺗﻮﺿﺢ اﻟﺼﻮرة اﻟﺘﺎﻟﻴﺔ‬

 
:‫ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﻟﺸﻔﺮة اﻟﺘﺎﻟﻴﺔ‬

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‬ﻓﻬﻮ زر ﺑﺴﻴﻂ ﻳﻘﻮم ﻓﻘﻂ مبﺴﺢ ﻣﺤﺘﻮى اﻟﺨﺎﻧﺎت‬
‫اﻟﻨﺼﻴﺔ‪ ،‬وﺑﺎﻟﺘﺎﱄ ﻓﺸﻔﺮﺗﻪ ﻫﻲ ﻛﺎﻟﺘﺎﱄ‪:‬‬

‫‪For Each K As Control In GroupBox1.Controls‬‬


‫‪If TypeOf K Is TextBox Then‬‬
‫"" = ‪K.Text‬‬
‫)(‪TxtID.Focus‬‬
‫‪End If‬‬
‫‪Next‬‬

‫ﻛام ﺗﺮون ﻓﺈن ﻛﻞ أدوات اﻟﺘﻴﻜﺴﺖ ﺑﻮﻛﺲ ﻣﻮﺟﻮدة داﺧﻞ أداة ‪، GroupBox1‬وﻟﺬﻟﻚ ﻗﻤﻨﺎ ﺑﺘﻔﺮﻳﻐﻬﺎ ﰲ‬
‫دﻓﻌﺔ واﺣﺪة ﻋﻮض ﺗﻔﺮﻳﻎ ﻛﻞ ﺗﻴﻜﺴﺖ ﺑﻮﻛﺲ ﰲ ﺳﻄﺮ !‬

‫أﻣﺎ ﻓﻴام ﻳﺨﺺ اﻟﺴﻄﺮ )(‪ TxtID.Focus‬ﻓﻴﻘﻮم ﺑﻮﺿﻊ ﻣﺆﴍ اﻟﻔﺄرة ﰲ أول ﺗﻴﻜﺴﺖ ﺑﻮﻛﺲ ‪.‬‬

‫‪ .2‬اﻟﺰر اﻟﺜﺎين ‪Add‬‬


‫ﺣﺘﻰ ﺗﺘﻀﺢ اﻟﺮؤﻳﺔ إن ﺷﺎء ﷲ ﻓﺈن اﻟﻐﺎﻳﺔ ﻣﻦ ﻫﺬا اﻟﺰر ﻫﻮ إﺿﺎﻓﺔ اﻟﻄﺎﻟﺐ اﻟﺠﺪﻳﺪ اﻟﺬي ﺗﻜﺘﺐ ﺑﻴﺎﻧﺎﺗﻪ‬
‫ﰲ اﻟﻔﻮرم إﱃ ﺟﺪول اﻟﻄﻼب ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‪.‬‬

‫ﺳرنى ﻛﻴﻒ ﻧﻘﻮم ﺑﺬﻟﻚ ﰲ اﻟﻮﺿﻌني اﳌﺘﺼﻞ واﳌﻨﻔﺼﻞ‪.‬‬

‫أوﻻ ‪ :‬ﰲ اﻟﻮﺿﻊ اﳌﺘﺼﻞ ‪:On-line Mode‬‬

‫‪46‬‬
‫ ﻣﻦ أﺟﻞ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻴﺎت اﻹﺿﺎﻓﺔ‬Command ‫ ﻓﺎﻟﻮﺿﻊ اﳌﺘﺼﻞ ﻳﺴﺘﻌﻤﻞ اﻟﻜﺎﺋﻦ‬،‫ﻛام رأﻳﻨﺎ ﻓﻴام ﺳﺒﻖ‬
.‫واﻟﺤﺬف واﻟﺘﻌﺪﻳﻞ‬

‫ وﺳﻨﻘﻮم ﺑﺎﻹﻋﻼن ﻋﻦ ﻛﺎﺋﻦ ﻣﻦ ﻧﻮع‬،‫ﺳﻨﻘﻮم ﺑﺎﻟﺬﻫﺎب إﱃ اﻟﺠﺰء اﻟﺨﺎص ﺑﺎﻹﻋﻼن ﻋﻦ اﳌﺘﻐريات‬


.Cmd ‫ وﻟﻨﺴﻤﻪ‬Command

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
 

:‫ وﻧﻀﻐﻂ ﻋﻠﻴﻪ ﻣﺮﺗني وﻧﻜﺘﺐ اﻟﺸﻔﺮة اﻟﺘﺎﻟﻴﺔ‬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‬‬

‫‪Cmd =New SqlCommand("SQL‬‬


‫)‪"SQL Statement",ConnectionName‬‬
‫)‪Statement",ConnectionName‬‬

‫‪ 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‬‬

‫‪Cmd = New SqlCommand(SQL,‬‬


‫)‪Command(SQL, Con‬‬

‫ ‬

‫إذا متﻜﻨﺖ ﻣﻦ اﺳﺘﻴﻌﺎب ﻫﺬا اﻟﺴﻄﺮ ﻓﺎﻟﺒﺎﻗﻲ أﺳﻬﻞ ﺑﻜﺜري‪ ،‬وإن وﺟﺪت أدىن ﺻﻌﻮﺑﺔ ﻓﺮاﺟﻌﻪ ﺟﻴﺪا‬
‫وﺣﺎول أن ﺗﻔﻬﻤﻪ أﻛرث‪ ،‬وإن اﻗﺘﴣ اﻷﻣﺮ ﺟﺮﺑﻪ ﻋﻤﻠﻴﺎ‪.‬‬

‫ﺑﻌﺪ ﻛﺘﺎﺑﺔ أﻣﺮ اﻻﺳﺘﻌﻼم‪ ،‬وﺗﺤﺪﻳﺪ ﻛﺎﺋﻦ اﻻﺗﺼﺎل وﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﻫﻮ ‪ ،Con‬ﻧﻘﻮم ﺑﻔﺘﺢ اﻻﺗﺼﺎل ﻋﻦ‬
‫ﻃﺮﻳﻖ‬
‫)(‪Con.Open‬‬

‫ﺛﻢ ﻧﻨﻔﺬ أﻣﺮ ‪:Cmd‬‬

‫)(‪Cmd.ExecuteNonQuery‬‬ ‫ ‬

‫ﺛﻢ ﻧﻐﻠﻖ اﻻﺗﺼﺎل وﻧﻈﻬﺮ رﺳﺎﻟﺔ ﻣﻔﺎدﻫﺎ أن اﻹﺿﺎﻓﺔ متﺖ ﺑﻨﺠﺎح‪.‬‬


‫)(‪Con.Close‬‬
‫‪MsgBox("Student‬‬
‫‪"Student added successfully !",‬‬
‫)‪!", MsgBoxStyle.Information‬‬

‫ﺛﻢ ﻧﻘﻮم ﺑﺘﻔﺮﻳﻎ اﻟﻜﺎﺋﻦ ‪ 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

:Off-line Mode ‫ ﰲ اﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ‬: ‫ﺛﺎﻧﻴﺎ‬


‫ ﺛﻢ ﻧﻀﻊ ﻛﻞ‬، DataRow ‫ ﻧﻘﻮم ﺑﺎﻹﻋﻼن ﻋﻦ ﻛﺎﺋﻦ ﻣﻦ ﻧﻮع‬،‫ﻹﺿﺎﻓﺔ ﺳﻄﺮ ﺟﺪﻳﺪ ﰲ اﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ‬
‫ ﺑﻌﺪ ذﻟﻚ ﻧﻀﻴﻒ ﻫﺬا اﻟﺴﻄﺮ اﻟﺠﺪﻳﺪ‬،‫ﻗﻴﻤﺔ ﻣﻦ ﻗﻴﻢ ﻣﺮﺑﻌﺎت اﻟﻨﺺ ﰲ ﺧﺎﻧﺔ ﻣﻦ ﺧﺎﻧﺎت ﻫﺬا اﻟﻜﺎﺋﻦ‬
‫ ﺛﻢ ﻧُﻔ ﱢﻌﻞ اﻹﺿﺎﻓﺔ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت ﻋﻦ ﻃﺮﻳﻖ ﻛﺎﺋﻦ ﺟﺪﻳﺪ اﺳﻤﻪ‬،Dt ‫إﱃ اﻟﻜﺎﺋﻦ‬
.SqlCommandBuilder
CommandBuilder

.Cmdb ‫ وﻟﻨﺴﻤﻪ‬SqlCommandBuilder
CommandBuilder‫أوﻻ ﻧﻌﻠﻦ ﻋﻦ اﻟﻜﺎﺋﻦ‬

‫ وﻣﻦ ﺗﻢ أي ﺗﻌﺪﻳﻞ ﻳﻘﻮم ﺑﻪ ﻫﺬا اﻷﺧري ﻳﺘﻢ‬،‫ ﻛَ َ َﱪا ِﻣ ْﱰ‬SqlDataAdapter ‫ﻳﺄﺧﺬ ﻫﺬا اﻟﻜﺎﺋﻦ اﺳﻢ اﻟﻜﺎﺋﻦ‬
.‫ﺗﻔﻌﻴﻠﻪ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‬

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

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

 

‫ إذا اﺳﺘﻌﴡ ﻋﻠﻴﻚ أﻣﺮ ﻣﻌني ﻓﺎﺳﺄل ﷲ أن ﻳﻌﻴﻨﻚ وﺳﺎﻣﺤﻨﻲ ﻋﲆ‬،‫أمتﻨﻰ أن ﺗﻜﻮن اﻟﴩوح ﻣﻔﻬﻮﻣﺔ‬
‫ ﻷن ﻫﺬه اﻟﺸﻔﺮات ﺳﻬﻠﺔ ﺟﺪا وﺑﺎﳌامرﺳﺔ ﺳﺘﻐﺪو‬،‫ﺗﻘﺼريي واﺑﺬل ﻣﺠﻬﻮدا وإن ﺷﺎء ﷲ ﺳﺘﻔﻬﻤﻪ ِﺑ ُﻴ ْﴪ‬
‫ وﻟﻜﻦ اﺣﺬر‬،‫ ﺣﺘﻰ ﻳﺘﺄىت ﻟﻚ ﻣﻘﺎرﻧﺘﻬام واﺳﺘﻴﻌﺎﺑﻬام‬،‫ﺳﺎﺋﻐﺔ ﻛﴩب اﳌﺎء ﻓﻴام ﻳﲇ ﺳﻨﴪد اﻟﺸﻔﺮﺗني ﻣﻌﺎ‬
: ‫ ﻓﻠﻠﺸﻔﺮﺗني ﻧﻔﺲ اﻟﺪور‬،‫أن ﺗﻨﻔﺬﻫام ﻣﺮة واﺣﺪة‬

Private Sub Add_Click(ByVal


Add_Click( sender As System.Object, ByVal
e As System.EventArgs) Handles Add.Click

'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 ‫ﺑﻌﺪ ﻛﺘﺎﺑﺔ رﻗﻢ اﻟﻄﺎﻟﺐ واﻟﻀﻐﻂ ﻋﲆ‬

‫ وﰲ ﺣﺎﻟﺔ اﻟﻌﻜﺲ ﺗﻈﻬﺮ رﺳﺎﻟﺔ‬،‫ﰲ ﺣﺎﻟﺔ ﺣﺬف اﻟﻄﺎﻟﺐ ﺗﻈﻬﺮ رﺳﺎﻟﺔ ﺗﻌﻠﻢ اﳌﺴﺘﺨﺪم ﺑﻨﺠﺎح اﻟﻌﻤﻠﻴﺔ‬
.‫ﺗﻨﺒﺊ اﳌﺴﺘﺨﺪم ﺑﺬﻟﻚ‬

:On-line Mode ‫ ﰲ اﻟﻮﺿﻊ اﳌﺘﺼﻞ‬: ‫أوﻻ‬


Dim Input As String
Try
Input = InputBox("Enter
InputBox("Enter The ID of Student To
Delete !", "Delete")
"Delete"
Cmd = New SqlCommand("Delete
"Delete * From Student
where ID_Student=" & Input & "", Con)
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Student Deleted Successfully",
MsgBox("Student Successfully"
MsgBoxStyle.Information)
Dt.Clear()
Form1_Load(sender, e)
Catch ex As Exception
MsgBox(
MsgBox("Some errors was occured !",,
MsgBoxStyle.Critical)
End Try

 

Input :‫ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼن ﻋﻦ ﻣﺘﻐري ﻧﴢ أﺳﻤﻴﻨﺎه‬


Dim Input As String

54
:‫ ﺑﺎﳌﻨﺎﺳﺒﺔ ﺳﺘﻈﻬﺮ ﻟﻠﻤﺴﺘﺨﺪم اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ‬،‫ﺛﻢ ﺣﻔﻈﻨﺎ ﻓﻴﻪ اﻟﻘﻴﻤﺔ اﳌﺪﺧﻠﺔ ﺑﻮاﺳﻄﺔ اﳌﺴﺘﺨﺪم‬

 
Input = InputBox("Enter
"Enter The ID of Student To Delete !",
!"
"Delete")

.‫ﺛﻢ ﻧﻘﻮم ﺑﺘﻨﻔﻴﺬ اﺳﺘﻌﻼم ﺣﺬف اﻟﻄﺎﻟﺐ اﻟﺬي ﻳﺘﻮاﻓﻖ رﻗﻤﻪ ﻣﻊ اﻟﻘﻴﻤﺔ اﳌﺪﺧﻠﺔ ﻣﻦ ﻃﺮف اﳌﺴﺘﺨﺪم‬

Cmd = New SqlCommand(


Command("Delete
"Delete * From Student where
ID_Student=" & Input & "", Con)
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()

‫ ﻟﻨﻤﻸﻫﺎ ﺑﺎﻟﺒﻴﺎﻧﺎت اﻟﺠﺪﻳﺪة ﻋﻦ ﻃﺮﻳﻖ‬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
: ‫واﻵن ﺳﻨﻌﺮض ﺷﻔﺮيت اﻟﺤﺬف ﰲ ﻛﻼ اﻟﻮﺿﻌني ﺣﺘﻰ ﺗﺘﻀﺢ اﻟﺮؤﻳﺔ‬

Private Sub Delete_Click(ByVal


Delete_Click( sender As System.Object, ByVal
e As System.EventArgs) Handles Delete.Click
'On-line
line Mode
Dim Input As String
Try
Input = InputBox("Enter
InputBox("Enter The ID of Student To
Delete !", "Delete")
Cmd = New SqlCommand("Delete
"Delete * From Student where
ID_Student=" & Input & "", Con)
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Student
"Student Deleted 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
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
‫ وﻋﻨﺪ اﻟﻌﺜﻮر ﻋﻠﻴﻪ ﺗﻈﻬﺮ ﺑﻴﺎﻧﺎﺗﻪ ﰲ‬،‫أﻣﺎ دور ﻫﺪا اﻟﺰر ﻓﻬﻮ اﻟﺒﺤﺚ ﻋﻦ ﻃﺎﻟﺐ ﻣﻌني ﺑﺎﻻﻋﺘامد ﻋﲆ رﻗﻤﻪ‬
.‫ﺧﺎﻧﺎت اﻟﻨﺺ‬

:On-line Mode ‫ ﰲ اﻟﻮﺿﻊ اﳌﺘﺼﻞ‬: ‫أوﻻ‬


Dim Input As String
Try
Input = InputBox("Enter
InputBox("Enter The ID of Student To Search
!", "Search")
Cmd = New SqlCommand("select
"select * from Student where
ID_Student=" & Input & "", Con)
Con.Open()
Dr = Cmd.ExecuteReader
While Dr.Read()
Me
Me.TxtID.Text = Dr(0)
Me
Me.TxtLname.Text = Dr(1)
Me
Me.TxtFname.Text = Dr(2)
Me
Me.TextAge.Text = Dr(3)
Me
Me.TextAdress.Text = Dr(4)
End While
Dr.Close()
Con.Close()
Catch ex As Exception
MsgBox(
MsgBox("Some errors was occured !",,
MsgBoxStyle.Critical)
End Try

‫ وﻗﻠﻨﺎ ﺑﺄن دوره ﻫﻮ‬DataReader ‫ ﻛﻨﺎ ﻗﺪ ذﻛﺮﻧﺎ ﻛﺎﺋﻨﺎ اﺳﻤﻪ‬،‫ﰲ ﺑﺪاﻳﺔ ﺣﺪﻳﺜﻨﺎ ﻋﻦ ﻛﺎﺋﻨﺎت اﻟﻮﺿﻊ اﳌﺘﺼﻞ‬
‫ ﻛام ﻳﺘﻴﺢ ﻟﻨﺎ إﻣﻜﺎﻧﻴﺔ اﺳﺘﻐﻼل اﻟﻘﻴﻢ اﳌﻘﺮوءة ﻟﻨﻈﻬﺮﻫﺎ‬،‫ ﺑﺠﻠﺒﻬﺎ‬Command ‫ﻗﺮاءة اﻟﺒﻴﺎﻧﺎت اﻟﺘﻲ ﻳﻘﻮم‬
.‫ﰲ ﻋﻤﻠﻴﺔ اﻟﺒﺤﺚ‬
59
‫ ﺗﻔﺎدﻳﺎ ﻟﻠﺨﺮوج ﻋﻦ ﺳﻴﺎق‬،‫ﻳﺘﻮﻓﺮ ﻫﺬا اﻟﻜﺎﺋﻦ ﻋﲆ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺪوال ﻟﻦ ﻧﺘﻄﺮق إﱃ ذﻛﺮﻫﺎ ﻫﻨﺎ‬
‫ وﻟﻜﻦ ﺳﻨﻘﻮم ـ إن ﺷﺎء ﷲ ـ إذا أﺗﻴﺤﺖ ﻟﻨﺎ ﻓﺮﺻﺔ أﺧﺮى ﺑﺒﺴﻂ ﻛﻞ ﻫﺬه اﻟﻜﺎﺋﻨﺎت وﻏريﻫﺎ ﰲ‬،‫اﻟﺴﻠﺴﻠﺔ‬
.‫ﻛﺘﺎب آﺧﺮ‬

.‫ ﺑﻨﻔﺲ اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﻧﻐﻠﻖ ﺑﻬﺎ اﻻﺗﺼﺎل‬DataReader ‫ﻋﻨﺪ ﻧﻬﺎﻳﺔ ﻗﺮاءة اﻟﺒﻴﺎﻧﺎت ﻧﻘﻮم ﺑﺈﻏﻼق‬

: Off-line Mode ‫ ﰲ اﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ‬: ‫ﺛﺎﻧﻴﺎ‬


‫ ﻏري أﻧﻨﺎ ﻋﻮض‬،‫ﻋﻤﻠﻴﺔ اﻟﺒﺤﺚ ﰲ اﻟﻮﺿﻊ اﳌﻨﻔﺼﻞ ﺷﺒﻴﻬﺔ إﱃ ﺣﺪ ﺑﻌﻴﺪ ﺑﻌﻤﻠﻴﺔ اﻟﺤﺬف ﰲ ذات اﻟﻮﺿﻊ‬
.‫أن ﻧﻘﻮم ﺑﺤﺬف اﻟﻄﺎﻟﺐ اﳌﻌﺜﻮر ﻋﻠﻴﻪ ﻧﻘﻮم ﺑﺈﻇﻬﺎر ﺑﻴﺎﻧﺎﺗﻪ‬

Dim Input As String


Try
Input = InputBox("Enter
InputBox("Enter The ID of Student To
Search !", "Search")
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
Me.TxtFname.Text
ame.Text = Dt.Rows(i).Item(2)
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

60
‫ إن اﺳﺘﻌﺼﻴﺘﻬﺎ ﻋﻠﻴﻚ ﺑﻬﺬا اﻟﺪﻋﺎء اﻟﺠﻤﻴﻞ اﻟﺬي ﻋﻠﻴﻚ‬...‫ وﺳﺘﻬﻀﻤﻬﺎ ﰲ ﳌﺢ اﻟﺒﴫ‬،‫اﻗﺮأ اﻟﺸﻔﺮة ﺑﺘﻤﻌﻦ‬
‫ وأﻧﺖ ﺗﺠﻌﻞ اﻟﺤﺰن إذا ﺷﺌﺖ‬،‫ " اﻟﻠﻬﻢ ﻻ ﺳﻬﻞ إﻻ ﻣﺎ ﺟﻌﻠﺘﻪ ﺳﻬﻼ‬:‫مبﻼزﻣﺘﻪ ﻛﻠام اﺳﺘﺼﻌﺒﺖ أﻣﺮا ﻣﺎ‬
" ‫ﺳﻬﻼ‬

:‫ﻓﻴام ﻳﲇ ﺳﻨﻮرد ﻛﻠﺘﺎ اﻟﺸﻔﺮﺗني‬

Private Sub Search_Click(ByVal


Search_Click( sender As System.Object, ByVal
e As System.EventArgs) Handles Search.Click
'On-line
line Mode
Dim Input As String
Try
Input = InputBox("Enter
InputBox("Enter The ID of Student To
Search !", "Search")
Cmd = New SqlCommand("select
Sql "select * from Student where
ID_Student=" & Input & "", Con)
Con.Open()
Dr = Cmd.ExecuteReader
While Dr.Read()
Me.TxtID.Text
.TxtID.Text = Dr(0)
Me.TxtLname.Text
.TxtLname.Text = Dr(1)
Me.TxtFname.Text
.TxtFname.Text = Dr(2)
Me.TextAge.Text
.TextAge.Text = Dr(3)
Me.TextAdress.Text
.TextAdress.Text = Dr(4)
End While
Dr.Close()
Con.Close()
Catch ex As Exception
MsgBox("Some
"Some errors was occured !",
!"
MsgBoxStyle.Critical)
End Try

'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
‫ ﺑﻌﺪ اﻟﻌﺜﻮر ﻋﻠﻴﻪ‬،‫ ﻳﻨﺒﻐﻲ أن ﻧﻘﻮم أوﻻ ﺑﻌﻤﻴﻠﺔ اﻟﺒﺤﺚ ﻋﻦ اﻟﻄﺎﻟﺐ اﳌﺮاد ﺗﻐﻴري ﺑﻴﺎﻧﺎﺗﻪ‬،‫ﻗﺒﻞ اﻟﺘﻌﺪﻳﻞ‬
(‫ﻧﻌﺪل اﻟﺒﻴﺎﻧﺎت ﺛﻢ ﻧﻀﻐﻂ ﻋﲆ ﻫﺬا اﻟﺰر )رﻛﺰ ﺟﻴﺪا ﰲ ﻫﺬه اﻟﺨﻄﻮات‬

‫اﻟﻀﻐﻂ ﻋﲆ زر اﻟﺘﻌﺪﻳﻞ‬ ‫ﺗﻐﻴري اﻟﺒﻴﺎﻧﺎت‬ ‫ﺑﺤﺚ ﻋﻦ اﻟﻄﺎﻟﺐ‬


.‫ﻟﺤﻔﻆ اﻟﺒﻴﺎﻧﺎت‬

:On-line Mode ‫ ﰲ اﻟﻮﺿﻊ اﳌﺘﺼﻞ‬: ‫أوﻻ‬


Try
Cmd = New SqlCommand("Update
"Update Student set
First_Name='" &
Me.TxtFname.Text
.TxtFname.Text & _
"', Last_Name='" &
Me.TxtLname.Text
.TxtLname.Text & _
"' , Age='" &
TextAge.Text & _
"' ,Adress='" &
Me.TextAdress.Text
.TextAdress.Text & _
"' Where ID_Student=" &
TxtID.Text & "", Con)
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Student Edited successfully !",
MsgBox("Student !"
MsgBoxStyle.Information)
Dt.Clear()
Form1_Load(sender, e)
Catch ex As Exception
MsgBox(
MsgBox("Some errors was occured !",,
MsgBoxStyle.Critical)
End Try
 
63
‫ ﻻ ﺗﻨﺒﻬﺮ ﻣﻦ ﻣﻈﻬﺮ ﺗﻠﻚ‬،Update ‫ إﱃ‬Insert ‫ ﻧﻘﻮم ﻓﻘﻂ ﺑﺘﻐﻴري اﻻﺳﺘﻌﻼم ﻣﻦ‬،‫ﻣﺜﻠﻬﺎ ﻣﺜﻞ ﺷﻔﺮة اﻹﺿﺎﻓﺔ‬
! ‫ ﺿﻊ ﰲ ﺑﺎﻟﻚ ﻓﻘﻂ أن ﻛﻞ رﻣﺰ ﻳُﺒﺪأ ﺑﻪ أوﻻ ﻳُﺨﺘﻢ ﺑﻪ أﺧريا‬،‫اﻟﺮﻣﻮز ﻓﻬﻲ ﻓﻘﻂ ﻟﺘﻨﻈﻴﻢ ﺗﺴﻠﺴﻞ اﻟﺤﻘﻮل‬

: Off-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
Cmdb = New SqlCommandBuilder(Da)
CommandBuilder(Da)
Da.Update(Dt)
MsgBox("Student
"Student Edited Successfully",
Successfully"
MsgBoxStyle.Information)
End If
Next
Catch ex As Exception
MsgBox(
MsgBox("Some errors was occured !",
,
MsgBoxStyle.Critical)
End Try

‫ أي رﻗﻢ اﻟﻄﺎﻟﺐ اﳌﺮاد‬TxtID ‫ ﻋﻦ اﻟﻄﺎﻟﺐ اﻟﺬي رﻗﻤﻪ ﻳﺴﺎوي اﻟﺮﻗﻢ اﳌﻜﺘﻮب ﰲ‬Dt ‫ﻧﻘﻮم ﺑﺎﻟﺒﺤﺚ ﰲ‬
‫ ﺑﺎﻟﻘﻴﻢ اﻟﺠﺪﻳﺪة اﳌﻜﺘﻮﺑﺔ ﰲ ﺧﺎﻧﺎت‬Dt ‫ ﺑﻌﺪ اﻟﻌﺜﻮر ﻋﻠﻴﻪ ﻧﻘﻮم ﺑﺈﺑﺪال اﻟﻘﻴﻢ اﻟﻘﺪميﺔ اﳌﺨﺰﻧﺔ ﰲ‬،‫ﺗﻌﺪﻳﻠﻪ‬
.CommandBuilder ‫ ﺛﻢ ﻧﻔﻌﻞ اﻟﺘﻌﺪﻳﻞ ﻋﻦ ﻃﺮﻳﻖ‬،‫اﻟﻨﺺ‬

64
:‫ﻓﻴام ﻳﲇ ﺳﻨﻮرد ﻛﻠﺘﺎ اﻟﺸﻔﺮﺗني‬

Private Sub Edit_Click(ByVal


Edit_Click( sender As System.Object, ByVal e
As System.EventArgs) Handles Edit.Click
'On-line
line Mode
Try
Cmd = New SqlCommand("Update
"Update Student set
First_Name='" &
Me.TxtFname.Text
.TxtFname.Text & _
"', Last_Name='" &
Me.TxtLname.Text
.TxtLname.Text & _
"' , Age='" &
TextAge.Text & _
"' ,Adress='" &
Me.TextAdress.Text
.TextAdress.Text & _
"' Where ID_Student=" &
TxtID.Text & "",, Con)
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Student
"Student Edited 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
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‬ﺛﻢ ﻳﺬﻫﺐ إﱃ ﺗﻠﻚ اﻟﺮﺗﺒﺔ وﻳﻈﻬﺮ ﻗﻴﻤﻬﺎ ﰲ ﺧﺎﻧﺎت اﻟﻨﺺ‪.‬‬

‫ﻧﻮد اﻹﺷﺎرة ﻓﻘﻂ إﱃ أن أول ﺳﻄﺮ ﰲ ‪ Dt‬رﺗﺒﺘﻪ ﻫﻲ ‪0:‬‬

‫وأن اﻟﺴﻄﺮ اﻷﺧري رﺗﺒﺘﻪ ﻫﻲ‪Dt.Rows.Count-1 :‬‬

‫أﻣﺎ رﺗﺒﺔ اﻟﺴﻄﺮ اﻟﺘﺎﱄ ﻓﻬﻲ ﺗﺰاﻳﺪﻳﺔ مبﻘﺪار واﺣﺪ‪Position=Position+1 :‬‬

‫وﺑﺎﳌﻘﺎﺑﻞ رﺗﺒﺔ اﻟﺴﻄﺮ اﻟﺴﺎﺑﻖ ﺗﻜﻮن ﺗﻨﺎﻗﺼﻴﺔ مبﻘﺪار واﺣﺪ‪Position=Position :‬‬


‫‪Position=Position-1‬‬

‫ﺳﻴﻜﻮن ﻧﺺ ﺷﻔﺮة اﻹﺟﺮاء ‪ MoveData‬ﻛام ﻳﲇ ‪:‬‬

‫‪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 ‫اﻹﺟﺮاء ﻣﻊ ﺗﻐﻴري ﻗﻴﻤﺔ اﻟﺮﺗﺒﺔ ب‬

Private Sub First_Click(ByVal


First_Click( sender As System.Object, ByVal
e As System.EventArgs) Handles First.Click

Index = 0
MoveData(Index)
End Sub

: "‫و ﰲ اﻟﺰر "اﻷﺧري‬

Private Sub Last_Click(ByVal


Last_Click( sender As System.Object, ByVal
e As System.EventArgs) Handles Last.Click
Index = Dt.Rows.Count - 1

68
MoveData(Index)
End Sub

: ‫ﺷﻔﺮة اﻟﺰر اﻟﺴﺎﺑﻖ‬

Private Sub Previous_Click(ByVal


Previous_Click( sender As System.Object,
ByVal e As System.EventArgs) Handles Previous.Click

If Index = 0 Then
MsgBox(
MsgBox("This is the first student",
,
MsgBoxStyle.Critical)
Exit Sub
End If
Index = Index - 1
MoveData(Index)

End Sub

.‫ﻧﺘﺤﻘﻖ ﻣﻦ اﻟﺮﺗﺒﺔ ﰲ ﻛﻞ ﻣﺮة ﺣﺘﻰ ﻻ ﻳﻘﻊ ﺧﻄﺄ ﻋﻨﺪ اﻟﻀﻐﻂ اﳌﺘﻮاﺻﻞ ﻋﲆ ﻫﺬا اﻟﺰر‬

: ‫ﺷﻔﺮة اﻟﺰر اﻟﺘﺎﱄ‬


Private Sub Next_Click(ByVal
Next_Click( sender As System.Object, ByVal e As
System.EventArgs) Handles Next.Click

If Index = Dt.Rows.Count - 1 Then


MsgBox("This
"This is the Last student",
student", MsgBoxStyle.Critical)
Exit Sub
End If
Index = Index + 1
MoveData(Index)
End Sub

69
‫متﺮﻳﻦ ﺗﺤﺼﻴﲇ ‪:‬‬
‫ﺣﺘﻰ ﻧﻘﻮم ﺑﺘﺤﺼﻴﻞ و ﻓﻬﻢ ﻛﻞ اﻟﺸﻔﺮات اﻟﺘﻲ أوردﻧﺎﻫﺎ آﻧﻔﺎ‪ ،‬ﺳﻨﺴﻌﻰ إﱃ إﻧﺠﺎز ﻫﺬا اﻟﺘﻤﺮﻳﻦ اﳌامﺛﻞ )‬
‫أو ﺑﺎﻷﺣﺮى ﺳﺘﺴﻌﻰ ﻟﺬﻟﻚ وﺣﺪك‪ ،‬ﻛﺎن ﷲ ﰲ ﻋﻮﻧﻚ (‬

‫اﳌﻄﻠﻮب ﻣﻨﻚ ﻋﺰﻳﺰي اﻟﻘﺎرئ أن ﺗﻨﺠﺰ اﻟﻔﻮرم اﻟﺘﺎﱄ اﻟﺬي ﻳﻘﻮم ﺑﺈدارة اﳌﻮاد‪ ،‬ﺑﺤﻴﺚ ﻣﻦ ﺧﻼﻟﻪ ﻳﺴﺘﻄﻴﻊ‬
‫اﳌﺴﺘﺨﺪم أن ﻳﺸﺎﻫﺪ ﻛﻞ اﳌﻮاد اﳌﺤﻔﻮﻇﺔ ﰲ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‪ ،‬وﻛﺬا إﻣﻜﺎﻧﻴﺔ اﻟﺘﻌﺪﻳﻞ ﻋﻠﻴﻬﺎ وﺣﺬﻓﻬﺎ و‬
‫إﺿﺎﻓﺔ ﻣﻮاد ﺟﺪﻳﺪة‪ ،‬زﻳﺎدة ﻋﲆ أزرار اﻟﺘﻨﻘﻞ ﺑني ﺳﺠﻼت اﳌﻮاد‪.‬‬

‫اﻷﻣﺮ ﺑﺴﻴﻂ ﺟﺪا‪ ،‬ﻛﻞ ﻣﺎ ﻋﻠﻴﻚ ﻫﻮ ﻣﺮاﺟﻌﺔ اﻟﺸﻔﺮات اﻟﺴﺎﺑﻘﺔ و ﻣﺤﺎوﻟﺔ اﺳﺘﻴﻌﺎﺑﻬﺎ أﻛرث‪ ،‬و إن ﺷﺎء ﷲ‬
‫ﺳﺘﻨﺠﺰه ﰲ وﻗﺖ ﻳﺴري !‬

‫ﻫﻨﺎ ﺻﻮرة اﻟﻔﻮرم اﳌﻄﻠﻮب ﻣﻨﻚ إﻧﺠﺎزه ‪:‬‬

‫ﻟﻚ اﻟﺤﺮﻳﺔ ﰲ اﺳﺘﺨﺪام أي وﺿﻊ ﺗﺸﺎء )اﳌﻨﻔﺼﻞ أو اﳌﺘﺼﻞ( !‬

‫‪70‬‬
‫ ‬

‫اﻟﺠﺰء اﻟﺜﺎﻟﺚ‪:‬‬

‫ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺸﻔﺮات ﻟﻠﺤﺎﺟﺔ‬


‫ ‬

‫ ‬

‫‪71‬‬
،‫ أردت أن أﻗﺪم ﻓﻴام ﻳﲇ ﴍح ﻛﻴﻔﻴﺔ إﻧﺠﺎز ﻓﻮرم إﺿﺎﻓﺔ اﻟﻨﻘﺎط ﻟﻠﻄﻼب ﰲ اﳌﻮاد اﻟﺘﺪرﻳﺴﻴﺔ‬،‫ﺑﴫاﺣﺔ‬
‫ إذ أن ﺑﺮﻧﺎﻣﺞ إدارة‬،‫ وﻷن اﻟﺘﺤﻠﻴﻞ أﺻﻼ ﻟﻴﺲ ﻛﺎﻣﻼ‬،‫وﻟﻜﻨﻨﻲ ارﺗﺄﻳﺖ إﻟﻐﺎء ذﻟﻚ ﻷن اﻟﻜﺘﺎب ﺳﻴﻄﻮل ﻛﺜريا‬
‫ أﻣﺎ ﰲ ﺳﻠﺴﻠﺘﻨﺎ ﻫﺬه ﻓﻨﺤﻦ ﻧﺮﻛﺰ ﻓﻘﻂ ﻋﲆ ﻣﺎ ﻫﻮ ﻋﻤﲇ‬،‫اﻟﻄﻼب ﻳﺘﻄﻠﺐ ﺗﺤﻠﻴﻼ ﻗﺒﻞ ﺑﺪاﻳﺔ اﻹﻧﺠﺎز‬
.‫ إذ ﺑﺈﺗﻘﺎﻧﻚ ﻟﻬﺬا اﻟﺘﻄﺒﻴﻖ ﺳﺘﻐﺪو ﻗﺎدرا إن ﺷﺎء ﷲ ﻋﲆ إﻧﺠﺎز ﻏريه ﻣﻬام ﻛﺎن ﻧﺺ اﳌﴩوع‬،‫ﻓﺤﺴﺐ‬

‫ وﻻ ﻳﻬﻢ اﳌﺜﺎل اﻟﺬي‬،‫ ﻣﺎ ﻳﻬﻢ ﰲ ﺳﻠﺴﻠﺘﻨﺎ ﻫﺬه ﻫﻮ اﻟﺘﻤﻜﻦ ﻣﻦ إﻧﺠﺎز اﻷﻋامل ﺑﺎﺣﱰاﻓﻴﺔ‬،‫ﻛام ﻗﻠﺖ‬
.‫ ﻷن اﻟﻐﺮض ﻟﻴﺲ ﻫﻮ اﳌﺜﺎل ﻧﻔﺴﻪ وﻟﻜﻦ اﻟﻐﺮض ﻫﻮ ﺗﻌﻠﻢ ﺗﻘﻨﻴﺎت إﻧﺠﺎزه‬،‫ﻧﻌﻄﻴﻪ‬

‫ﻏري أن ﻫﺬا ﻟﻦ ميﻨﻌﻨﺎ ﻣﻦ إﻳﺮاد ﺑﻌﺾ اﻷﻛﻮاد اﻟﺘﻲ ﻗﺪ ﺗﺤﺘﺎﺟﻬﺎ إن ﺷﺎء ﷲ ﰲ ﺑﻌﺾ اﻟﺘﻄﺒﻴﻘﺎت اﳌﺮﺗﺒﻄﺔ‬
.‫ﺑﻘﺎﻋﺪة ﺑﻴﺎﻧﺎت‬

:‫ ﻣﻦ ﺟﺪول ﺑﻘﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت‬Combobox ‫ ﻛﻴﻔﻴﺔ ﻣﻸ ﻛﻮﻣﺒﻮﺑﻮﻛﺲ‬: ‫اﻟﺸﻔﺮة اﻷوﱃ‬


Imports System.Data.SqlClient
Data.SqlClient

Public Class Marks


Dim Con As New SqlConnection("Server=.\SQLEXPRESS;
SQLEXPRESS;
Database= StudentBase; Integrated Security=true"
")
Dim Da As SqlDataAdapter
DataAdapter
Dim Dt As New DataTable

Private Sub Combo_Load(ByVal


Combo_Load( sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
.Load
Da = New SqlDataAdapter("Select
Sql "Select ID_Student,Last_Name
+ ' '+ First_Name as FullName From student",
student", Con)
Da.Fill(Dt)
Me.ComboBox1.DataSource
.ComboBox1.DataSource = Dt
Me.ComboBox1.DisplayMember
.ComboBox1.DisplayMember = "FullName"
Me.ComboBox1.ValueMember
.ComboBox1.ValueMember = "ID_Student"
End Sub

72
‫‪End Class‬‬

‫ﻧﻘﻮم ﺑﺠﻠﺐ اﻟﺒﻴﺎﻧﺎت اﳌﺮاد إﻇﻬﺎرﻫﺎ ﰲ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ‪ ،‬إﺿﺎﻓﺔ إﱃ اﻟﺤﻘﻞ اﻟﺮﺋﻴﴘ )ﻟﻴﺲ ﴐورﻳﺎ إذا ﻛﺎن‬
‫اﻟﻐﺮض ﻫﻮ اﻹﻇﻬﺎر ﻓﻘﻂ(‪ ،‬ﺑﻌﺪ ذﻟﻚ ﻧﻘﻮم ﺑﻮﺿﻊ اﻟﺒﻴﺎﻧﺎت اﳌﺠﻠﻮﺑﺔ ﻣﻦ ﻃﺮف ‪ DataAdapter‬وﻧﻀﻌﻬﺎ‬
‫ﰲ ‪.DataTable‬‬

‫ﺑﻌﺪ ﻣﻞء ‪ ،DataTable‬ﻧﺠﻌﻠﻬﺎ ﻣﺼﺪر ﺑﻴﺎﻧﺎت ﻟﻠﻜﻮﻣﺒﻮﺑﻮﻛﺲ‪.‬‬

‫‪Me.ComboBox1.DataSource‬‬
‫‪.ComboBox1.DataSource = Dt‬‬

‫ﺛﻢ ﻧﺤﺪد اﻟﺤﻘﻞ اﳌﺮاد إﻇﻬﺎره ﺑﺎﻻﻋﺘامد ﻋﲆ اﻟﺨﺎﺻﻴﺔ ‪ ،DisplayMember‬ﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﺳﻨﻈﻬﺮ‬
‫اﻻﺳﻢ اﻟﺸﺨﴢ واﻟﻌﺎﺋﲇ ﻣﻌﺎ‪ ،‬وﻟﻌﻠﻚ ﻻﺣﻈﺖ ذﻟﻚ ﰲ اﻻﺳﺘﻌﻼم اﻟﺬي ﻗﻤﻨﺎ ﺑﻪ‪ ،‬إذ ﻗﻤﻨﺎ ﺑﺪﻣﺠﻬام ﻣﻌﺎ‪.‬‬
‫‪Me.ComboBox1.DisplayMember‬‬
‫"‪.ComboBox1.DisplayMember = "FullName‬‬

‫و ﰲ اﻟﺨﺘﺎم ﻧﺤﺪد اﻟﺤﻘﻞ اﻟﺮﺋﻴﴘ ﻟﻠﺠﺪول اﻟﺬي ﺟﻠﺒﻨﺎ ﻣﻨﻪ اﻟﺒﻴﺎﻧﺎت‪.‬‬


‫‪Me.ComboBox1.ValueMember‬‬
‫"‪.ComboBox1.ValueMember = "ID_Student‬‬

‫و ﻫﻨﺎ ﺻﻮرة ﻟﻠﻨﺘﻴﺠﺔ اﻟﺘﻲ وﺻﻠﻨﺎ إﻟﻴﻬﺎ ‪:‬‬

‫‪73‬‬
‫اﻟﺸﻔﺮة اﻟﺜﺎﻧﻴﺔ‪ :‬ﻛﻴﻔﻴﺔ إﻇﻬﺎر ﺑﻴﺎﻧﺎت ﻣﻌﻴﻨﺔ ﻋﻨﺪ اﺧﺘﻴﺎر ﻋﻨﴫ ﻣﻦ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ‬
‫‪Combobox‬‬
‫اﻟﺤﺪث اﻟﺬي ﻳﺘﻮﻟﺪ ﻋﻨﺪﻣﺎ ﻧﻘﻮم ﺑﺎﺧﺘﻴﺎر ﻋﻨﴫ ﻣﻦ اﻟﻘﺎمئﺔ اﳌﻨﺴﺪﻟﺔ ‪ ComboBox‬ﻳﺴﻤﻰ‬
‫‪ ،SelectedIndexChanged‬وﺑﺎﻟﺘﺎﱄ ﻓﺸﻔﺮﺗﻨﺎ ﻫﺬه ﻳﺠﺐ أن ﻧﻀﻌﻬﺎ ﺿﻤﻦ ﻫﺬا اﻟﺤﺪث‪ ،‬وﻟﺘﻔﺎدي وﻗﻮع‬
‫أي ﺧﻄﺄ أﺛﻨﺎء اﻟﺘﻨﻔﻴﺬ ﻧﻀﻴﻒ اﻷﻣﺮ ‪: Try…Catch‬‬

‫‪Private Sub ComboBox1_SelectedIndexChanged(ByVal‬‬


‫‪ComboBox1_SelectedIndexChanged(ByVal sender As‬‬
‫‪System.Object, ByVal e As System.EventArgs) Handles‬‬
‫‪ComboBox1.SelectedIndexChanged‬‬

‫‪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‬‬
‫ﻋﻨﺪ اﺧﺘﻴﺎر اﺳﻢ اﻟﻄﺎﻟﺐ‪ ،‬ﺳﻴﻈﻬﺮ ﻋﻨﻮاﻧﻪ ﰲ ﺧﺎﻧﺔ اﻟﻨﺺ اﻟﺴﻔﻠﻴﺔ‪.‬‬

‫اﻟﺸﻔﺮة اﻟﺜﺎﻟﺜﺔ‪ :‬ﻛﻴﻔﻴﺔ إﺿﺎﻓﺔ اﻟﻜﺘﺎﺑﺔ اﻟﺬاﺗﻴﺔ ‪ IntelliSense‬ﻋﻨﺪ اﻟﻜﺘﺎﺑﺔ ﰲ‬


‫‪ ، Combobox‬ﻛام ﻫﻮ اﻟﺤﺎل ﰲ ﻣﺘﺼﻔﺢ اﻟﻮﻳﺐ ﻏﻮﻏﻞ ﻛﺮوم ‪Google Chrome‬‬

‫ﻟﻌﻠﻚ ﻻﺣﻈﺖ أن اﻟﻌﺪﻳﺪ ﻣﻦ اﻟﱪاﻣﺞ واﳌﻮاﻗﻊ ﺗﺴﺘﻌﻤﻞ ﻫﺬه اﻟﺘﻘﻨﻴﺔ ﰲ اﻟﺒﺤﺚ‪ ،‬إذ مبﺠﺮد ﻣﺎ ﺗﺒﺪأ ﻛﺘﺎﺑﺔ‬
‫اﻷﺣﺮف اﻷوﱃ ﻟﻠﺒﺤﺚ‪ ،‬ﻳﻘﻮم اﻟﱪﻧﺎﻣﺞ ﺗﻠﻘﺎﺋﻴﺎ ﺑﺈﻛامل اﻷﺣﺮف اﳌﺘﺒﻘﻴﺔ‪.‬‬

‫اﻟﺸﻔﺮة اﻟﺘﻲ ﺳﻨﻌﺮﺿﻬﺎ ﺑﻌﺪ ﻗﻠﻴﻞ‪ ،‬ﺗﻘﻮم ﺑﺈﻧﺠﺎز ﻫﺬه اﳌﻬﻤﺔ‪ ،‬وﻫﺬه ﺻﻮرة ﻋﲆ اﻟﻨﺘﻴﺠﺔ اﳌﺮﺗﻘﺒﺔ ‪:‬‬

‫‪75‬‬
،‫ وﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬه ﻫﻮ اﻷﻧﺴﺐ‬،KeyUp ‫اﻟﺤﺪث اﻟﺬي ﻳﺘﻮﻟﺪ ﻋﻨﺪ اﻟﻀﻐﻂ ﻋﲆ زر ﰲ ﻟﻮﺣﺔ اﳌﻔﺎﺗﻴﺢ ﻫﻮ‬
‫ وﻣﻦ ﺗﻢ إﻛامل‬،‫ﻷﻧﻪ ﻋﻨﺪ اﻟﻀﻐﻂ ﻋﲆ ﻛﻞ زر ﻧﻘﻮم ﺑﻌﻤﻠﻴﺔ اﻟﺒﺤﺚ داﺧﻞ اﻟﻜﻮﻣﺒﻮﺑﻮﻛﺲ واﳌﻘﺎرﻧﺔ‬
.‫اﻟﺤﺮوف اﳌﻜﺘﻮﺑﺔ‬

Private Sub ComboBox1_KeyUp(ByVal


ComboBox1_KeyUp( sender As Object,
Object ByVal e As
System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp

Dim index As Integer


Dim found As String
Dim actual As String
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
e =
Keys.PageDown _
Or e.KeyCode = Keys.PageUp Or e.KeyCode = Keys.End _
Or e.KeyCode = Keys.Home

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 > -1‬‬‫‪1 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‬‬

‫ﻻ ﺗﻨﺰﻋﺞ ﻣﻦ ﻫﺬه اﻟﺸﻔﺮة‪ ،‬ﻷﻧﻬﺎ ﻫﻜﺬا ﺗﺒﺪو ﻋﻨﺪ أول وﻫﻠﺔ‪ ،‬رﻛﺰ ﻣﻌﻲ ﰲ اﻟﴩح وﺳﺘﻜﺘﺸﻒ ﺑﺄن اﻷﻣﺮ‬
‫‪:‬‬ ‫ﻳﺴري ﺟﺪا‬

‫اﻷﺳﻄﺮ اﻷوﱃ ‪:‬‬

‫‪Dim index As Integer‬‬ ‫ ‬


‫‪Dim found As String‬‬
‫‪Dim actual As String‬‬

‫اﳌﺘﻐري ‪ 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

Dim Pos As Integer = Me.DGV.CurrentRow.Index


.DGV.CurrentRow.Index

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 ‫ﻗﻤﻨﺎ ﺑﺎﻹﻋﻼن ﻋﻦ ﻣﺘﻐري رﻗﻤﻲ أﺳﻤﻴﻨﺎه‬
.‫ﺧﻠﻴﺔ ﻣﻨﻪ ﻋﲆ ﺧﺎﻧﺔ ﻧﺺ‬

‫ ﻛﻴﻔﻴﺔ ﺗﻐﻴري أﻟﻮان أﺳﻄﺮ اﻟﺪاﺗﺎﻏﺮﻳﭭﻴﻮ ﺗﻨﺎوﺑﻴﺎ‬:‫اﻟﺸﻔﺮة اﻟﺨﺎﻣﺴﺔ‬


‫ وﻧﺤﺪد‬،‫ ﺳﻨﻘﻮم ﻓﻘﻂ ﺑﺎﻟﺬﻫﺎب إﱃ ﺧﺼﺎﺋﺺ اﻟﺪاﺗﺎﻏﺮﻳﺪﭬﻴﻮ‬،‫ﻫﺬه اﳌﺮة ﻟﻦ ﻧﻜﺘﺐ أي ﺳﻄﺮ ﻣﻦ اﻟﻜﻮد‬
:‫ ﺳﻮف ﺗﻈﻬﺮ ﻟﻨﺎ ﻧﺎﻓﺬة ﺧﺼﺎﺋﺺ ﺟﺪﻳﺪة ﻛام ﻳﲇ‬، AlternatingRowsDefaultCellStyle ‫اﻟﺨﺎﺻﻴﺔ‬

82
‫ﺳﻨﺨﺘﺎر ﻣﻨﻬﺎ اﻟﺨﺎﺻﻴﺔ ‪ BackColor‬و ﻧﻐريﻫﺎ إﱃ اﻟﻠﻮن اﻟﺬي ﻧﺮﻳﺪ‪ ،‬وﻫﺬه ﺻﻮرة ﻟﻠﻨﺘﻴﺠﺔ اﻟﺘﻲ ﺣﺼﻠﺖ‬
‫ﻋﻠﻴﻬﺎ‪W‬‬

‫‪83‬‬
‫اﻟﺸﻔﺮة اﻟﺴﺎدﺳﺔ‪ :‬ﻛﻴﻔﻴﺔ اﻟﺒﺤﺚ ﰲ ﺧﺎﻧﺔ ﻧﺺ ‪ TextBox‬و إﻇﻬﺎر اﻟﻨﺘﺎﺋﺞ ﰲ‬
‫داﺗﺎﻏﺮﻳﺪﻓﻴﻮ‬
‫اﻟﺤﺪث اﳌﺮﺗﺒﻂ ﺑﺎﻟﺘﻴﻜﺴﺖ ﺑﻮﻛﺲ‪ ،‬اﻟﺬي ﻳﺘﻮﻟﺪ ﻋﻨﺪ ﻋﻤﻠﻴﺔ اﻟﻜﺘﺎﺑﺔ ﻳﺴﻤﻰ ‪.TextChanged‬‬

‫‪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 like '%" & TextBox1.Text & "%'", Con‬‬
‫)‪Da.Fill(Dt‬‬
‫‪DataGridView1.DataSource = Dt‬‬

‫‪End Sub‬‬

‫أﻋﺘﻘﺪ أن ﻛﻞ ﳾء واﺿﺢ ﻣﺎﻋﺪا اﻟﺠﺰء اﻷﺧري ﻣﻦ اﻻﺳﺘﻌﻼم‪:‬‬

‫(‪Da = New SqlDataAdapter‬‬


‫‪DataAdapter("Select * From Student where‬‬
‫)‪First_Name like '%" & TextBox1.Text & "%'", Con‬‬

‫اﻟﻜﻠﻤﺔ ‪ 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
‫اﻟﺸﻔﺮة اﻟﺜﺎﻣﻨﺔ‪ :‬ﻛﻴﻔﻴﺔ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻴﺎت اﻹﺿﺎﻓﺔ واﻟﺤﺬف واﻟﺘﻌﺪﻳﻞ ﻣﺒﺎﴍة ﻋﲆ‬
‫اﻟﺪاﺗﺎﻏﺮﻳﺪﻓﻴﻮ‬
‫وﻫﺬه ﻣﻦ أﺟﻤﻞ اﻟﺸﻔﺮات اﻟﺘﻲ ﺗﻠﺨﺺ ﻛﻞ اﻟﻌﻤﻠﻴﺎت اﻟﺘﻲ رأﻳﻨﺎﻫﺎ ﺳﺎﺑﻘﺎ ﰲ ﺳﻄﺮﻳﻦ ﻓﻘﻂ‪ ،‬ﺳﻴﻜﻮن‬
‫اﻟﺘﻌﺪﻳﻞ واﻹﺿﺎﻓﺔ واﻟﺤﺬف ﻋﲆ اﻟﺪاﺗﺎﻏﺮﻳﺪﭬﻴﻮ‪ ،‬وﻋﻨﺪ اﻻﻧﺘﻬﺎء ﻳﻘﻮم اﳌﺴﺘﺨﺪم ﺑﺎﻟﻀﻐﻂ ﻋﲆ زر‬
‫اﻟﺘﻔﻌﻴﻞ‪.‬‬

‫ﻧﻀﻐﻂ ﻣﺮﺗني ﻋﲆ اﻟﺰر ‪ Confirm‬وﻧﻜﺘﺐ اﻟﺸﻔﺮة اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪Private Sub Confirm_Click(ByVal‬‬


‫(‪Confirm_Click‬‬ ‫‪sender As System.Object,‬‬
‫‪ByVal e As System.EventArgs) Handles Confirm.Click‬‬

‫)‪Cmdb = New SqlCommandBuilder(Da‬‬


‫‪Sql‬‬
‫)‪Da.Update(Dt‬‬

‫‪End Sub‬‬

‫‪86‬‬
‫ﺗﻢ وهلل اﻟﺤﻤﺪ‬

‫‪87‬‬
‫اﻟﻠﻬﻢ اﺟﻌﻞ أﻋامﻟﻨﺎ‬
‫ﺧﺎﻟﺼﺔ ﻟﻮﺟﻬﻚ اﻟﻜﺮﻳﻢ‬
‫ ‬

‫‪88‬‬
‫ ‬
‫اﻟﺨﺎمتﺔ‪:‬‬

‫ﻧﺮﺟﻮ ﻣﻦ ﷲ اﻟﻌﲇ اﻟﻘﺪﻳﺮ أن ﻧﻜﻮن ﻗﺪ وﻓﻘﻨﺎ ﰲ أداء اﳌﻬﻤﺔ ﻋﲆ أﺣﺴﻦ وﺟﻪ‪ ،‬وﻧﺘﻤﻨﻰ أن ﻳﻜﻮن ﻫﺬا‬
‫اﻟﻌﻤﻞ اﳌﺘﻮاﺿﻊ ﻗﺪ أﺿﺎف إﻟﻴﻚ ﻳﺎ أﺧﻲ اﻟﻜﺮﻳﻢ وﻳﺎ أﺧﺘﻲ اﻟﻜﺮميﺔ ﺷﻴﺌﺎ ﻣﻦ اﳌﻌﻠﻮﻣﺎت‪ ،‬وﻻ ﺗﻨﺴﻮا أﻧﻬﺎ‬
‫اﻟﺨﻄﻰ اﻷوﱃ وﻣﺎ زال ﻟﻨﺎ ﻣﻌﻜﻢ إن ﺷﺎء ﷲ ﺧﻄﻮات‪ ،‬وﰲ ﻛﻞ ﺧﻄﻮة ﺳﻨﺤﺎول أن ﻧﺮﻓﻊ ﻣﻦ‬
‫ﻣﺴﺘﻮﻳﺎﺗﻨﺎ‪.‬‬

‫ﰲ اﻟﺨﻄﻮة اﻟﻘﺎدﻣﺔ إن ﺷﺎء ﷲ ﺳﻮف ﻧﺘﻌﺮف ﻋﲆ ﻛﻴﻔﻴﺔ اﻟﺮﺑﻂ ﺑني اﻟﻔﻴﺠﻮال اﺳﺘﻮدﻳﻮ و ‪SQL‬‬
‫‪ Server‬ﺑﻮاﺳﻄﺔ اﻹﺟﺮاءات اﳌﺨﺰﻧﺔ ‪ ،Stored Procedures‬ﻣﻊ ﻛﻴﻔﻴﺔ إﻧﺸﺎء اﻟﺘﻘﺎرﻳﺮ ﻋﻦ ﻃﺮﻳﻖ‬
‫‪Crystal Report‬‬

‫ﰲ اﻧﺘﻈﺎر اﻟﺨﻄﻮة اﻟﺜﺎﻟﺜﺔ ﻣﻦ ﻫﺬه اﻟﺴﻠﺴﻠﺔ اﻟﻀﻤﻨﻴﺔ "ﺧﻄﻮة إﱃ اﻷﻣﺎم" اﻟﺘﺎﺑﻌﺔ ﻟﺴﻠﺴﺔ "ﻛﻦ أﺳﺪا"‪،‬‬
‫ﺗﻘﺒﻠﻮا ﻣﻨﺎ أزىك اﻟﺸﻜﺮ‪ ،‬وﻻ ﺗﻨﺴﻮﻧﺎ وواﻟﺪﻳﻨﺎ وﻛﻞ اﳌﺴﻠﻤني ﻣﻦ ﺻﺎﻟﺢ دﻋﺎﺋﻜﻢ‪ ،‬ﻛام ﻻ ﺗﻨﺴﻮﻧﺎ ﻣﻦ‬
‫اﻧﺘﻘﺎداﺗﻜﻢ وﺗﺴﺎؤﻻﺗﻜﻢ‪ ،‬وﺳﻨﺴﻌﻰ ﻗﺪر اﳌﺴﺘﻄﺎع إﱃ إﺟﺎﺑﺘﻜﻢ واﻷﺧﺬ ﺑﻨﺼﺎﺋﺤﻜﻢ‪ ،‬وﻟﻠﻤﺮاﺳﻠﺔ ﻫﺬا‬
‫‪Khalid_ESSAADANI@Hotmail.fr‬‬ ‫ﻋﻨﻮاﻧﻨﺎ اﻹﻟﻜﱰوين‪:‬‬

‫وﻫﻨﺎ رﻗﻢ ﻫﺎﺗﻔﻲ‪ ،‬ﻓﻘﻂ ﳌﻦ ﻛﺎن ﻋﲆ ﻋﺠﻠﺔ ﻣﻦ أﻣﺮه‪:‬‬

‫‪0673-07-51-05‬‬

‫أﺧﻮﻛﻢ ﰲ ﷲ‪ :‬ﺧﺎﻟﺪ اﻟﺴﻌﺪاين‬

‫‪89‬‬

Vous aimerez peut-être aussi