תל אביב | חיפה | אשקלון
משרד ראשי: רח' הברזל, תל אביב | 03-3741258 | info@iiit.co.il
    
עמוד הבית
מחקר ופיתוח
המכללה
מאגר יועצים
יישומים
מלאו את הפרטים הבאים ליצירת הקשר
שם:
אי-מייל:
הודעה:
פנייה לבסיסי הנתונים

באופן עקרוני הגישה לבסיסי נתונים ב CSA אינה שונה, ניתן להשתמש באובייקטים סטנדרטים של Dot Net, ובאובייקטים "מקשרים".

 

ה CSA עצמו מכיל ספריית אובייקטים "מקשרים" שמטרתם גישה נוחה יותר לבסיס הנתונים ומניעת טעויות. המחלקות לא מחליפות את האובייקטים הסטנדרטים של Dot Net אלא עוטפים אותם.

 

אובייקט DBObject

מטרת ה DBObject היא לסייע לתוכניתן לעבוד מול בסיס הנתונים.

 

כל מחלקה שיורשת מ DBObject מייצגת אובייקט בבסיס הנתונים (טבלה או View). המחלקה מכילה את מבנה הנתונים וההגדרות של הטבלה כפי שהוגדרו בבסיס הנתונים.

 

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

 

משורת התפריט של Visual Studio פתח את CSA Studio

 

ב CSA Studio הקש על מקש Database Connection (בצד שמאל למעלה)

 

וקבל את המסך הבא:

 

אם עדיין לא הגדרת את הקשר או אפילו לא הקמת בסיס נתונים (כמו בדוגמה) הקש על מקש Configure – נושא זה לא יכוסה במאמר זה.

 

הקשה על מקש Save Settings & Build/Rebuild Classes המערכת תייצר עבורך שתי מחלקות עבור כל אובייקט בבסיס הנתונים אחת שיורשת DBObject והשנייה CSASQLDataReader.

 

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

 

מבנה המחלקה שיורשת מ DBObject

 

הערה – מכיוון שהמחלקות נבנות באופן אוטומטי, לא חובה להתעמק בפרק זה וניתן לדלג ישירות לפסקת "אופן השימוש"

 

המחלקה יורשת DBObjecy

ה Constructor של המחלקה

 

מגדיר את שם האובייקט,

מפעיל מתודה להגדרת השדות באובייקט,

מגדיר את השדה/ות במפתח הראשי של הטבלה (במקרה שלאובייקט הוגדר מפתח ראשי בבסיס הנתונים).

 

במחלקה מוגדרים משתנים עבור כל שדה שמוגדר באובייקט

 

המתודה AddObjectFields:

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

 

 

אופן השימוש (DBObject)

 

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

 

שימוש: שימוש במחלקות אחרות

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

 

השימוש ע"י מחלקות אחרות יודגם במאמרים אחרים: ראה RecordPage ו RetrievalGrid

 

 

פעולה: קריאת נתוני רשומה לפי ערך המפתח הראשי

 

דוגמה:

 

הפעולה GetValues(2) תקרא מבסיס הנתונים רשומה שערך המפתח הראשי שלה הוא 2, התכונה HasRecord מאפשרת לבדוק האם נמצאה רשומה עם הערך הרצוי.

 

 

הערה: שליפת הנתונים כולל פתיחה וסגירת Connection באופן אוטומטי, למחלקה שיורשת DBObject אין צורך לבצע Close האובייקט תמיד במצב של Disconnected ואפשר גם לשמור אותו לתווך ארוך

 

 

 

פעולה: קריאת רשומה לפי תנאי חופשי

 

דוגמה:

פעולה זו מגבילה למשפט

Select * From Staff Where LastName='Cohen'

 

כלומר הפרמטר שמעבירים מייצג את ה Where Clause

 

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

 

פעולה: הוספת רשומה חדשה

 

דוגמה:

 

יש להציב ערכים בתכונת NewValue של כל שדה רצוי ולבסוף לבצע Insert()

 

אם בטבלה ישנו שדה מסוג Identity ניתן לאחזר את הערך שהוצב בו בתכונת NewValue של השדה

 

פעולה: עדכון נתוני רשומה קיימת

 

דוגמה:

 

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

 

יש לשים את הערכים החדשים בתכונת NewValue של כל שדה רצוי ולבצע Update()

 

פעולה: מחיקת רשומה

 

דוגמה:

 

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

 

