עבודה עם ADO

‏ • 19 ביוני, 2004

ADO – ActiveX Data Objects הינה טכנולוגיה של מיקרוסופט המשמשת כממשק גישה למסדי נתונים.
ADO מותקן אוטומטית על כל שרת IIS ו-PWS.
במאמר זה נדגים את דרכי העבודה עם ADO

יתרונות השימוש עם ADO



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

חסרונות השימוש עם ADO



  • הדבר שהכי חשוב לרבים – המהירות. העבודה עם SQL על השרת תהיה מהירה יותר בהרבה מקרים, אך לא תמיד.
  • אין צורך להגדיר ולפתוח אובייקט RecordSet. ניתן לבצע Conn.Execute(sql) פשוט.

בואו נתחיל….

ראשית כל, ניצור מסד נתונים מסוג אקסס בשם Ado. יש ליצור טבלה בשם List ולתוכה נזין את הנתונים:













שם שדה סוג נתונים
ID מספור אוטומטי, מפתח ראשי
Name טקסט
Email טקסט

התוצאה אמורה להראות כך


הוספת רשומות למסד הנתונים:

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

Add.html

עמוד HTML המכיל את טופס הוספת הנתונים:










1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26  








<html>
<head>
   <title>הוספת רשומה</title>
</head>
<body dir=“rtl”>
  <h3>הוספת רשומה</h3><br>
  <form action=“Add.asp” method=“post”>
  <table dir=“rtl” width=“60%” align=“center”>
    <tr>
    <td width=“15%” dir=“rtl”>שם מלא:</td>
    <td><input type=“text” dir=“rtl” name=“name” size=“20”></td>
    </tr>
    <tr>
    <td width=“15%” dir=“rtl”> דוא”ל:</td>
    <td><input type=“text” dir=“ltr” name=“email” size=“20”></td>
    </tr>
    <tr>
    <td colspan=“2” align=“center”>
    <input type=“submit” value=” הוספת רשומה “>
    <input type=“reset” value=” החזר ערכים “>
    </td>
    </tr>
  </table>
</form>
</body>
</html>


יצרנו טופס פשוט הכולל את שדה השם ושדה הדוא”ל שיוכנסו למסד הנתונים. הטופס יישלח לעמוד הבא שניצור, Add.asp.

Add.asp

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










1
2
3
4
5
6  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<%
    Dim name, email
    Dim Conn, rs, SQL
    name = Request.Form(“name”)
    email = Request.Form(“email”)


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










1
2
3
4  








    Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & _
             Server.MapPath(“Ado.mdb”)
    Set rs = Server.CreateObject(“ADODB.RecordSet”)


אני מקווה שאין צורך להסביר את הקוד (אם יש, פנו אל מדריך ASP).










1
2
3
4
5
6  








    SQL = “Select * from List”
    rs.Open SQL, Conn, 2, 3
    rs.AddNew
    rs(“name”) = name    
    rs(“email”) = email
    rs.Update


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










1
2
3
4  








    rs.Close
    Set rs = Nothing
    Conn.Close
    Set Conn = Nothing


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










1
2  








    Response.Redirect “List.asp”
%>


כעת נפנה אל העמוד List.asp ונסגור את העמוד.

הקוד במלואו












1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<%
    Dim name, email
    Dim Conn, rs, SQL
    name = Request.Form(“name”)
    email = Request.Form(“email”)

    Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & _
             Server.MapPath(“Ado.mdb”)

    Set rs = Server.CreateObject(“ADODB.RecordSet”)
    SQL = “Select * from List”
    rs.Open SQL, Conn, 2, 3
    rs.AddNew
    rs(“name”) = name    
    rs(“email”) = email
    rs.Update

    rs.Close
    Set rs = Nothing
    Conn.Close
    Set Conn = Nothing
    Response.Redirect “List.asp”
%>



עריכת רשומה במסד הנתונים

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

Edit.asp

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










1
2
3
4
5
6
7  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<html>
<head>
 <title>עריכת רשומה</title>
</head>
<body dir=“rtl”>
  <h3>עריכת רשומה</h3><br>


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










1
2
3
4
5
6  








<%
    Dim ID, Edit, Name, Email
    Dim Conn, rs, SQL

    ID = Request.QueryString(“id”)
    Edit = Request.QueryString(“Edit”)


