PracticU

מודל שכבות - Stored Procedures

בלי כתוביותעם כתוביות
PracticU › קורס ADO.NET - חיבור אתר למסד נתונים › מודל שכבות - Stored Procedures
מילון מושגים:
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
פרוצדורה מאוחסנת - קטע קוד SQL שמור במסד הנתונים שאפשר להפעיל לפי שם, לביצוע חוזר של פעולות על הנתונים.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
ממשק - נקודת מגע בין רכיבים: ממשק משתמש שבו אדם מפעיל תוכנה, או ממשק תכנותי שמגדיר אילו פעולות רכיב אחד חושף לאחר.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.

מודל שכבות - Stored Procedures
הרצאה זו מראה כיצד מפעילים Stored Procedure דרך מודל השכבות. לשכבת הגישה לנתונים אין צורך לדעת אם מדובר בשאילתה רגילה או בפרוצדורה, כי היא רק מבצעת את הפקודה שהתקבלה.
השלבים העיקריים
1. הפונקציה בלוגיקה: בשכבת הלוגיקה כותבים פונקציה כמו UpdateProduct שמקבלת מזהה, שם ומחיר. היא יוצרת Command עם שם הפרוצדורה, מגדירה את CommandType כ-StoredProcedure, ומוסיפה את הפרמטרים כולל מזהה המוצר.
2. העברה ל-DAL: הפונקציה מעבירה את הפקודה לשכבת הגישה, שמבצעת אותה בלי קשר לסוג הפקודה.
3. קריאה מהממשק: הדף קורא לפונקציה בלוגיקה ומעביר את הערכים מתיבות הטקסט, כולל המרה למספר ולעשרוני.
4. החזרת טבלה: פונקציה נוספת בלוגיקה מביאה את כל המוצרים דרך GetTable של ה-DAL, והממשק מציג אותם בגריד.
טעויות נפוצות
המרצה הדגיש שהדף לא צריך לכלול שום קוד חיבור. אם מוסיפים חיבור ישירות לדף, חוזרים למצב הישן שבו הקוד מעורבב.
שימו לב
ההבדל בין שאילתה לפרוצדורה נשאר בתוך הלוגיקה, ואילו הממשק נשאר פשוט לחלוטין.
השיעור הבא בקורס: LINQ ל- Objects

פרקי ההרצאה: מודל שכבות - Stored Procedures

  1. 00:00

    הפעלת Stored Procedure בשכבות

  2. 01:03

    בניית הפונקציה בביזנס לוג'יק

  3. 03:02

    הוספת לחצן ל-UI

  4. 06:18

    טיפול בחריגת פרמטר

  5. 06:57

    הגדרת CommandType

  6. 08:02

    החזרת DataTable

  7. 09:35

    הצגה ב-GridView

  8. 12:20

    סיכום תפקידי השכבות

תמלול ההרצאה: מודל שכבות - Stored Procedures