רצוי לבדוק האם אפשר לבטל את הרשומה ע"י הפונקציה canBeDeleted(), הפונקציה מתבססת על ה Relationships שהוגדרו בבסיס הנתונים ובודקת האם יש מצביעים לרשומה בטבלאות מקושרות.

 

לבסוף הפעלת המתודה DeleteRecord() מוחקת את הרשומה.

 

פעולה: ביצוע הרבה פעולות בטרנזקציה אחת

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

 

דוגמה:

 

האובייקט מסוג DBExecutionGroup מאפשר לאכסן מספר בלתי מוגבל של אובייקטים מסוג DBObject ולהפעיל אותם בטרנזקציה אחת ע"י המתודה ExecuteGroup().

 

בכל אובייקט מסוג DBObject מגדירים אם הפעולה הרצויה בתכונת Operation ולא מבצעים את המתודה שמבצעת את הפעולה (Update(), Insert() או DeleteRecord()).

 

טיפול בשדות מסוג Identity

שרת SQL Server מאפשר להגדיר שדה בטבלה כ Identity, הפירוש הוא שבכל פעולת Insert השדה מקבל ערך חד ערכי באופן אוטומטי.

 

לאחר הפעלת מתודת Insert ניתן לראות את הערך שהוקצה לשדה מסוג Identity בתכונת NewValue של השדה.

 

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

לצורך הדוגמה המשימה היא להוסיף לבסיס הנתונים חשבונית. ההוספה כוללת רשומה אחת בטבלת InvoiceHeader ושתי רשומות לטבלת InvoiceLine.

בטבלת InvoiceHeader המפתח הראשי הוא שדה בשם id שמוגדר כ Identity ובטבלת InvoiceLine יש שדה בשם InvoiceHeaderID שיש להציב בו את הערך שהתקבל בשדה id של ה InvoiceHeader

 

הדוגמה הבאה מבצעת את המשימה המתוארת בטרנזקציה אחת:

כאשר רציתי לשתול בשדה InvoiceHeaderID את הערך שניתן לשדה מסוג Identity של הרשומה הראשונה רשמתי NewValueExpression = "@id0".

במילים יותר כלליות:

  • ניתן להשתמש בביטויים (זה פותח אפשרויות שלא יוסברו במאמר זה)
  • המערכת יוצרת באופן אוטומטי משתנה בכל פעם שיש פעולת Insert לטבלה שמוגדר בה שדה מסוג Identity, שם המשתנה הוא: @idX כאשר x הוא המקום הטבלה ב group (הטבלה הראשונה במקום 0).

 

 

 

שימוש ב CSASQLDataReader

מחלקה שיורשת מ CSASQLDataReader מייצגת אובייקט בבסיס הנתונים (טבלה או View) ומיועדת לקריאת נתונים מהאובייקט.

 

אין צורך לבנות את המחלקה באופן ידני. ה CSA בונה את המחלקות באופן אוטומטי בתהליך שהוסבר בפסקה הראשונה במאמר זה.

 

דוגמה:

 

 

הקוד שבדוגמה קורא את העובדים הפעילים וצובר אותם ל List.

 

הפקודה הראשונה מגדירה List (מתוך System.Collections.Generic), ה List יאחסן מופעים של Staff_Record (מחלקה שיורשת DBObject).

 

בניגוד ל DBObject שאותו ניתן לשמור לתווך ארוך מחלקות שיורשות CSASQLDataReader יוצרות חיבור פתוח לבסיס הנתונים, חובה לעשות בהם שימוש קצר ככל הניתן ולבסוף לבצע close.

 

הפקודה

Staff_Reader reader = Staff_Reader.GetStaff_ReaderFromWhereClause("Finished Is Null", "FirstName,LastName");

 

מגבילה למשפט הבא:

Select * From Staff Where Finished Is Null Order By FirstName, LastName

 

כלומר הפרמטר הראשון הוא ה Where Clause והשני הוא ה Order By Clause

 

הפקודה Read() מבצעת קריאה של הרשומה הבאה בתור ושאין רשומה היא מחזירה False.

 

התכונה DataRecord מכילה מופע של המחלקה Staff_Record עם הערכים של הרשומה שנקראה.

 

הפקודה Close() סוגרת את ה Connection ומבצעת Dispose מלא לכל האובייקטים שנעשה בהם שימוש.

 

 

 

 

המכון הישראלי לטכנולוגיות מידע © כל הזכויות שמורות 2012