על האתרהוספה למועדפים

מאת רועי אנגל
מסדי נתונים (Access) ב- Visual Basic 2005

אחת השאלות הנפוצות ביותר ב- VB 2005 היא איך עובדים עם מסדי נתונים.
מאמר זה נוצר כדי לענות לכם על השאלה הזו.
במאמר נשתמש ב-DAO.NET (הכלי שהחליף את DAO מ- Visual Basic 6) כדי לעבוד עם מסד הנתונים דרך שורות הקוד.

ישנה עוד שיטה שאיתה אפשר לעבוד עם מסדי-נתונים ב- Visual Basic 2005, אבל נשאיר אותה לפעם הבאה...

לפני שנתחיל:
פתחו את Visual Basic 2005.
מהתפריט Project בחירו ב-Add Reference.
עברו ללשונית COM סמנו את Microsoft DAO 3.6 Object Library ולחצו על OK.

במהלך המאמר שלנו אנו נעזר במסד הנתונים DataBase.mdb, שאותו אפשר להוריד מכאן (הקובץ נמצא בספריה הראשית בקובץ ה-Zip).
במסדנתונים זה ישנה טבלה בשם "Employees" עם הערכים הבאים:
ID - תעודת זהות.
Fname - שם משפחה.
Lname - שם פרטי.
Address - כתובת.
Tel - טלפון.
אני ממליץ לכם להוריד את מסדהנתונים ולעניין בו קצת, על מנת להבין טוב יותר את שורות הקוד.
כמו כן, מומלץ להוריד את קוד המקור (מהקישור לעיל או מהקישור שבסוף המאמר) ולצפות בו לפני קריאת המאמר.


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

א. נתחיל בהצהרה על משתנים.
כתבו בראש הטופס שאתם רוצים לקשרו עם מסד הנתונים את השורות הבאות:
Option Strict Off
Option Explicit On

אחרי התחלת המחלקה (Class) שלכם, כתבו את השורות הבאות:
Dim DataBase As DAO.Database
Dim
Table As DAO.Recordset
Dim
OpenDataBase As New DAO.DBEngine
ההצהרה הראשונה נכתבה כדי לנהל את מסד הנתונים, כאשר "DataBase" הוא שם המשתנה ו-"DAO.Database" הוא סוג המשתנה.
ההצהרה השנייה נכתבה כדי לנהל את הטבלאות שבמסד הנתונים, כאשר "Table" הוא שם המשתנה ו-"DAO.Recordset" הוא סוג המשתנה.
ההצהרה השלישית נכתבה כדי לפתוח את מסד-הנתונים, כאשר "OpenDataBase" הוא שם המשתנה ו-"DAO.DBEngine" הוא סוג המשתנה.

ב. קישור הטופס עם מסדהנתונים.
ב- Form_Load כתבו את השורות הבאות:
Dim StrFileName As String
StrFileName = My.Application.Info.DirectoryPath & "\database.mdb"
DataBase = OpenDatabase.OpenDatabase(StrFileName)
Table = DataBase.OpenRecordset("Employees")
בהתחלה הצהרנו על משתנה מסוג String, מהשם שלו ניתן להבין למה הוא משמש - שם מסד הנתונים.

השורה השניה מתחלקת לשני חלקים:
1. My.Application.Info.DirectoryPath - מטרתה לזהות את המקום שבו התוכנה נמצאת.
נעזרו באובייקט My בשורה זו. פרטים נוספים על האובייקט My אפשר למצוא במאמר על האובייקט My שבאתר.
2. & "\database.mdb" - קובץ מסד-הנתונים שלנו.

כדי להבין טוב יותר את השורה השנייה ניעזר בדוגמה:
נגיד שהתוכנה שלנו נמצאת בתוך התיקייה Roee  שנמצאת בכונן C.
נכתוב:
MsgBox My.Application.Info.DirectoryPath
ונקבל (כשנריץ את הקוד) את מיקום התוכנה -  C:\Roee .
עכשיו, אחרי שהבנו את החלק הראשון - נעבור לחלק השני:
נגיד שיש לנו בתוך התיקייה של התוכנה עוד תיקייה, הנקראת Dr-Vb ובתוכנה נמצא קובץ בשם Data.mdb ואנחנו רוצים למצוא את הנתיב המלא שלו.
נכתוב:
MsgBox My.Application.Info.DirectoryPath & "Dr-Vb/Data.mdb"
ונקבל את מיקום הקובץ - C:\Roee\Dr-Vb\Data.mdb.
תפקיד & הוא לחבר את שני החלקים של השורה.