הגדרנו את כל המשתנים עימם נשתמש. הערך של ID קובע את מספר הרשומה אותה נערוך ואילו ערכו של Edit בודק אם הטופס העריכה נשלח.










1
2
3
4  








      Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & _
             Server.MapPath(“Ado.mdb”)
    Set rs = Server.CreateObject(“ADODB.RecordSet”)


יצירת אובייקט חיבור ורקורדסט.










1
2
3  








      If IsEmpty(ID) or IsNumeric(ID) = False Then ID = 0
      SQL = “Select * from List where ID=”&ID
    rs.Open SQL, Conn


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










1
2
3
4
5  








      If rs.EOF Then
        Response.Write “<h3 align=””center””>הרשומה המבוקשת נמחקה או אינה קיימת במסד הנתונים!</h3>” & vbcrlf
    Else
        If Edit <> “True” Then



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










1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18  








<form action=“?Edit=True&id=<%=ID%> method=“post”>
<table dir=“rtl” width=“60%” align=“center”>
 <tr>
  <td width=“15%” dir=“rtl”>שם מלא:</td>
  <td><input type=“text” dir=“rtl” name=“name” size=“20” value=<%=rs(“name”)%>></td>
 
</tr>
 
<tr>
  
<td width=“15%” dir=“rtl”> דוא”ל:</td>
  <td><input type=text” dir=”ltr” name=”email” size=”20″ value=”<%=rs(email“)%>></td>
 
</tr>
 
<tr>
  
<td colspan=“2” align=“center”>
     
<input type=“submit” value=” עריכת רשומה “>
     
<input type=“reset” value=” החזר ערכים “>
  
</td>
 
</tr>
</table>
</form>


בשורה הראשונה אנחנו מגדירים שזהו טופס שעמוד הפעולה שלו הוא העמוד הנוכחי ונוסיף לו שני ערכים:
ID – ערך מספר הרשומה שלנו שאותה נערוך.
Edit – ערכו יאשר את עריכת הרשומה.
בהמשך הטופס אנחנו מכניסים לשדה שם ואימייל את נתוניהם.










1
2
3
4
5  








<%
    Else
        name = Request.Form(“name”)
        email = Request.Form(“email”)
        rs.Close


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










1
2
3
4
5
6  








      SQL = “Select * from List where ID=”&ID
    rs.Open SQL, Conn, 2, 3
    rs(“name”) = name
    rs(“email”) = email
    rs.Update
    rs.Close


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










1
2
3
4  








        Response.Write “<h3 align=””center””>הרשומה נערכה בהצלחה!<br>” & vbcrlf
        Response.Write “<a href=””List.asp””>חזרה לדף הרשומות</a></h3>” & vbcrlf
    End If
End If


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










1
2
3
4
5
6  








    Set rs = Nothing
    Conn.Close
    Set Conn = Nothing
%>
</body>
</html>


נאפס את הרקורדסט. נסגור ונאפס את אובייקט חיבור ואת תגי ה-HTML של העמוד.

הקוד במלואו











1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<html>
<head>
 <title>עריכת רשומה</title>
</head>
<body dir=“rtl”>
<h3>עריכת רשומה</h3><br>
<%
    Dim ID, Edit, Name, Email
    Dim Conn, rs, SQL

    ID = Request.QueryString(“id”)
    Edit = Request.QueryString(“Edit”)
        
    Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & –
             Server.MapPath(“Ado.mdb”)
    Set rs = Server.CreateObject(“ADODB.RecordSet”)

    If IsEmpty(ID) or IsNumeric(ID) = False Then ID = 0
    SQL = “Select * from List where ID=”&ID
    rs.Open SQL, Conn


    If rs.EOF Then
        Response.Write “<h3 align=””center””>הרשומה המבוקשת נמחקה או אינה קיימת במסד הנתונים!</h3>” & vbcrlf
    Else
        If Edit <> “True” Then
%>
<form action=“?Edit=True&id=<%=ID%> method=“post”>
<table dir=“rtl” width=“60%” align=“center”>
 <tr>
  <td width=“15%” dir=“rtl”>שם מלא:</td>
  <td><input type=“text” dir=“rtl” name=“name” size=“20” value=<%=rs(“name”)%>></td>
 
</tr>
 
<tr>
  
<td width=“15%” dir=“rtl”> דוא”ל:</td>
  <td><input type=text” dir=”ltr” name=”email” size=”20″ value=”<%=rs(email“)%>></td>
 
</tr>
 
<tr>
  
