הודעות שגיאה נפוצות

‏ • 18 ביוני, 2004

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


כללי הברזל:



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

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

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



שגיאות כלליות VBScript / ASP


שגיאת ASP: בשורה הראשונה של הודעת השגיאה יופיע “Active Server Pages error” ולאחריו מספר השגיאה.
שגיאת VBSCRIPT: בשורה הראשונה של הודעת השגיאה יופיע “Microsoft VBScript compilation error” ולאחריו מספר השגיאה.


ASP 0140 – Page Command Out Of Order


פקודות ה-@ חייבות להיות הראשונות בעמוד.  מיקמתם פקודות ASP כלשהן לפני “פקודות ה-@”, לדוגמה:


<%response.write ("blah")%>
<%@Language=VBScript%>


שגיאה זו נגרמת רבות כאשר משתמשים באינקלודים – מקמו את האינקלודים שלכם אחרי ולא לפני פקודות ה-@.


ASP 0141 – Page Command Repeated


בעמוד ASP אחד מותר שתהיה רק שורת “פקודות @” אחת. יש לכם בדף שתיים או יותר.
אם יש לכם כמה פקודות @, שרשרו אותן לשורה אחת, לדוגמה:


<%@ LANGUAGE="VBScript" CODEPAGE="1255" %>


שגיאה זו נגרמת לרוב כאשר משתמשים באינקלודים – אל תשימו פקודות @ גם בקבצי האינקלוד אלא רק בקבצים שמשתמשים בהם.


ASP 0113 – Script timed out


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


Server.ScriptTimeout = 120



 


ASP 0116 – Missing close of script delimiter


יש יותר תגי פתיחת סקריפט ASP (<%) מאשר תגי סגירת סקריפט ASP (%>).
יש לסגור כראוי כל בלוק סקריפט שפתחתם, ולא לשכוח אחרי משפטי תנאי או לולאה בהם עברתם ל-HTML וחזרתם ל-ASP אח”כ.


800a0409 – Unterminated string constant


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


800a0401 – Expected end of statement


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


800a01b6 – Object doesn’t support this property or method: ‘something’


ניסיתם לקרוא/לשנות מאפיין או לקרוא לשיטה שאינה קיימת באובייקט. לדוגמה:
Object.Size = 5 כאשר אין מאפיין “size” ל-object.
Object.DoThis כאשר אין שיטה בשם “DoThis” ל-object.
לרוב נגרם משגיאת כתיב. בדקו בתיעוד האובייקט באילו שיטות ומאפיינים הוא תומך.


800a03f9 – Expected ‘Then’


כתבתם משפט תנאי if ולא סיימתם את התנאי ב-then.
אם זהו if בשורה אחת – בדקו איפה התנאי מסתיים והפקודה מתחילה והפרידו אותם ב-then.
אם זהו block if (במספר שורות) הוסיפו then בסוף השורה הראשונה (של ה-if).


800a03f6 – Expected ‘End’


כתבתם משפט תנאי בבלוק (if עם כמה פקודות במקרה שהתנאי מתקיים) ושכחתם לשים end if בסוף.
או: כתבתם משפט ברירה select case ושכחתם לשים end select בסוף.
או: כתבתם פונקציה/סאב ושכחתם לשים בסוף end function / end sub.


800a000b – Division by zero


מלמדים אותנו כבר בתחילת היסודי שאין מחלקים באפס, ובכל זאת הסקריפט שלכם רוצה לעשות את זה.
אם המספר 0 עצמו מופיע לאחר סימן החילוק, החליפו אותו במספר אחר. אם זהו [משתנה/פונקציה], בדקו האם [הוא אמור להכיל / היא אמורה להחזיר] אפס במקרה כלשהו. אם לא, תקנו את הקוד כך שלא יוחזר 0. אם יש צורך בהחזרת 0 במקרה מסוים, הוסיפו משפט תנאי לפני פעולת החילוק וטפלו במקרה שהערך הוא 0.
נפוץ במיוחד כשמנסים לחשב ממוצע כלשהו ויש משתנה שסופר את מספר האיברים – כאשר אין איברים ערכו 0 ונוצרת השגיאה.

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


for i = 10 to 1 step -1

שגיאות בעבודה עם מסדי נתונים


בשורה הראשונה של הודעת השגיאה יופיע שם ה-driver/providor שאיתו מתחברים אל מסד הנתונים.
לדוגמה: Microsoft JET Database Engine.
בשגיאות מסוימות יופיע ADODB.Connection (או אובייקט התחברות אחר שאתם משתמשים בו).

