איך לדבג SQL
כל מתכנת נתקל לפעמים בהודעות שגיאה המתייחסות לנסיון לעדכן או לשלוף נתונים מבסיס נתונים. הודעות השגיאה לפעמים מפורטות, ומצביעות בדיוק על הבעייה, אך לפעמים הן מאוד כלליות, לכן יש ללמוד איך למצוא לבד את מקור הבעייה.
השגיאות הנפוצות
שרשור לא נכון
שרשור לא נכון – פסיקים, גרשיים , גרשים בודדים, כל אלה ועוד מתערבבים בעיניים ולא פעם ולא פעמיים הם הסיבה לשגיאה.
שלמות המידע הנשלח
משתנים שמשורשרים אל תוך ה SQL לא תמיד מכילים את הערכים שמצפים מהם, וזה בהחלט עלול לשבש כל משפט SQL.
שמות השדות או הטבלאות
שגיאות בשמות השדות – כתבתי MYTabel במקום MYTable והלכה לי שאילתה… קורה המון.
סוג המידע הנשלח
שגיאות בהתאמה בין סוגי שדות לסוגי המידע, לדוגמה
sql="SELECT * FROM tbl WHERE NumericFld ='string'"
מילים שמורות
שגיאות הנובעות משימוש במילים שמורות. קריאה לטבלה או שדה כלשהו בטבלה בשם שהוא מילה שמורה, עלול גם הוא להיות סיבה לשגיאה. את זה ניתן לפתור ע"י הקפת המילה השמורה בסוגריים מרובעות:
sql="SELECT [User] FROM tbl"
או, רצוי יותר, להמנע מקריאה לשדות או טבלאות בשמות אלו. רשימה של המילים השמורות, ניתן למצוא
פה
.
תהליכים ראשוניים לפתרון:
שלב א'
קודם כל, חשוב מאוד להפריד תהליכים: לשרשר את כל משפט ה SQL למחרוזת אחת, ורק אז לנסות לפתוח Recordset.
sql="SELECT * FROM tbl WHERE fld= " & varName
rs.Open sql
שלב ב'
לעשות response.write למשתנה שמכיל את משפט ה SQL – זה יהיה הרבה יותר ברור לראות איפה הפסיקים והגרשים, והאם באמת כל המשתנים ששירשרנו מכילים ערכים מתאימים.
sql="SELECT * FROM tbl WHERE fld= " & varName
Response.Write sql
Response.End
שלב ג'
אם התחביר נראה תקין, יש לבדוק את שמות השדות בשאילתה לעומת שמות השדות במסד הנתונים, ולוודא שאין שימוש במילים שמורות.
שלב ד'
לוודא שאתם מכניסים את סוגי המידע הנכונים, לעמודות הנכונות. אם העמודה מוגדרת כמספר, לא להכניס מחרוזת או תאריך, וכו'.
כמו כן, יש לוודא שהמחרוזות המוכנסות עטופות בגרשים:
לא לכתוב
sql="SELECT * FROM tbl WHERE stringFld=" & str
אלא:
sql="SELECT * FROM tbl WHERE stringFld='" & str & "'"
שלב ה'
לבדוק את המידע המוכנס.
אם השדה בבסיס הנתונים מוגדר כתאריך, לוודא שהמידע שנשלח מהטופס הוא אכן תאריך.
בנוסף, אם המידע המוכנס עלול להכיל תווים לא חוקיים כמו גרשיים או גרשים העלולים לשבור את השרשור, יש להחליף אותם:
sql= "INSERT INTO tbl (fld1) VALUES ('" & Replace(str,"'",""") & "')"
על הפתרונות לבעיות התווים המיוחדים, ניתן לקרוא
פה.
וחשוב לא פחות – לא להבהל מהודעות שגיאה! לקרוא אותן, ולנסות להבין אותן. תעברו עליהן עם בבילון אם צריך, העיקר שתבינו לפחות את הכוונה שלהן.
בהצלחה…
תגובות בפייסבוק