התחברות לבסיס נתונים Access ב- JAVA

chenke

New member
התחברות לבסיס נתונים Access ב- JAVA

שלום לכולם, כתבתי ישום WhiteBoard בעזרת טכנולוגיות RMI ו- JDBC ויש לי את הבעייה הבאה: המחלקה WhiteBoardServerImpl שהיא המחלקה שמספקת ממשק מבוסס RMI לשרת WhiteBoard, צריכה להתחבר לבסיס נתונים של אקסס, אז בבנאי שלה יש את השורה: connection = DriverManager.getConnection("jdbc:eek:dbc:MS Access DataBase;DBQ=D:\\WhiteBoard.mdb"); שאיתה המחלקה מצליחה להתחבר לבסיס הנתונים. הקטע הוא שאני לא מעוניין לתת לו נתיב קבוע ומפורש לבסיס הנתונים, אלא נתיב שתלוי במקום שממנו רצה המחלקה, או כזה שמתקבל מארגומנטים שמועברים בצורה מסויימת למחלקה. הבעייה היא שאינני יכול להעביר ארגומנטים של שורת הפקודה, כיוון שלמחלקה הזאת אין מתודת Main. וגם ניסיתי שהוא ימצא את המיקום של קובת ה- MDB בהתחשב במקום שממנו הופעלה המחלקה ע"י שימוש בקוד הבא: String dir=System.getProperty("user.dir"); int index=dir.indexOf("board"); String homeDir=dir.substring(0,index-1); connection=DriverManager.getConnection"jdbc:eek:dbc:MSAccessDataBase;DBQ=homeDir+"\\WhiteBoard.mdb"); כיוון שהנתיב שבה נמצאת המחלקה הוא board\rmi\server, ולכן הנחתי שאם אשים את קובץ ה- MDB בתקייה מעל התקייה board, אז הקוד יעבוד. הוא לא הצליח להתחבר לבסיס הנתונים ובבדיקה שעשיתי גיליתי שהערך של dir הוא C:\Documents and Settings\Administrator (לא בדיוק מה שציפיתי שיהיה). מה עוד ניתן לנסות? תודה מראש, חן.
 

voguemaster

New member
קודם כל

אל תשכח ש-user.dir זה לא הספריה הנוכחית שממנה הרצת את התוכנית אלא למעשה ספרית הבית של המשתמש שמריץ את התוכנית. לדוגמא במערכות מבוססות יוניקס תקבל /home/XXX בתור ספריית ה-user. הנה דוגמא לפונקציה שתחזיר לך את הנתיב המלא של הספריה שבה נמצאת התוכנית שלך. אם קובץ ה-MDB שלך נמצא באותה ספריה, זה אמור לתת לך את מה שאתה רוצה:
public static String getCWD() { // Get the "." file present in all directories.. java.io.File f = new java.io.File("."); // Get the absolute path to the "." file.. String cwd = f.getAbsolutePath(); // Return the absolute path minus the ".".. return cwd.substring(0, cwd.length() - 1); }​
 

chenke

New member
תודה, אבל לא עובד

היי, ניסיתי את הקוד שהצעת, אבל זה עדיין לא עובד. להלן הקוד שרשמתי, כולל תיבת שיחה שמראה את הנתיב שמתקבל: // Get the "." file present in all directories.. java.io.File f = new java.io.File("."); // Get the absolute path to the "." file.. String cwd = f.getAbsolutePath(); // Return the absolute path minus the ".".. JOptionPane.showConfirmDialog( null,cwd.substring(0, cwd.length() - 1)+"WhiteBoard.mdb"); connection = DriverManager.getConnection("jdbc:eek:dbc:MS Access DataBase;DBQ="+cwd.substring(0, cwd.length() - 1)+"WhiteBoard.mdb"); תוכן תיבת ההודעה הוא: C:\Documents and Settings\Administrator\WhiteBoard.mdb שהוא בהחלט לא המקום שבו נמצא WhiteBoardServerImpl (ד.א. קיבלתי תוצאה זהה מתי שהשתמשתי בקוד הקודם ב- user.dir). יש לך או למשהוא אחר עצות נוספות? תודה מראש, חן.
 

voguemaster

New member
מאיפה אתה מריץ את התוכנית ?

כי לדעתי תקבל את הנתיב שממנו הרצת את java. זה *אמור* לעבוד, GULP..
 

chenke

New member
טוב שהוספתה *אמור*, כיוון שזה לא

מדובר פה בישום RMI של שרת ולקוח. WhieBoardImpl הוא קובץ שמיישם ממשק שמספק שירותי RMI ולכן הוא לא ממש מורץ ע"י JAVA, אלא מחלקות אחרות משתמשות בו. מכאן אני מניח נובעת הבעייה. כל הפרוייקט יושב ב- c:\wbRMI3.אפשר אולי למצוא את ספריית windows כמו ב- API של VB? (כי אם כן, אז אני יכול לשים את קובץ ה- MDB שם). יש אולי דרך אחרת? (לדוגמא איך שהוא להעביר את הנתיב של קובץ ה- MDB ל- WhiteBoardImpl כפרמטר, למרות שאין לו Main?
 

voguemaster

New member
הצעות

תראה, הבעיה עם ספריית windows היא שזה ספציפי לחלונות. בגלל זה גם לא תראה שום דרך בג'אווה לקבל את הנתיב הזה כי ביוניקסים אין ספריה שהיא כמו %SYSTEMROOT% בחלונות. הדבר הכי קרוב זו הספריה שבה מותקנת ג'אווה. ענייני cross-platform, אתה יודע
מה שהייתי מציע לך אולי זה להשתמש בקובץ קונפיגורציה עבור השרת שבו אפשר לקנפג את הנתיב אל הקובץ. הצעה נוספת היא לחפש את הקובץ בנתיבים ידועים (עדיף של ה-CLASSPATH). אם תוכל לדאוג לזה של-WhiteBoardImpl יהיה CLASSPATH שכולל את הספריה שבה הוא יושב, זה יפתור לך את הבעיה. אני לא בטוח שזה אפשרי עם שרת RMI אבל שווה לנסות כי את ה-CLASSPATH אתה כן יכול לאחזר בקלות ע"י getProperty. במידה וכן אפשר לקנפג לו CLASSPATH פשוט תוסיף נקודה (.) ותוכל לשים את הקובץ שלך באותה ספריה... בכל מקרה אני ממליץ על קובץ קונפ'..
 

chenke

New member
אפשר לקבל את הקוד המדוייק למציעת ה-

CLASSPATH? אני יכול פשוט מאוד לשים את קובץ ה- MDB שם. תודה, חן.
 

voguemaster

New member
יש property מתאים ../images/Emo13.gif

הנה:
String classpath = System.getProperty("java.class.path"); // multiple paths are seperated by the path seperator of the system (another property) // we need to tokenize the string.. StringTokenizer st = new StringTokenizer(classpath, System.getProperty("path.separator")); // blah blah . .​
 
למעלה