הטקסט המלא של הדקות הראשונות בהרצאה «מודל שכבות - Stored Procedures» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:01

    הדבר הבא שאנחנו הולכים לראות זה איך ניתן להשתמש במודל השכבות שבנינו בכדי להפעיל סטורט פרסיג'ר. אז ראשית הדל כבר מוכן ותאמינו או לא הוא תומך גם בהפעלה של סטורט פרסיג'ר.

  2. 00:16

    מה שאנחנו צריכים לעשות זה רק ללכת לאזור של הביזנס לוג'יק ולהגדיר פונקציה שעושה פעולה מסוימת עם סטורט פרסיג'ר.

  3. 00:24

    לדוגמה בשיעור הקודם אנחנו כתבנו סטורט פרסיג'ר שמסוגלת לעדכן מוצר קיים אז אנחנו רוצים להפעיל אותה. לכן בלוגיקה אנחנו כותבים public void update product שמקבל את int product ID, מקבל את string product name ומקבל את decimal unit price.

  4. 00:54

    הפונקציה הזאת עכשיו הולכת לקרוא לסטורט פרסידג'ר שבנינו שנקראת update product ובעזרת הפרמטרים שהיא קיבלה לעדכן את המוצר שהproduct ID שלו נשלח כאן.

  5. 01:07

    אז מה שאנחנו צריכים בסך הכל זה פחות או יותר אותו הדבר מה שעשינו בפונקציה הקודמת, בואו נעתיק אותם, נדביק ונראה מה יש לנו. יש לנו sql command, ה-command text הפעם זה השם של ה-stored procedure, ממש כמו שראינו כשעבדנו עם stored procedures, אז בואו נגדיר update product,

  6. 01:28

    זה השם של ה-stored procedure שקיימת לי במסד הנתונים, ויש ל-stored procedure הזאת שלושה פרמטרים, יש לה product name, יש לה unit price, וכמובן שיש לה גם את product ID.

  7. 01:40

    בואו נוסיף כאן פרמטר נוסף עבור product ID, שמקבל את ה-product ID שנשלח לפונקציה הזאת. בדל יש לנו את הפונקציה insert update delete, שמסוגלת גם להפעיל stored procedure.

  8. 01:59

    סך הכל הפונקציה בדל מקבלת קומנד. זה לא מעניין אותה האם הקומנד מכיל שאילתת SQL עם פרמטרים או בלי פרמטרים, וזה לא מעניין אותה האם הקומנד מכיל נתונים לגבי stored procedure עם פרמטרים או בלי פרמטרים.

  9. 02:13

    כל מה שהפונקציה הזאת בדל עושה זה פשוט מוציאה לפועל את הקומנד הזה. אוקיי בואו נסתכל שוב על ה-Stored Procedure שקיימת לנו בתוך מסד הנתונים.

  10. 02:26

    ניגש לאזור הפרוגרמביליטי נפתח את ה-Stored Procedures ונראה שיש לנו פה Stored Procedure שנקראת Update Product אנחנו רואים אותה פה למטה.

  11. 02:37

    אם אני אפתח אותה עוד אז אני אראה גם את הפרמטרים שיש לה והפרמטרים שיש לה זה שלושת הפרמטרים שראינו Product ID, Product Name, Unit Price.

  12. 02:49

    עכשיו אנחנו יכולים פשוט לקרוא לה ולהפעיל אותה דרך ה-UI. איך אנחנו עושים את זה? ה-UI קורא אך ורק לפונקציות בביזנס לוג'יק, במקרה הזה ל-Update Product.

  13. 03:02

    אז בואו נחזור ל-UI ונבלע לנו ב-UI אפשרות להפעיל את הפונקציה הזאת. אז מה שאנחנו נעשה, אנחנו נוסיף גם פרמטר עבור קוד המוצר, בואו נוסיף אותו פה למטה, נקרא לזה Product ID, יש לנו את תיבת הטקסט TXT Product ID, ולחצן נוסף שיקרא לסטורט פרוסייג'רס.

  14. 03:41

    נקרא ללחצן btn update product text update product ונגדיר לו אירוע נוסף, אירוע אחר שיבצע את הקריאה לפונקציה המתאימה בביזנס לוג'יק. בואו נלך לדיזיינר, דאבל קליק על הלחצן, אנחנו מגיעים לקוד שלו בצד השרת ובקוד הזה אני שוב רוצה לבנות אובייקט product logic.

  15. 04:13

    אם כל הפונקציות שלי בצד של השרת צריכות את אותו אובייקט, אני יכול להעלות אותו לכאן אם לא כל הפונקציות צריכות את אותו אובייקט אלא רק חלק מהם לא כדאי להעלות את הפונקציה את האובייקט הזה לאזור הגלובלי מפני שאז כל לחצן שלא צריך את האובייקט הזה גורם לריצה לשרת והשרת ייצור את האובייקט הזה לחינם

  16. 04:32

    אבל כרגע שתי הפונקציות האלה צריכות את האובייקט שלנו ולכן אני אגדיר את האובייקט פה גלובלי בשביל לחסוך בקוד. עכשיו יש לנו כאן את האובייקט עצמו product logic ואני קורא לפונקציה update product שבנינו.

  17. 04:49

    אני שולח לה עכשיו convert to int 32 של txt product ID נקודה טקסט. אני שולח אליה את txt product name נקודה טקסט ואני שולח לה את convert to decimal של txt unit price נקודה טקסט.

  18. 05:20

    בואו נסתכל כרגע על הקריאה לפונקציה ואנחנו נראה שהקריאה הולכת להתבצע בביזנס לוג'יק. כלומר מהלחצן שב-UI אני קורא דרך האובייקט productlogic לפונקציה update product שנמצאת ב-BusinessLogic.

  19. 05:37

    בואו נבדוק את זה. נסתכל על מסד הנתונים ונראה לדוגמה את המוצר צ'אי ID 1 יש לו מחיר 20. אז כעת אנחנו יכולים להריץ את האתר אבל אסור לנו לשכוח שה-command.command type צריך להיות stored procedure מפני שאנחנו מתארים כרגע stored procedure.

  20. 06:12

    בואו נריץ. נגדיר שם מוצר צ'אי 2, נגדיר unit price 30 ונגדיר product ID 1 שזה הקוד של צ'אי.

  21. 06:23

    Update product, אנחנו רואים שהוא התבצע בהצלחה. בואו נבדוק את מסד הנתונים. נראה refresh ואנחנו רואים צ'אי 2 שעולה 30. זאת אומרת שדרך מודל השכבות הצלחנו בקלות להריץ סטורט פרוסיג'ר.

  22. 06:39

    סך הכל הפונקציה שכתובה בביזנס לוג'יק צריכה להתמודד עם סטורט פרוסיג'ר, זה הכל. עכשיו מה קורה אם אני רוצה לקבל בחזרה טבלה? אז אני רוצה לקבל בחברת טבלה על ידי החברת data table וכמובן אני רוצה גם להציג את הנתונים בגריד.

  23. 06:58

    אז מה שנעשה זה פונקציה ב-Business Logic שמחזירה data table לאזור של ה-UI. נקרא לפונקציה הזאת getProducts ובוא נניח שאנחנו רוצים להביא את כל המוצרים. אז יש לנו פה פונקציה getProducts ואנחנו פשוט צריכים לייצר command.

  24. 07:26

    בואו ניקח את ה-command הזה, נגדיר לו command.txt Select all from products וכל מה שאנחנו רוצים לעשות זה להחזיר dal.get table שבנינו ולתת לה את הקומנד.

  25. 07:56

    הקומנד כבר מחזיק בתוכו את השאילתה הדרושה. פונקציית get table ב-dal מחזירה לי אובייק דאטה טייבל ואני מהביזלוג'יק מחזיר את זה ל-UI. עכשיו אנחנו ב-UI, כלומר ב-user interface צריכים רק לקלוט את זה ולהציג את זה.

  26. 08:12

    בואו ניקח כאן אפילו hr, הוריזונטל רואו, יש לנו פה עוד לחצן, SP.2 בטן, ID.GetProducts, GTN.GetProducts, Run at Server, והטקסט שעליו יגיד לנו GetProducts או Show Product.

  27. 08:48

    אנחנו צריכים גם Grid View, ID.MyGrid, Run at Server, ניגש לדיזיינר בכדי ללחוץ דאבל קליק על הלחצן, וכעת כל מה שאנחנו רוצים לעשות זה להביא את הנתונים לתוך הגריד, אז יש לנו את mygrid.datasource הולך להיות מה שחוזר מפרודקטס לוג'יק, נקודה get products בנוסף mygrid.databind.

  28. 09:42

    בואו נריץ ואנחנו כעת יכולים ללחוץ על הלחצן ולראות את כל המוצרים מוצגים. זאת אומרת שגם הצלחנו להביא טבלה שלמה, יכולנו גם להביא דאטה סט דרך מודל השכבות כאשר ה-UI, כלומר הדף קורא לביזנס לוג'יק לפונקציה המתאימה שהיא מאוד מאוד ייעודית וספציפית לדבר שאנחנו

  29. 10:06

    רוצים. אם לא היינו צריכים את הפונקציונליות הזאת לא היינו הולכים ובונים אותה. אם אני צריך פונקציונליות מסוימת אז אני הולך ובונה ספציפית את הפונקציונליות הזאת ואז הפונקציונליות מקבלת את מה שהיא צריכה לדוגמה כאן היא קיבלה את הפרמטרים של עדכון מוצר כאן

  30. 10:22

    היא קיבלה את הפרמטרים של הוספת מוצר וכאן היא לא הייתה צריכה לקבל כלום כי היא פשוט רצתה את כל המוצרים. שאילתת sql או מייצר קריאה לסטור פרסיג'ר שולח את הבקשה לדל הדל מתמודד עם כל הנוהל של ה-connection וה-adapter בשביל לגשת למסד הנתונים ולהביא את הנתונים וכך דרך מודל השכבות אנחנו יכולים

  31. 10:50

    לבצע מספר שכבות שכל אחת מהן מטפלת במשהו אחר הדל מה שהוא עושה הוא רק מקשר בין המידע לבין מסד הנתונים והקו האחרון שלנו אל מסד הנתונים יש בו מספיק קוד בשביל להפוך אותו ל-DLL נפרד.

  32. 11:09

    הביזנס לוג'יק מכיל לי את הלוגיקה הדרושה לאפליקציה, ורק כאן יש לי את שאילתות ה-SQL אם בכלל, או קריאות ל-Store Procedure. שאילתות SQL לא נמצאות בדל ולא נמצאות ב-UI.

  33. 11:24

    הסיבה שהן לא נמצאות בדל, כי שאילתות SQL הן תמיד קשורות למסד נתונים ספציפי של אתר אינטרנט מסוים או של מערכת מסוימת. דל הוא בנוי באופן כללי בשביל להתאים לכל האפליקציות שאנחנו נשתמש בהן לכן אנחנו לא יכולים להרשות לעצמנו בדל להגדיר משהו שהוא ספציפי לגבי אפליקציה אם תסתכלו על הדל תראו שהוא לא מכיל שום דבר

  34. 11:46

    שקשור לאפליקציה ספציפית הוא ממש ממש כללי שמתאים לכל האפליקציות כל אפליקציה יכולה לבצע open כל אפליקציה יכולה לבצע close כל אפליקציה יכולה לבצע insert update delete get table update table וכולי סך הכל הדבר הזה הולך להיות dll נפרד שאחר כך אני אני יכול להשתמש איתו איפה שאני רוצה.

  35. 12:07

    הביזנס לוג'יק מכיל את הלוגיקה הספציפית שהאפליקציה שלי צריכה. אם אפליקציה לא צריכה משהו אני לא בונה אותו סתם.

  36. 12:15

    ושימו לב הדבר הכי חשוב מה יש באזור של ה-UI. תסתכלו מה ההבדל בין הדף אינטרנט שעבדנו איתו עד עכשיו בשיעורים הקודמים ב-idio.net רק בשביל להכיר את הנפשות הפועלות של-idio.net זה היה פשוט דף מפלצתי שהיה בו קונקשן וקומנד ודאטה אדאפטר וקומנד בילדר והמון המון המון הגדרות וכעת

  37. 12:39

    הדף הזה נראה ממש ממש ריק ומחזיק רק פתיחת אובייקט וקריאה לפונקציות בשביל להפעיל את הלוגיקה שנמצאת בביזנס לוג'יק. אני כמובן אמור להוסיף כאן טיפול בשגיאות ובחריגות אבל זה נושא שלמדנו ב-asp.net.

  38. 12:57

    כעת אני מסתכל על הדף שלי ואני רואה שהוא ממש ריק, נקי ואותו מתכנת שיעבוד על האתר אינטרנט שלנו ויבצע פעולות על הדפים עצמם מבחינת העיצוב ויבחר לנו כל מיני עיצובים שונים, יגדיר css, יבצע פעולות שקשורות לעיצוב הוא מסתכל על מינימום

  39. 13:18

    קוד שקשור למסד הנתונים ויהיה לו הרבה יותר קל לעבוד והרבה יותר קשה להרוס דברים שקשורים למסד הנתונים ולא קשורים לעבודה שלו של עיצוב.

  40. 13:29

    אז זה בעצם היכולת הכי גדולה המראה הזה של הדף אינטרנט שהוא ממש מינימום קוד רק את הפעולות שאני צריך, אני עוטף אותם בפונקציות וקורא להם.

  41. 13:42

    עכשיו נשאר עוד דבר אחד להוסיף בדל שבאמת כדאי להוסיף אותו וזה טיפול מאוד מאוד ספציפי במשהו שיכול לקרות. יכול להיות מצב שאנחנו שולחים לפונקציה בדל על ידי הקומאנד שאילתה שהיא לא הגיונית.

  42. 13:59

    כשאני בונה מחלקה אני צריך לטפל בכל מיני שגיאות שעלולות לקרות כאשר שולחים לי מידע מבחוץ. אם אני בונה את הדל אני לא יודע ברמת העיקרון מי הולך להשתמש בדל, אולי בעוד שנתיים מתכנת אחר ייקח את הדל הזה וישתמש בו לצרכים כלשהם ויכול להיות שהוא יביא לי קומנד עם שאילתה

  43. 14:19

    שהיא בכלל לא קיימת. אם הקונקשן שלי סגור אז אני פותח אותו. אם אני אנסה להוציא לפועל שאילתה שלא קיימת מה שיקרה זה תתבצע חריגה. אקספצ'ן לא קרה שום דבר פשוט מאוד הבן אדם טעה אז כמובן הוא יחטוף אקספצ'ן אבל מה שלא בסדר שעשיתי זה לא סגרתי את הקונקשן במידה ואני פתחתי אותו אם הייתה אקספצ'ן.

  44. 14:45

    כלומר אם אני פותח קונקשן אני חייב לדאוג לסגור אותו no matter what, לא משנה מה קרה, הצלחתי להוציא לפועל את הפקודה, לא הצלחתי להוציא לפועל את הפקודה כי היה אקספצ'ן, אם אני פותח אותו אני צריך לסגור אותו.

  45. 14:57

    בשביל לטפל בסיטואציה הזאת יש לנו אפשרות

לקורס המלא: קורס ADO.NET אונליין

ההרצאה הקודמת: מודל שכבות - DAL

ההרצאה הבאה: LINQ ל- Objects

הרצאות קשורות מקורסים אחרים

  • מודל שכבות
  • שימוש ב-Stored Procedures
  • יצירה של Stored Procedures ב-SQL
  • מודל OSI - שבע שכבות

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס תכנות מתקדם - #Advanced .NET C
  • קורס WCF - תקשורת למתקדמים בדוט-נט