שאלה

ד ו ב י ר

New member
שאלה

ב"ה שלום בספר שאני קורא על אובייקטים עיסקיים, יש פונקציה שנראית כך:
Public Function selectSQL(strSelect As String) As OleDbDataReader Try objConn = New OleDbConnection(connectionString) objCmd = New OleDbCommand(strSelect, objConn) objCmd.Connection.Open() Return objCmd.ExecuteReader() objCmd.Connection.Close() Catch ex As Exception Return Nothing End Try End Function​
השאלה שלי היא: האם לא יקרה כאן, שהפונקציה תיעצר לפני שהיא תסגור את ה DB? שאלה שניה? אם לא סגרתי DB, האם יש זמן שבכל מקרה ה DB יסגר? (לדוגמא, אחרי שהשרת סיים לשלוח את הדף) תודה רבה מראש
 

ד ו ב י ר

New member
אין צורך לענות, כי בדקתי את זה ואני

רואה שה DB לא נסגר תודה רבה בכל אופן
 

ד ו ב י ר

New member
אוקיי, נוצרה לי בעיה חדשה

שיניתי את הפונקציה כך שתסגור את objCmd לפני שהיא מחזירה את האובייקט מטיפוס OleDbDataReader. עכשיו, כשהשתמשתי באובייקט הזה בדף ASP.NET וניסיתי לקרוא את ה Reader קיבלתי Exception שאני לא יכול לקרוא מ Reader שהוא סגור. מה שעשיתי הוא, להחזיר את הפונקציה חמצב המקורי, וכאשר סיימתי להשתמש ב Reader, סגרתי אותו. זה לא עזר, כי אני עדיין רואה אצלי במחשב את הקובץ DB.ldb שזה אומר (עד כמה שידוע לי) שהמסד נתונים עדיין נעול. מה לפי דעתכם אני צריך לעשות? תודה רבה מראש
 
לגבי הפונקצייה-

שמתי לב לגבי הפונקצייה שהיא בנוייה די מוזר, היא מחזירה את הreader באמצע הפונקצייה במקום בסוף והיא לא סגרה אותו ,דרך אגב את הסגירה שים בfinnaly כדי שהוא ייסגר בכול מקרה, לגבי הreader עצמו ברגע שקיבלת אותו ,כלומר עשית execute reader אז הוא נמצא אצלך והוא כבר מלא ,כלומר תיסגור אותו אחרי שהתמלא (ללא קשר לשימוש) , חוץ מזה אין כמו debuuger כדי לעלות על טעויות, אני לא בטוח ב100% במה שאמרתי אז תיקח את זה בערבון מוגבל
 

ד ו ב י ר

New member
אי אפשר להשתמש עם Reader

אחרי שסוגרים אותו, כי ה reader קורא שורה אחרי שורה ישירות מתוך ה DB. זה בעצם היתרון שלו, על פני DataSet שתופס יותר זכרון.
 
אתה בטוח??

אין לי כוח לבדוק את זה ,אבל נראה לי שלא הבנת נכון את הreader בכול מקרה מי שיודע בוודאות שיתן דעתו בעניין, תודה מראש!
 

ד ו ב י ר

New member
אני לא יכול להגיד שאני מומחה

ל Reader, אבל כבר כתבתי מקודם, שכשניסיתי לסגור את objCmd ובסוף הפונקציה להחזיר את ה reader, אז כשניסיתי להשתמש בו, קיבלתי הודעת שגיאה בגלל שהוא היה סגור. דבר שני, גם אם אני אסגור בתוך finally, אם יש לי return באמצע ה try, מה שכתוב ב finally לא יבוצע. (לפחות עד כמה שידוע לי)
 
צודק והבהרה לreturn

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

pagis

New member
בלוק finally יבוצע תמיד

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

מעניין מאוד , טוב לדעת את זה -למרות שאני כבר דבק בתיכנות שבו לא נהוג לשבור קוד בצורה כואבת ,כנראה אני עדיין ידאג למקם את הדברים בצורה יפה. אז אתה אומר שברגע שהוא נתקל למשל בreturn (כמובן אחרי הtry) אז הוא הולך קודם כל לפיינלי ואחריו הוא קופץ לreturn ?!
 

pagis

New member
לא בדיוק

ברגע שהוא נתקל ב RETURN הוא מבצע את ה RETURN ויוצא מהפונקציה וכחלק מהתהליך של יציאה הוא מבצע את ה FINALLY
 

pagis

New member
מה שיוחזר יהיה מה שיש ב Return

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

ד ו ב י ר

New member
עוד שאלה

ניסיתי להשתמש בשאילתא שעושה Update, מתוך דף ASP.NET וקיבלתי שגיאה: "על הפעולה להשתמש בשאילתא הניתנת לעידכון" מישהו יכול להסביר לי מה זאת השגיאה הזאת? תודה רבה מראש
 
התשובה בגוף השאלה

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

ד ו ב י ר

New member
ככה נראה מה שעשיתי

Dim strSQL As String = "UPDATE tblUsers SET " & _ "FirstName = '" & objDetailes.firstName & "', " & _ "LastName = '" & objDetailes.lastName & "', " & _ "Username = '" & objDetailes.username & "', " & _ "[Password ] = '"& objDetailes.password & "' " & _ "WHERE UserID = " & intUserID Dim objCmd As OleDbCommand = New OleDbCommand(strSQL, Conn) Try objCmd.Connection.Open() objCmd.ExecuteNonQuery() Catch ex As Exception Throw ex Finally objCmd.Connection.Close() End Try​
 
קודם כל זה 100% בעייה בשאילתה

לגבי איפה בדיוק הבעייה בשאילתה אני לא יודע, אבל למה לpassword יש סוגריים מרובעים?! קבל טיפ - תעשה
(response.write(strSQL​
 

ד ו ב י ר

New member
עוד שאלה

המצביע this (זה שמצביע על אובייקט שקרא לפונקציה), האם הוא קיים ב VB.NET. ואם לא, האם יש משהו אחר במקום? תודה רבה מראש
 
למעלה