אחרי שזיהינו את מקום מסד הנתונים שלנו באמצעות המשתנה StrFileName נשתמש בשורה השלישית כדי לקשר את הפרויקט עם מסד הנתונים שלנו.
תפקיד השורה הרביעית הוא לקשר את מסד הנתונים שלנו עם הטבלה שלנו - Employees.

כל הכבוד, הטופס שלכם מקושר עם מסדהנתונים שלכם!


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

א. השירות Move:
השירות Move מאפשר  לנו לנוע בין הרשומות בטבלה שבמסד הנתונים - ניתן לעבוד בעזרתו לרשומה הראשונה, הקודמת, הבאה או לכל מקום שתרצו.
להלן מספר דוגמאות לשימוש בשירות Move:
Table.MoveLast()
Table.MoveFirst()
Table.MoveNext()
Table.MovePrevious()
Table.Move(3)
Table.Move(-2)
באמצעות השורה הראשונה נעבור לרשומה האחרונה.
באמצעות השורה השנייה נעבור לרשומה הראשונה.
באמצעות השורה השלישית נעבור לרשומה הבאה.
באמצעות השורה הרביעית נעבור לרשומה הקודמת.
באמצעות השורה החמישית נעבור 3 רשומות קדימה מהרשומה שבא אנו נמצאים.
באמצעות השורה החמישית נעבור 2 רשומות אחורה מהרשומה שבא אנו נמצאים.

כמובן שאחרי כל שורה, יש לכתוב  או להציב במקום המתאים את ערכי הרשומה הנוכחית (למשל: בתיבת-טקסט, בתיבת הודעה, במשתנים וכדומה).
כעת אדגים כיצד להציב למשתנים את ערכי הרשומה הנוכחית לאחר מעבר לרשומה הבאה (MoveNext):
Dim fname, lname, address, tel, id As String
Table.MoveNext()
id = Table.Fields("id").Value
fname = Table.Fields("fname").Value
lname = Table.Fields("lname").Value
address = Table.Fields("address").Value
tel = Table.Fields("tel").Value
בשורה הראשונה הצהרנו על משתנים.
בשורה השנייה העברנו את הטבלה לרשומה הבאה.
בשאר השורות (שורות 6-2) הכנסנו את הערכים השונים של השדות ברשומה הנוכחית למשתנים.

ב. השירות AddNew:
חלק חשוב מיכולת ניהול הטבלה במסד הנתונים, הוא האפשרות להוסיף רשומה חדשה לטבלה.
בהפעלת השירות אין כל משמעות באיזו רשומה נמצאים בעת הפעלתו.
בכל מקרה הרשומה תתווסף בסוף הטבלה.
נשתמש בקוד הבא בשביל לבצע את הפעולה הזו בטבלה שלנו (זכרו! בגלל שהשדה ID הוא המפתח של הטבלה שלנו הוא לא יכול להופיע פעמיים):
Table.AddNew()
Table.Fields("id").Value = "012345678"
Table.Fields("fname").Value = "אנגל"
Table.Fields("lname").Value = "רועי"
Table.Fields("address").Value = "גן יבנה"
Table.Fields("tel").Value = "059-1234567"
Table.Update()
בשורה הראשונה הוספנו רשומה חדשה.
בשורות 2 עד 5 הוספנו את הערכים לרשומה.
בשורה 6 השתמשנו בשירות Update כדי לעדכן את הטבלה.

ג. השירות  Edit:
השירות Edit מאפשר את עריכת הרשומה הנוכחית ושינוי הערכים שבה.
Table.Edit()
Table.Fields("id").Value = "876543210"
Table.Fields("fname").Value = "דוקטור"
Table.Fields("lname").Value = "ויבי"
Table.Fields("address").Value = "www.dr-vb.co.il"
Table.Fields("tel").Value = "08-8888888"
Table.Update()
בשורה הראשונה הפעלנו את שירות העריכה.
בשורות 2 עד 5 ערכנו את הערכים של הרשומה.
בשורה 6 השתמשנו בשירות Update כדי לעדכן את הטבלה.

