מדריך ASP – עבודה מול DB – חלק ב'
האובייקט RecordSet
האובייקט RecordSet משמש לשליפת ותמרון מידע מבסיס הנתונים.
כדי להשתמש בערכים המוחזרים משאילתה, יש להציבת בתוך אובייקט זה.
יצירת האובייקט:
<% Set rs = Server.CreateObject("ADODB.Recordset") %>
<% var rs = Server.CreateObject("ADODB.Recordset") %>
עכשיו המשתנה rs מחזיק מופע לאובייקט RecordSet
פתיחת האובייקט:
כדי לפתוח אובייקט RecordSet, יש להגדיר לו את החיבור לבסיס הנתונים, באמצעות מופע של אובייקט connection.
ישנן שתי דרכים לעשות זאת:
• ע"י המתודה Execute של האובייקט connection. המטודה מחזירה אובייקט מסוג RecordSet:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") conn.Open "myDSN" SQLstr="SELECT * FROM tblName" Set rs = conn.Execute SQLstr %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs, SQLstr conn.Open ("myDSN") SQLstr="SELECT * FROM tblName" rs = conn.Execute (SQLstr) %>
• ע"י המתודה Open של האובייקט Recordset:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" SQLstr="SELECT * FROM tblName" rs.Open SQLstr,conn %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") SQLstr="SELECT * FROM tblName" rs.Open (SQLstr,conn) %>
בשתי הדרכים אנו מספקים לאובייקט RecordSet את הקישור לאובייקט החיבור.
פנייה לשדה מסויים ברשומה הנוכחית נעשית כך:
<%rs("fldName")%>
<%rs("fldName").value%>
המאפיין RecordCount
המאפיין RecordCount מכיל את מספר הרשומות שנמצאות ב-RecordSet, כלומר, מספר הרשומות בבסיס הנתונים שנמצאו מתאימות לשאילתה שלנו.
<%Response.Write "There are " & rs.RecordCount & " results"%>
<%Response.Write ("There are " + rs.RecordCount + " results")%>
המאפיינים EOF ו- BOF
BOF – Beginning of Recordset מחזיר true כאשר הסמן נמצא בדיוק לפני הרשומה הראשונה.
EOF – End of Recordset מחזיר true כאשר הסמן נמצא בדיוק אחרי הרשומה האחרונה.
כדי לעבור בלולאה על תוכנו של recordset, נשתמש במאפיין זה כתנאי עצירה ללולאה. נסיון לפנות לרשומה כאשר הסמן נמצא בסוף ה-recordset תביא לשגיאה.
הדוגמא הבאה תציג לנו את רשימת כל המשתמשים הרשומים בטבלה SiteUsers ואת סיסמאותיהם:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" SQLstr="SELECT * FROM SiteUsers" rs.Open SQLstr,conn Do While Not rs.EOF ' while not at end of file Response.Write "Login: " & rs("Login") Response.Write ", Password: " & rs("Password") & "<BR>" rs.MoveNext ' Move to the next record Loop %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") SQLstr="SELECT * FROM SiteUsers" rs.Open (SQLstr,conn) while (!rs.EOF){ // while not at end of file Response.Write ("Login: " + rs("Login").value) Response.Write (", Password: " + rs("Password").value) Response.Write ("<BR>") rs.MoveNext() //Move to the next record } %>
מעבר בין רשומות ב-Recordset:
MoveFirst – יחזיר את הסמן לרשומה הראשונה
MoveLast – יעביר את הסמן לרשומה האחרומה.
MoveNext – יעביר את הסמן לרשומה הבאה.
MovePrevious – יחזיר את הסמן רשומה אחת אחורה.
Move i – יעביר את הסמן לרשומה שמספרה i.
לדוגמא, אם הטבלה שלנו נראית כך:
הפלט של התוכנית הזו:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" SQLstr="SELECT * FROM Names" rs.Open SQLstr,conn rs.Move 3 Response.Write rs("Name") rs.MoveNext Response.Write rs("Name") rs.MoveLast Response.Write rs("Name") rs.MovePrevious Response.Write rs("Name") rs.MoveFirst Response.Write rs("Name") rs.Close Set rs = Nothing %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") SQLstr="SELECT * FROM Names" rs.Open (SQLstr,conn) rs.Move (3) Response.Write (rs("Name").value) rs.MoveNext Response.Write (rs("Name").value) rs.MoveLast Response.Write (rs("Name").value) rs.MovePrevious Response.Write rs("Name").value) rs.MoveFirst Response.Write rs("Name").value) delete rs; rs = null; conn.Close delete conn; conn = null; %>
יהיה:
Zohar,Roni,Eliran,Reuven,Moshe
חיפוש רשומה
על מנת לחפש רשומה מסויימת, נשתמש בשיטה Find
rs.Find Criteria,SkipCurrent,SearchDirection,Start
Criteria – מחרוזת החיפוש
SkipCurrent – האם לדלג על הרשומה הנוכחית (עליה מצביע הסמן). כברירת מחדל, אפשרות זו היא true.
SearchDirection – באיזה כיוון יתבצע החיפוש. ברירת המחדל היא קדימה.
הערכים שמאפיין זה יכול לקבל הם 0 (קדימה) או 1 (אחורה).
Start – מאיזו רשומה להתחיל לחפש. ברירת המחדל היא מהרשומה הנוכחית.
אם הרשומה נמצאה – הסמן עובר ומצביע עליה. אם הרשומה לא נמצאה, EOF יהיה true.
בדוגמא הבאה אנו מחפשים את השם inbal, כשהכיוון הוא קדימה, ומתחילים מרשומה מס' 1:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" SQLstr="SELECT * FROM Names" rs.Open SQLstr,conn rs.Find "Name='Inbal'", false, 0, 1 If rs.EOF Then Response.Write "The Name you search wasn't found" Else Response.Write "The name " & rs("Name") & " has the ID " & rs("ID") End If rs.Close conn.Close Set rs = Nothing Set conn = Nothing %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") SQLstr="SELECT * FROM Names" rs.Open (SQLstr,conn) rs.Find ("Name='Inbal'", false, 0, 1) if (rs.EOF) Response.Write ("The Name you search wasn't found") else{ Response.Write ("The name " & rs("Name").value) Response.Write (" has the ID " & rs("ID").value) } delete rs; rs = null; conn.Close delete conn; conn = null; %>
עכשיו, לאחר שאנו יודעים לעבוד עם האובייקט RecordSet, נעבור על ההגדרות המתקדמות שלו.
מבנה מתקדם של השיטה Open
rs.Open query,connection,cursor type,lock type
כבר למדנו על הצבת השאילתה וביצוע הקשר עם אובייקט ה-connection. כעת נראה את שני הפרמטרים האופציונליים הנוספים של השיטה: סוג סמן וסוג נעילה.
סוגי סמן Cursor Types:
ישנם סוגי סמנים שונים המספקים פונקציונליות שונה, והתאמה מדוייקת של הסמן לצרכי הסקריפט תביא ליעילות מירבית בעבודה עם ה-RecordSet.
כמו כן, חלק מהשיטות של האובייקט RecordSet (כמו למשל, MoveFirst) הינן זמינות רק בסוג מסויים של סמנים.
הסוגים האפשריים:
Forward Only – זהו סמן ברירת המחדל במקרה שלא מגדירים סוג סמן.
הסמן מאפשר תנועה קדימה בלבד (השיטה MovePrevious תגרום לשגיאה). סמן זה גם אינו תומך בשיטה RecordCount.
אין אפשרות לעדכן נתונים בתוך הRecordSet כאשר הסמן הוא Forward Only .
סמן זה הוא הקל והמהיר מכולם. נשתמש בו כאשר אנו רוצים לעבור בצורה חד פעמית על כל הרשומות ב-Recordset ולהציגן.
מספרו הוא 0.
Dynamic – מאפשר את כל סוגי התנועה ברחבי ה-RecordSet , ועידכון הרשומות. ייתרונו בכך שבמהלך היותו פתוח הוא מתעדכן אוטומטית בכל השינויים שנעשו בבסיס הנתונים. אך ייתרון זה גורם לו להיות מאוד כבד ואיטי, לכן רצוי להשתמש בו רק כאשר זה נחוץ.
מספרו הוא 2.
KeySet – כמו הסמן הדינמי, מאפשר תנועה חופשית ועדכון הרשומות, אך מרגע פתיחתו הוא אינו מתעדכן יותר, ולא מאפשר גישה לרשומות שנוספו ע"י משתמשים אחרים לאחר פתיחתו.
מספרו הוא 1.
Static – תומך בכל סוגי התנועה אך אינו מאפשר לבצע שינויים בנתונים, וגם אינו מתעדכן בשינויים שנעשו ע"י אחרים.
נשתמש בו כאשר אין בכוונתינו לבצע שינויים בנתונים אך אנו רוצים תנועה חופשית שסמן מסוג Forward Only אינו מאפשר לנו.
מספרו הוא 3.
כאשר אין אנו מציינים את סוג הסמן, או שמקבלים את ה-RecordSet ישירות משיטת ה-Execute של אובייקט ה-Connection, הסמן יהיה תמיד Forward Only.
קביעת סוג הסמן:
ישנן שתי דרכים לקביעת סוג הסמן
בזמן פתיחת אובייקט ה-RecordSet:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" SQLstr="SELECT * FROM Names" rs.Open SQLstr,conn, 3 'Static cursor %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") SQLstr="SELECT * FROM Names" rs.Open (SQLstr,conn, 3) //Static cursor %>
ע"י הצבת ערך במאפיין CursorType:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" rs.ActiveConnection=conn rs.CursorType=2 'KeySet cursor SQLstr="SELECT * FROM Names" rs.Open SQLstr %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") rs.ActiveConnection=conn rs.CursorType=2 //KeySet cursor SQLstr="SELECT * FROM Names" rs.Open (SQLstr) %>
סוגי נעילה (LockType)
מאפיין חשוב נוסף של אובייקט ה-RecordSet הוא סוג הנעילה.
באפליקציה מרובת משתמשים, עלול להווצר מצב שברגע נתון, שני משתמשים או יותר ינסו לבצע שינוי על המידע בבסיס הנתונים. לכן רצוי להגדיר את סוג הנעילה שתתבצע על בסיס הנתונים.
Read Only – כאשר אנו מגדירים סוג זה של נעילה, ישנה האפשרות לקרוא את נתוני ה-RecordSet, אך לא לשנותם. זוהי נעילת ברירת המחדל כאשר לא מגדירים נעילה אחרת.
מספרה הוא 1.
Pessimistic – מרגע פתיחת ה-RecordSet ועד סגירתו, אף משתמש אחר אינו יכול לבצע שינויים על בסיס הנתונים.
מספרה הוא 2.
Optimistic – הנעילה תתבצע רק ברגע העדכון עצמו, תשתחרר מייד לאחר סיומו ותאפשר למשתמשים אחרים לבצע עידכונים.
מספרה הוא 3.
כמו בסוג הסמן, ישנן שתי דרכים לקביעת סוג הנעילה
בזמן פתיחת אובייקט ה-RecordSet:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" SQLstr="SELECT * FROM Names" rs.Open SQLstr,conn, 2 , 3 '2= KeySet cursor, 3=Optimistic lock type %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") SQLstr="SELECT * FROM Names" rs.Open (SQLstr,conn, 2 , 3) // 2= KeySet cursor, 3=Optimistic lock type %>
ע"י הצבת ערך במאפיין LockType:
<% Dim conn, rs, SQLstr Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.Open "myDSN" rs.ActiveConnection=conn rs.CursorType = 2 'KeySet cursor rs.LockType = 3 ' Optimistic SQLstr="SELECT * FROM Names" rs.Open SQLstr %>
<% var conn = Server.CreateObject("ADODB.Connection") , rs = Server.CreateObject("ADODB.Recordset") , SQLstr conn.Open ("myDSN") rs.ActiveConnection=conn rs.CursorType = 2 // KeySet cursor rs.LockType = 3 // Optimistic SQLstr="SELECT * FROM Names" rs.Open (SQLstr) %>
תגובות בפייסבוק