<td colspan=“2” align=“center”>
     
<input type=“submit” value=” עריכת רשומה “>
     
<input type=“reset” value=” החזר ערכים “>
  
</td>
 
</tr>
</table>
</form>
<%
        Else
            name = Request.Form(“name”)
            email = Request.Form(“email”)
            rs.Close
    
            SQL = “Select * from List where ID=”&ID
            rs.Open SQL, Conn, 2, 3
            rs(“name”) = name
            rs(“email”) = email
            rs.Update
            rs.Close

            Response.Write “<h3 align=””center””>הרשומה נערכה בהצלחה!<br>” & vbcrlf
            Response.Write “<a href=””List.asp””>חזרה לדף הרשומות</a></h3>” & vbcrlf

        End If
    End If

    Set rs = Nothing
    Conn.Close
    Set Conn = Nothing
%>
</body>
</html>



מחיקת רשומות


Delete.asp

בעזרת העמוד נוכל למחוק רשומות בעזרת קבלת ערכו של ID בלבד.










1
2
3
4
5
6
7  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<html>
<head>
 <title>מחיקת רשומה</title>
</head>
<body dir=“rtl”>
<h3>מחיקת רשומה</h3><br>


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










1
2
3
4
5
6
7
8  








<%    Dim ID
    Dim Conn, rs, SQL
    ID = Request.QueryString(“id”)

    Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & _
             Server.MapPath(“Ado.mdb”)
    Set rs = Server.CreateObject(“ADODB.RecordSet”)


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










1
2
3  








If IsEmpty(ID) or IsNumeric(ID) = False Then ID = 0
SQL = “Select * from List where ID=”&ID
rs.Open SQL, Conn, 2, 3


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










1
2
3
4
5
6
7  








    If rs.EOF Then
        Response.Write “<h3 align=””center””>הרשומה המבוקשת נמחקה או אינה קיימת במסד הנתונים!</h3>” & vbcrlf
    Else
        rs.Delete
        Response.Write “<h3 align=””center””>הרשומה נמחקה בהצלחה!<br>” & vbcrlf
        Response.Write “<a href=””List.asp””>חזרה לדף הרשומות</a></h3>” & vbcrlf
    End If


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

הקוד במלואו












1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<html>
<head>
 <title>מחיקת רשומה</title>
</head>
<body dir=“rtl”>
<h3>מחיקת רשומה</h3><br>
<%
    Dim ID
    Dim Conn, rs, SQL

    ID = Request.QueryString(“id”)


    Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & _
             Server.MapPath(“Ado.mdb”)
    Set rs = Server.CreateObject(“ADODB.RecordSet”)

    If IsEmpty(ID) or IsNumeric(ID) = False Then ID = 0
    SQL = “Select * from List where ID=”&ID
    rs.Open SQL, Conn, 2, 3
    
    If rs.EOF Then
        Response.Write “<h3 align=””center””>הרשומה המבוקשת נמחקה או אינה קיימת במסד הנתונים!</h3>” & vbcrlf
    Else
        rs.Delete
        Response.Write “<h3 align=””center””>הרשומה נמחקה בהצלחה!<br>” & vbcrlf
        Response.Write “<a href=””List.asp””>חזרה לדף הרשומות</a></h3>” & vbcrlf
    End If
    
    rs.Close
    Set rs = Nothing
    Conn.Close
    Set Conn = Nothing
%>    
</body>
</html>    



הצגת כל הרשומות


List.asp

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










1
2
3
4
5
6
7  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<html>
<head>
 <title>רשימת הרשומות</title>
</head>
<body dir=“rtl”>
<h3>רשימת הרשומות במסד הנתונים</h3><br>


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










1
2
3
4
5
6  








<%
    Dim Conn, rs, SQL
    Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & _
             Server.MapPath(“Ado.mdb”)
    Set rs = Server.CreateObject(“ADODB.RecordSet”)


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










1
2
3
4
5  








      SQL = “Select * from List order by ID”
    rs.Open SQL, Conn
    If rs.EOF Then
        Response.Write “<h3 align=””center””>אין רשומות במסד הנתונים!</h3>” & vbcrlf
    Else


נציג שאילתה המציגה את כל הנתונים המופיעים בטבלה שלנו ונסדר אותם עפ”י סדר ה-ID שלהם בסדר עולה (רגיל). במידה ואין רשומות נציג הודעת פלט מתאימה, אחרת נמשיך את הצגת הרשומות בעמוד.