ד. השירות Delete:
השירות Delete מאפשר למחוק  את הרשומה הנוכחית.
למשל:
Dim fname, lname, address, tel, id As String
Table.Delete()
Table.MoveNext()
id = Table.Fields("id").Value
fname = Table.Fields("fname").Value
lname = Table.Fields("lname").Value
address = Table.Fields("address").Value
tel = Table.Fields("tel").Value
בשורה הראשונה הצהרנו על המשתנים.
בשורה השניה השתמשנו בשירות Delete, על מנת  מחוק את הרשומה הנוכחית.
בשורה השלישית השתמשנו בשירות MoveNext על מנת לעבור לרשומה הבאה.
בשורות 4 עד 8 הכנסנו את הערכים (של הרשומה הבאה, אחרי זו שמחקנו) למשתנים.

ה. המאפיינים EOF ו- BOF:
המאפיינים EOF ו-BOF עוזרים לנו לבדוק האם הגענו לסוף הרשומות או שאנחנו ברשומה הראשונה.
על מנת להשתמש בהם אנו  נעזר  בקוד הבא:
If Table.EOF Then
     MsgBox("הגעתם לרשומה האחרונה")
ElseIf Table.BOF Then
     MsgBox("הגעתם לרשומה הראשונה")
Else
     MsgBox("אתם לא בתחילת הטבלה ולא בסוף הטבלה")
End If
בשורה הראשונה נעזרנו במשפט If ובמאפיין EOF (ראשי תיבות של End Of File - סוף הקובץ), על מנת לבדוק האם הגענו לרשומה האחרונה. במקרה שהתשובה היא True מתבצע הקוד שבשורה השנייה, המציג הודעה בה רשום כי הגענו לרשומה האחרונה.
במקרה שהתשובה היא False מתבצע הקוד שבשורה שלישית.
בשורה השלישית נעזרנו במשפט ElseIf ובמאפיין BOF (ראשי תיבות של Beginning of File - תחילת הקובץ), על מנת לבדוק האם אנו נמצאים ברשומה הראשונה. במקרה שהתשובה היא True מתבצע הקוד שבשורה הרביעית,  המציג הודעה שבה רשום כי אנחנו נמצאים ברשומה הראשונה.
במקרה שהתשובה היא False מתבצע הקוד שבשורה הרביעית, הגורם לקוד שבשורה החמישית להתבצע ואז מוצגת הודעה בה רשום כי אנו לא בתחילת ולא בסוף הטבלה.


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

א. המאפיין Index:
האינדקס שבטבלה שלנו (Employees) הוא "ID".
במקרה שלנו האינדקס הוא גם המפתח (Primary Key) של הטבלה.
אם, לדוגמה, נרצה לפנות ישירות לרשומה של דני בעל תעודת הזהות 012345678, נפנה בשלב הראשון לאינדקס (במקרה הזה - למפתח) המכיל את השדה "ID".
שימו לב! כשאתם יוצרים מפתח באקסס הוא הופך להיות גם אינדקס.
המפתח שלכם הוא גם האינדקס שלכם.
יש מקרים באקסס שאתם יכולים לעשות גם מפתח וגם עוד כמה אינדקסים.
כדי לפנות לאינדקס, נשתמש בקוד הבא:
Table.Index = "PrimaryKey"
לאחר שפנינו לאינדקס המתאים, נשאר רק להורות לו איזה רשומה לחפש.