הערה: אני משתמש ב-Microsoft JET כדרייבר למסדי נתונים. אם אתם משתמשים במשהו אחר, כמו למשל MySQL / MSSQL, הטקסט של הודעות השגיאה עשוי להיות קצת שונה (אבל הרעיון אותו רעיון).


התחברות למסד הנתונים


Provider cannot be found. It may not be properly installed.


אתם מנסים להשתמש בדרייבר של בסיס נתונים שאינו קיים.
יש לוודא שכתבתם את שמו המדויק, כולל מספרי גרסה וכו’.


Could not find file ‘c:inetpubwwwrootdatabase.mdb’.


אתם מנסים להתחבר למסד נתונים בקובץ שאינו קיים.
ודאו שאייתתם נכון את שם הקובץ ונתיבו (האבסולוטי!) ושיש לכם הרשאות מתאימות לקובץ.


Unspecified error


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


rs.close
conn.close
set rs = nothing
set conn = nothing





עבודה עם אובייקט RecordSet (להלן: רקסט)


Operation is not allowed when the object is closed.


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


Operation is not allowed when the object is open.


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


Current Recordset does not support updating. This may be a limitation of the provider, or of the selected locktype.


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


Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.


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


Operation is not allowed in this context.


אחת הסיבות לשגיאה זו היא נסיון לסגור את הרקסט לאחר שבוצעו שינויים בנתונים אך ללא ביצוע rs.update.
אם מעוניינים לבטל את השינויים יש לבצע rs.cancelupdate לפני הסגירה.


Item cannot be found in the collection corresponding to the requested name or ordinal.


ניסיתם לעדכן או לקרוא מתוך שדה שאינו קיים ברקסט.
ייתכן שטעיתם באיות שם השדה או ששכחתם להוסיף את שמו בין ה-SELECT ל-FROM במשפט ה-SQL (אם לא השתמשם ב-*).


Type mismatch


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


Out of present range


ניסיתם להכניס לתוך שדה מספרי ערך גדול יותר מהניתן = overflow (לדוגמה, יותר מ-32767 עבור integer).


Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done


לפעמים שגיאה זו תתקבל (במקום out of present range) כאשר יש overflow.
אתם גם עשויים לקבל אותה אם אתם מנסים לקבוע ערך לשדה מספור אוטומטי, או להכניס לשדה ערך שאינו מתאים לו.



Field cannot be updated


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


The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.


הערה: במסד נתונים MySQL השגיאה היא “Duplicate entry”.
ניסיתם לערוך / ליצור רשומה בה באחד השדות יש ערך שחוזר על עצמו באותו שדה ברשומה אחרת, והשדה אוסר כפילויות (לדוגמה, שדה שהוא אינדקס / primary key). יש להכניס לשדה ערך ייחודי ידנית או להפוך את השדה לשדה “מספור אוטומטי”, ואז מסד הנתונים ימלא אותו לבד בכל פעם שמוסיפים רשומה חדשה. 

שאילתות SQL


Data type mismatch in criteria expression


בתנאי שב-WHERE בשאילתה ניסיתם להשוות ערך שדה מסוג מסוים לערך מסוג אחר.
לדוגמה, אם ID הוא שדה מספרי, ניסיתם לכתוב:


SELECT * FROM TableName WHERE ID = ‘1’;


או אם hour הוא שדה טקסט, ניסיתם לכתוב:


SELECT * FROM TableName WHERE hour = 3;


בניגוד ל-VB/ASP, ה-SQL לא מסוגל להמיר בעצמו מחרוזת למספר או להיפך.
יש להשתמש בפונקציות מסוג CStr במידת הצורך:


SELECT * FROM TableName WHERE hour = cstr(3);


וזאת כמובן בהנחה שזהו שדה/משתנה, לא מספר חופשי שאפשר פשוט להקיף בגרשיים…


The Microsoft Jet database engine cannot find the input table or query ‘table’. Make sure it exists and that its name is spelled correctly.


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


No value given for one or more required parameters.


השגיאה יכולה להיגרם כאשר:
– מנסים לבחור שדה שאינו קיים מתוך טבלה. לדוגמה, אם השדה “stam” אינו קיים בטבלה “table”:


SELECT stam FROM TableName;


– מנסים להשוות ערך לערכו של שדה שאינו קיים בטבלה במשפט התנאי שב-WHERE. לדוגמה:


SELECT * FROM TableName WHERE stam = 3;

 


Syntax error (missing operator) in query expression ‘…’.


במשפט תנאי WHERE השמטתם את האופרטור (=, >, < וכו') שאמור להיות בין הערכים, או את אחד הערכים. לדוגמה:


SELECT * FROM TableName WHERE field 3
SELECT * FROM TableName WHERE field =



 

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

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