מדריך ASP – עבודה מול DB – חלק ב'

האובייקט RecordSet

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

יצירת האובייקט:

VBScriptJScript

<%
    Set rs = Server.CreateObject("ADODB.Recordset")
%>


<%
    var rs = Server.CreateObject("ADODB.Recordset")
%> 


עכשיו המשתנה rs מחזיק מופע לאובייקט RecordSet

פתיחת האובייקט:

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

• ע"י המתודה Execute של האובייקט connection. המטודה מחזירה אובייקט מסוג RecordSet:

VBScriptJScript

<%
    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:

VBScriptJScript

<%
    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 את הקישור לאובייקט החיבור.
פנייה לשדה מסויים ברשומה הנוכחית נעשית כך:

VBScriptJScript

<%rs("fldName")%>


<%rs("fldName").value%> 

המאפיין RecordCount


המאפיין RecordCount מכיל את מספר הרשומות שנמצאות ב-RecordSet, כלומר, מספר הרשומות בבסיס הנתונים שנמצאו מתאימות לשאילתה שלנו.

VBScriptJScript

<%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 ואת סיסמאותיהם:

VBScriptJScript

<%
   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.

לדוגמא, אם הטבלה שלנו נראית כך:





הפלט של התוכנית הזו:

VBScriptJScript

<%
    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:

VBScriptJScript

<%
   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:

VBScriptJScript

<%
    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:

VBScriptJScript

<%
    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:

VBScriptJScript

<%
   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:

VBScriptJScript

<%
    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)
%> 

תגיות: , , , , , , ,

תגובות בפייסבוק