ב. המאפיין Seek :
המאפיין Seek מאתר רשומה מסוימת בתוך האינדקס.
שימו לב לדוגמה הבאה:
Table.Index = "PrimaryKey"
Table.Seek("=", 012345678)
בשורה הראשונה פנינו אל האינדקס-מפתח שלנו.
בשורה השנייה השתמשנו במאפיין Seek, שורה זו מתחלקת לשלושה חלקים.
1. Table.Seek - פנינו למאפיין Seek כדי לבצע חיפוש.
2. "=" -  הגדרנו שאנחנו רוצים לחפש את הרשומה שה-ID שלה שווה ל- 012345678.
אם היינו כותבים ">" אז היה מתבצע חיפוש רשומה שה-ID שלה קטן מ- 12345678.
אם היינו כותבים "<" אז היה מתבצע חיפוש רשומה שה-ID שלה גדול מ- 12345678.
אם היינו כותבים "=>" אאז היה מתבצע חיפוש רשומה שה-ID שלה שווה או קטן מ- 12345678.
אם היינו כותבים "=<" אז היה מתבצע חיפוש רשומה שה-ID שלה שווה או גדול מ- 12345678.
3. 012345678 - הערך שאנחנו רוצים לחפש.
לאחר הרצת קוד זה - החיפוש יתבצע, אבל כדי לראות את תוצאות החיפוש, אנו צריכים לקבוע היכן הן יירשמו - במשתנים, בתיבת הודעה, בתיבת טקסט וכדומה.
אני ישתמש בדוגמה שבה יוצגו תוצאות החיפוש במשתנים:
Dim fname, lname, address, tel, id As String
Table.Index = "primarykey"
Table.Seek("=", 123456789)
id = Table.Fields("id").Value
fname = Table.Fields("fname").Value
lname = Table.Fields("lname").Value
address = Table.Fields("address").Value
tel = Table.Fields("tel").Value
בשורה הראשונה הצהרנו על משתנים באותם שמות של השדות בטבלה.
בשורה השנייה פנינו לאינדקס מפתח.
בשורה השלישית נעזרנו במאפיין Seek כדי לבצע את החיפוש.
בשורות 4 עד 8 הוצבו ערכים במשתנים, שהם תוצאות החיפוש של האדם עם התעודת הזהות: 012345678.

ג. המאפיין NoMatch:
במידה ונמצאה הרשומה שחיפשנו, הערכים יועברו למשתנים (בקוד שלעיל). אבל אם לא נמצאה תוצאה, במקרה זה תופיע הודעת שגיאה.
על מנת למנוע את הופעת הודעת השגיאה, אנו ניעזר במאפיין  NoMatch (שפירושו: אין התאמה).
כדי להשתמש במאפיין הזה נשתמש במשפט תנאי (משפט If). במידה ונמצאה תוצאה - התוצאה של משפט התנאי תהיה False. אם לא נמצאה תוצאה - התוצאה של משפט התנאי תהיה True.
נכון שזה נשמע הפוך ממש שזה צריך להיות - ההסבר לכך הוא בגלל שבמאפיין יש No, כדי שזה לא יראה הפוך, נשתמש במשפט התנאי IF ב-Not:
Dim fname, lname, address, tel, id As String
Table.Index = "primarykey"
Table.Seek("=", 123456789)
If Not Table.NoMatch Then
     id = Table.Fields("id").Value
     fname = Table.Fields("fname").Value
     lname = Table.Fields("lname").Value
     address = Table.Fields("address").Value
     tel = Table.Fields("tel").Value
Else
     MsgBox("רשומה לא נמצאה")
End If
בשורה הראשונה הצהרנו על המשתנים.
בשורה השנייה פנינו לאינדקס-מפתח שלנו.
בשורה השלישית ביצענו חיפוש של תעודת הזהות 012345678.
בשורה הרביעית השתמשנו בשורת  If Not ובמאפיין NoMatch כדי לבדוק האם החיפוש הצליח או לא.
במקרה שהחיפוש הצליח, שורות 5 עד 9 יתבצעו ויועברו ערכים למשתנים.
במקרה שהחיפוש לא הצליח, שורה 11 תתבצע ואז תופיע הודעה שבה כתוב שהרשומה המבוקשת לא נמצאה.


סיכום:
במאמר זה למדתם כיצד לעבוד עם מסדי נתונים ב-VB 2005.
אני ממליץ לכם לעבור שוב על הקוד מקור ולבדוק אם אתם מבינים את כולו.
לבעיות, הערות והארות אתם מוזמנים לפנות

את קוד המקור, כולל קובץ מסדהנתונים (Access), ניתן להוריד מכאן.
אז שיהיה לכם בהצלחה - רועי אנגל!
[לחזרה לרשימת המאמרים]

©2000-2012 כל הזכויות שמורות
מומלץ לצפיה עם אינטרנט אקספלורר 5.5 ומעלה עם גודל כתב בינוני (Medium) או עם Mozilla 1.0 ומעלה עם גודל כתב 100%.
על האתר | מדיניות פרטיות | תנאי שימוש