1
2
3
4
5
6
7
8  








<table dir=“rtl” width=“70%” align=“center”>
 <tr>
  <td width=“5%”><b>#</b></td>
  <td width=“20%”><b>שם מלא</b></td>
  <td width=“30%”><b>דוא”ל</b></td>
  <td width=“10%”><b>עריכה</b></td>
  <td width=“10%”><b>מחיקה</b></td>
 </tr>


ניצור התחלת טבלה פשוטה הכוללת 5 שדות לסידור כל רשומה בשורה.










1
2
3
4
5
6
7
8  








<%Do while not rs.EOF%>
 <tr>
  <td width=“5%”><%=rs(“id”)%></td>
  <td width=“20%”><%=rs(“name”)%></td>
  <td width=“30%”><a href=“mailto:<%=rs(“email”)%>><%=rs(“email”)%></a></td>
  
<td><a href=“Edit.asp?id=<%=rs(“id”)%>>עריכה</a></td>
  
<td><a href=“Delete.asp?id=<%=rs(“id”)%>>מחיקה</a></td>
 </tr>


נתחיל לולאה עד סוף הרשומות (רקורדסט). כל שדה מסודר בתא משלו וכל הרשומה מסודרת בשורה אחת.










1
2
3
4
5  








<%
        rs.MoveNext
        Loop
        Response.Write “</table>” & vbcrlf
    End If


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










1
2
3
4
5
6
7  








    rs.Close
    Set rs = Nothing
    Conn.Close
    Set Conn = Nothing
%>
</body>
</html>


נסגור ונאפס את הרקורדסט ואת אובייקט החיבור ולא לשכוח לסגור תגי HTML בסיסיים.

הקוד במלואו












1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52  








<%@language=”VBSCRIPT” CODEPAGE=”1255″%>
<html>
<head>
 <title>רשימת הרשומות</title>
</head>
<body dir=“rtl”>
<h3>רשימת הרשומות במסד הנתונים</h3><br>
<%
    Dim Conn, rs, SQL
    
    Set Conn = Server.CreateObject(“ADODB.Connection”)
    Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & _
             Server.MapPath(“Ado.mdb”)
    Set rs = Server.CreateObject(“ADODB.RecordSet”)

    SQL = “Select * from List order by ID”
    rs.Open SQL, Conn

    
    If rs.EOF Then
        Response.Write “<h3 align=””center””>אין רשומות במסד הנתונים!</h3>” & vbcrlf
    Else
%>
<table dir=“rtl” width=“70%” align=“center”>
 <tr>
  <td width=“5%”><b>#</b></td>
  <td width=“20%”><b>שם מלא</b></td>
  <td width=“30%”><b>דוא”ל</b></td>
  <td width=“10%”><b>עריכה</b></td>
  <td width=“10%”><b>מחיקה</b></td>
 </tr>
<%    Do while not rs.EOF    %>
 <tr>
  <td width=“5%”><%=rs(“id”)%></td>
  <td width=“20%”><%=rs(“name”)%></td>
  <td width=“30%”><a href=“mailto:<%=rs(“email”)%>><%=rs(“email”)%></a></td>
  
<td><a href=“Edit.asp?id=<%=rs(“id”)%>>עריכה</a></td>
  
<td><a href=“Delete.asp?id=<%=rs(“id”)%>>מחיקה</a></td>
 
</tr>
<%
        rs.MoveNext
    Loop
        Response.Write “</table>” & vbcrlf
    End If
    
    rs.Close
    Set rs = Nothing
    Conn.Close
    Set Conn = Nothing
%>
</body>
</html>


לחצו כאן להורדת הקוד המלא של המאמר

לסיום, מספר הערות



  • הקוד שיצרנו במאמר זה יכול לשמש אתכם כחלק ממועדון חברים, מאגר משתמשים או כל דבר אחר שתרצו (כולל שינוי הקוד).
  • בעזרת עריכת ומחיקת רשומות ניתן לבנות פאנל ניהול עבור שימוש אישי.
  • עדיין עדיף להשתמש ב- ADO על פני SQL למרות חסרון המהירות.
  • מאמר זה רק מדגים את השימוש בהוספת, עדכון ומחיקת רשומות ואינו מלמד את ADO באופן מלא.

בהצלחה!

תגיות: , , , ,

BuildHome

מפתח אתרים ואפליקציות ווב מנוסה

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