בולנט - דברים מיוחדים...     פרוטו - בניית אתרים

Israeli ASP Organization

ארגון ה-ASP הישראלי

מאמרים/דוגמאות קוד
קישורים
ספרות
חיפוש כללי:

חפש!
כלליHTMLASPASP.NETSQLמסדי נתוניםJavaScriptXML * XSLDHTML * CSSעיצוב וגרפיקהשרתיםComponentsפרסום ושיווקקידום אתריםקופירייטינגPHP
פרסומת
דף ראשי מדורים דרושים הרשמה למועדון אודותינו צור קשר
מיקום: מאמרים ודוגמאות קוד > ASP

הגדרות RecordSet מתקדמות

הקדמה

כל ספר העוסק ב ASP או VB והמכבד את עצמו מקדיש פרק אחד או שניים לנושא עבודה עם בסיס נתונים.
לצערי ראיתי כי ישנם מספר נושאים חשובים שלא מקבלים התייחסות מספקת במרבית ספרי הלימוד (ברוב המקרים לא מקבלים התייחסות כלל ) וחבל. החלטתי להוציא סדרת מאמרים "סוגיות בעבודה עם מסדי נתונים" אשר תעסוק בחלק מנושאים אילו. מאמר זה, הראשון בסדרה, יעסוק בהגדרות מתקדמות של הrecordset ( סוגי סמנים Cursor Type וסוגי נעילותType Locking ). המאמר מיועד לאילו שכבר שולטים בעבודה עם בסיסי נתונים ( פתיחת Connections , Recordsets , SQL ) ומעונינים להרחיב את ידיעותיהם.

הגדרות מתקדמות של ה Recordset.

כאשר אנו מקימים recordset מוגדרים שני מאפיינים חשובים הקובעים את התנהגותו Locking Type ו Cursor Type (גם אם לא טרחתם להגדיר אותם הם מוגדרים באופן אוטומטי). הגדרה שגויה של מאפיינים אילו יכולה לפגוע משמעותית בביצועי הסקריפט, ליצור מצב בו חלק מהפונקציות שמעמיד לרשותנו האובייקט ADODB לעבודה עם בסיסי נתונים לא תהיינה זמינות או אף לגרום ל"תקיעה" של התוכנית כולה.

הגדרת Cursor - הסמן של ה RECORDSET

מהו ה Cursor - סמן?

כאשר אנו פותחים Recordset הוא בדרך כלל מכיל כמות של רשומות שנגזרו מבסיס הנתונים, בעזרת הסמן cursor אנו יכולים לדפדף ב Recordset ו"להצביע" על הרשומות השונות. לדוגמה שורת הקוד rec.MoveNext תזיז את הסמן ב Recordset בשם rec רשומה אחת קדימה והפקודה rec.MovePrevious תזיז את הסמן רשומה אחת אחורה.

סוגי סמנים:

כאשר אנו פותחים Recordset אנו יכולים להגדיר ארבע סוגים שונים של סמנים:

סימול מספריקבוע ה ADOתאור קצרסוג הסמן
0adOpenForwardOnlyסמן קדימה בלבדForward – Only cursor
1adOpenKeysetמניעת עריכת מפתחותKeyset cursor
2adOpenDynamicסמן דינמיDynamic cursor
3adOpenStaticסמן סטטיStatic cursor

להלן תאור קצר של כל סוג סמן:

Forward – Only cursor קדימה בלבד
סמן זה מאפשר תנועה קדימה בלבד תוך מעבר פעם אחת בלבד על הרשומות בrecordset , למשל הפקודה rec.MovePrevious תיתן הודעת שגעה שכן הסמן לא מסוגל לזוז אחורה.
בנוסף הסמן לא תומך בתכונה rec.RecordCount האמורה להחזיר לנו את כמות הרשומות ב Recordset (נקבל תמיד תשובה מינוס אחד) זה סמן ברירת המחדל כאשר אנו לא מגדירים את סוג הסמן!!!. למרות מוגבלותו הוא המהיר והיעיל ביותר מכל סוגי הסמנים).

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

Keyset cursor מניעת עריכת מפתחות
זהו סמן המאפשר תנועה קדימה ואחורה וגם מודע חלקית לעדכונים שנעשו ע"י משתמשים אחרים הסמן יזהה עדכון של רשומות קיימות אך לא הוספה ומחיקה של רשומות חדשות.

Dynamic cursor סמן דינמי
סמן זה מאפשר תנועה חופשית ב Recordset וגם מודע כל הזמן לכל שינוי שמבוצע ע"י משתמשים אחרים.

אז כיצד נקבע באיזה סמן נשתמש?

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

כיצד נגדיר את סוג הסמן של ה Recordset בשורות הקוד ?

ישנם מספר דרכים חלופיות להגדיר את סוג הסמן , נבדוק את הקוד הבא:

< !-- #include file="adovbs.inc" --> <% dim con set con=server.CreateObject("adodb.connection") con.Open "dsn=imgdb;" dim rec set rec=server.CreateObject("adodb.recordset") rec.ActiveConnection=con rec.CursorType=adOpenForwardOnly rec.Open "select * from tblClient" %> בשורה הראשונה בקוד אני מכליל לתוך דף ה ASP שלי את הקובץ adovbs.inc . קובץ זה מכיל רשימה של קבועים const העוזרים לנו להגדיר את אוביקט ADO והוא נוצר אוטומטית כאשר מתקינים את ה IIS.
יש לחפש את הקובץ בדיסק של השרת ולהעתיק אותו לספריה באתר שלנו, בה נמצאים דפי ה ASP.
אם תפתחו את הקובץ adovbs.inc תמצאו בו בין היתר את שורות הקוד הבאות:
'---- CursorTypeEnum Values ---- Const adOpenForwardOnly = 0 Const adOpenKeyset = 1 Const adOpenDynamic = 2 Const adOpenStatic = 3 זו רשימה של הקבועים המגדירים את סוג הסמן כפי שתיארתי בטבלה בתחילת המאמר.
שאר שורות הקוד הם פתיחה של Recordset ו Connection סטנדרטים עד שמגיעים לשורה: rec.CursorType=adOpenForwardOnly שורת קוד זו מגדירה את סוג הסמן ל "קדימה בלבד" באותה מידה יכולנו לבחור בסוג סמן אחר.
דרך נוספת להגדרת הסמן היא ללא שימוש בקבועים וללא צורך להכליל את קובץ adovbs.inc לתוך הדף , אלה פשוט להציב את הסימול המספרי של התכונה (כפי שמופיע בטבלה) לדוגמה rec.CursorType=0 שורה זו תיתן תוצאות זהות לחלוטין לשורה הקודמת.

למאמר על קובץ ה-ADOVBS.INC, לחץ כאן

הגדרת סוגי נעילות Locking Type של ה Recordset

מה הוא Locking Type ?

לבסיס הנתונים יכולים לגשת בו זמנית קבוצה גדולה של משתמשים, כל משתמש מבצע פעולות על בסיס הנתונים ויכול להיווצר מצב בו יש התנגשויות בין הפעולות השונות.
לדוגמה נניח שבחנות ספרים וירטואלית לקוח שלף את מחירו ותיאורו של ספר לתוך ה recordset על מנת לבצע תהליך רכישה ובאותו זמן מנהל החנות החליט לסמן את הספר כ "אזל מהמלאי" , הלקוח עובד על רשומה שאיננה מעודכנת ( או אולי כבר לא קימת כלל) דבר זה יכול ליצור בעיות קשות בביצוע הקוד (ועסקת הרכישה כמובן).
ה Locking Type מגדיר את יחסי הגומלין בין היישומים או המשתמשים השונים כאשר הם פונים יחדיו לבסיס הנתונים.

סוגי Locking Type

כאשר אנו פותחים Recordset ניתן להגדיר ארבע סוגי Locking Type שונים:

סימול מספריקבוע ה ADOתאור קצרסוג הנעילה Locking Type
1adLockReadOnlyקריאה בלבדRead Only
2adLockPessimisticנעילה פסימיתPessimistic
3adLockOptimisticנעילה אופטימיתOptimistic
4adLockBatchOptimisticנעילת BATCHBatchOptimistic

להלן תאור קצר של כל סוג נעילה:

Read only קריאה בלבד
סוג זה מאפשר לכמות רבה של משתמשים לקרוא בו זמנית נתונים אולם אינו מאפשר לאף אחד מהם לשנות אותם – זו נעילת ברירת המחדל כאשר אנו לא מגדירים ב Recordset את סוג הנעילה!!!.

Pessimistic - נעילה פסימית
בחירה בסוג נעילה זו ייצור מצב בו כאשר המשתמש פותח את ה RECORDSET ועורך את מסד הנתונים אף משתמש אחר לא יכול לגשת אליו עד סיום תהליך העריכה.

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

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

כיצד נבחר באיזה סוג של נעילה להשתמש?

כעקרון, חשוב להתאים את סוג הנעילה לאופי הפעולות של המשתמש על מנת למנוע "תקיעות" של בסיס הנתונים.
אם למשל נחזור לדוגמה חנות הספרים, הרי שבדף הASP של הקונים אין צורך להגדיר יותר מאשר נעילה של "קריאה בלבד" Read Only ואילו בדף העדכון של מנהל החנות הייתי שוקל להגדיר נעילה פסימית - Pessimistic על מנת למנוע גישה של הגולשים במהלך העדכון.

כיצד נגדיר את סוג הנעילה של ה Recordset בשורות הקוד ?

הגדרת סוג נעילה דומה להגדרת סוג סמן, נבדוק את הקוד הבא:

< !-- #include file="adovbs.inc" --> <% dim con set con=server.CreateObject("adodb.connection") con.Open "dsn=imgdb;" dim rec set rec=server.CreateObject("adodb.recordset") rec.ActiveConnection=con rec.CursorType=adOpenForwardOnly rec.LockType=adLockReadOnly rec.Open "select * from tblClient" %> שימו לב הוספנו לקוד את השורה הבאה: rec.LockType=adLockReadOnly וע"י כך הגדרנו את סוג הנעילה ל Read Only באותה מידה יכולנו לבחור בסוג נעילה אחר או להשתמש ישירות בסימול המספרי של סוג הנעילה כפי שמופע בטבלה.

בהצלחה



         

מחבר: אבי סולימןרמת קושי: 1  ||  ציון: (7.5)כל הזכויות שמורות ל-IAO ©

חנות לסטלן  |   מתכונים  |   חגי ישראל  |   פורטל משחקים  |   חנויות מחשבים ו-ציוד הקפי  |   מגזין מסטול לסטלן המצוי  |   קליפרים  |   גידול צמחים פרחים  |   ספא פינוק מושלם