שלח תשובה

זירת השאלות

787
צפיות
45
תשובות

בעיה בDB

,‏ 26 בינואר, 2004

שלום לכולם!
כשאני מנסה לפתוח RS אני מקבל את השגיאה הבאה:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.
line 29

ובשורה 29:

rs.open sql, conn

הנה ה-SELECT:

sql = "SELECT tbl_results.id, tbl_results.answer_id as answer_id, tbl_results.question_id as question_id, tbl_results.hits as hits, COUNT(tbl_results.hits) as total_hits"
sql = sql & " tbl_questions.question as question, tbl_answers.answer as answer"
sql = sql & " FROM tbl_results, tbl_questions, tbl_answers"
sql = sql & " WHERE tbl_questions.id = tbl_results.question_id AND"
sql = sql & " AND tbl_resutls.question_id = tbl_answers.question_id"
sql = sql & " tbl_questions.id = "&question_id&""

מה הבעיה ואיך אני יכול לפתור אותה?

תודה לכל העוזרים, אלברט

תגיות:

45 תשובות

  1. ניר טייב הגיב:

    מצאתי את הבעיה (נראה לי)
    כתבת פעמיים AND אחד אחרי השני בשורות הבאות

    sql = sql & " WHERE tbl_questions.id = tbl_results.question_id AND"
    sql = sql & " AND tbl_resutls.question_id = tbl_answers.question_id"

  2. albert הגיב:

    אה נכון!
    פשוט הAND שהוא מיותר הוא היה אמור להיות בשורה שחסרה…
    תודה לכולכם!

    אלברט

  3. albert הגיב:

    אני עדיין מקבל שגיאה:
    שיניתי את ה-SQL:

    sql = "SELECT tbl_results.id, tbl_results.answer_id as answer_id, tbl_results.question_id as question_id, tbl_results.hits as hits"', COUNT(tbl_results.hits) as total_hits"
    sql = sql & " tbl_questions.question as question, tbl_answers.answer as answer"
    sql = sql & " FROM tbl_results, tbl_questions, tbl_answers"
    sql = sql & " WHERE tbl_questions.id = tbl_results.question_id AND"
    sql = sql & " tbl_resutls.question_id = tbl_answers.question_id"
    sql = sql & " AND tbl_questions.id = "&question_id&""

    אבל אני עדיין מקבל את השגיאה הבאה:

    Error Type:
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
    [Microsoft][ODBC Microsoft Access Driver] The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.
    line 29

    ובשורה 29: פתיחת ה-RECORDSET.

    תודה לכל העוזרים, אלברט

  4. זהר פלד הגיב:

    שתי בעיות שראיתי:
    הראשונה – אתה משתמש במילה שמורה – id

    השניה, שהיא ככל הנראה גורמת להודעת השגיאה – חסר לך פסיק בין total_hits לבין tbl_questions.question.

    מה שכן, אני רואה שכבר התחלת ליישם לפחות חלק מהמדריך לעבודה מסודרת מול מסד נתונים. החלק שלא יישמת הוא זה שמדבר על שמות של שדות – במקום id, לפי המדריך הנ"ל, היית צריך לכתוב משהו כמו intId, ביטוי שלעולם לא יהיה מילה שמורה בשום שפה.

  5. albert הגיב:

    אמממממ
    א. תודה רבה!
    ב. אתה יכול לסמן לי (הדגשה, אדום או קו תחתון) בקוד שלי איפה אני משתמש במילה שמורה id?

    תודה, אלברט

  6. זהר פלד הגיב:

    כאן:

    SELECT tbl_results.id,

    השדה הראשון שאתה שולף ב SELECT הוא שדה בשם id מתוך טבלת tbl_results….

  7. albert הגיב:

    זה אמור לעשות לו בעיות?
    כי גם בשתי הטבלאות האחרות יש שדה בשם id…
    מה אני עושה?

  8. זהר פלד הגיב:

    הבעיתו הצפויות הן דוקא בעדכון,
    הוספה או מחיקה, ולא בשליפה של נתונים (משום מה).
    ניתן לעקוף את זה ע"י שימוש בסוגריים מרובעים מסביב למילה השמורה כמו כאן [id]. בכל אופן, עדיף פשוט לשנות את השם של השדה…

  9. albert הגיב:

    עשיתי שינוי עדיין יש בעיה:
    אז ככה:
    שיניתי את כל שמות השדות שהיו קשורות ל id, אני עדיין מקבל את השגיאה הבאה:

    Error Type:
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
    [Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'pid' as part of an aggregate function.

    וקוד ה SQL:

    sql = "SELECT tbl_results.pid, tbl_results.answer_pid as answer_pid, tbl_results.question_pid as question_pid, tbl_results.hits as hits, COUNT(tbl_results.hits) as total_hits,"
    sql = sql & " tbl_questions.question as question, tbl_answers.answer as answer"
    sql = sql & " FROM tbl_results, tbl_questions, tbl_answers"
    sql = sql & " WHERE tbl_questions.pid = tbl_results.question_pid AND"
    sql = sql & " tbl_resutls.question_pid = tbl_answers.question_pid"
    sql = sql & " AND tbl_questions.pid = "&question_pid&""

    מה הבעיה עכשיו?

    תודה רבה רבה לך על העזרה, אלברט

  10. כשעושים COUNT
    חייבים להשתמש ב-GROUP BY.
    אתה יכול לקרוא על זה במדריך ה-SQL באתר.

  11. albert הגיב:

    אז:
    למה זהר פלד אמר לי שאני משתמש במילה שמורה?
    ומה אומרת השגיאה הבאה:

    Error Type:
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
    [Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'pid' as part of an aggregate function.

    ושוב הקוד הSQL:

    sql = "SELECT tbl_results.pid, tbl_results.answer_pid as answer_pid, tbl_results.question_pid as question_pid, tbl_results.hits as hits, COUNT(tbl_results.hits) as total_hits,"
    sql = sql & " tbl_questions.question as question, tbl_answers.answer as answer"
    sql = sql & " FROM tbl_results, tbl_questions, tbl_answers"
    sql = sql & " WHERE tbl_questions.pid = tbl_results.question_pid AND"
    sql = sql & " tbl_resutls.question_pid = tbl_answers.question_pid"
    sql = sql & " AND tbl_questions.pid = "&question_pid&""

  12. albert הגיב:

    ו…
    מה אומרת הפסוקית GROUP BY?
    ואיך אני משתמש בזה בSQL שלי?

    תודה לכל העוזרים, אלברט

  13. ניר טייב הגיב:

    הנה…
    כנס בתפריט ל-מדורים –> SQL –> מדריכים –> מדריך SQL ושם יש משהו עך group by

  14. זהר פלד הגיב:

    אבל יקירתי, את טועה….
    אין שום חובה להשתמש ב GROUP BY בשביל להשתמש בפונקציה קבוצתית כלשהי (ו COUNT בינהן, כמובן).
    המשפט הבא, לדוגמא, גם תקין וגם עובד יופי:

    SELECT COUNT(*)
    FROM phonesTbl
    WHERE strBezeqPhone LIKE "*03-*"

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

    כלומר, הטעות כאן איננה השימוש ב COUNT ללא שימוש ב GROUP BY, אלא השימוש ב COUNT יחד עם שדות רגילים, כשאלו לא מקובצים.

  15. זהר פלד הגיב:

    גם טועה, גם מטעה, וגם אני הקטנוני?
    אויש, התגעגתי אליכם

  16. albert הגיב:

    לא,
    אתה בעצמך אמרת: "מי שלא טועה זה שאף פעם לא מנסה"
    וחוצמזה בני האדם טועים-;
    עכשיו לשאלה שלי…
    נכנסתי למדור הSQL עוד לפני ששאלתי עליה…
    אני עדיין לא הבנתי מה משמעותה ואיך אני אמור להשתמש בה בקוד שלי?

    תודה לכל העוזרים, אלברט

  17. זהר פלד הגיב:

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

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

    strFirstName | strLastName
    =====================
       zohar   |   peled   
       zohar   |   argov   
       shimon   |   buskila   
       haim   |   yavin   
       david   |   peled   

    ואתה רוצה לבדוק לכמה רשומות בטבלה השם הפרטי הוא zohar, אתה כותב שאילתה כזו:

    SELECT COUNT(strLastName)
    FROM tblNamesTable
    WHERE strFirstName = "zohar"
    GROUP BY strFirstName

  18. albert הגיב:

    אוף….
    אני מתחיל כבר להשתגע על הSQL הזה.
    שיניתי את השמות שעלולות להיות מילים שמורות כמו id והוספתי את הפסוקיתGROUP BY, אבל אני עדיין מקבל את השגיאה הבאה:

    Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
    [Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'pid' as part of an aggregate function.

    והנה קוד הSQL אחרי כל השינויים:

    sql = "SELECT tbl_results.pid, tbl_results.answer_pid as answer_pid, tbl_results.question_pid as question_pid, tbl_results.hits as hits, COUNT(tbl_results.hits) as total_hits,"
    sql = sql & " tbl_questions.question as question, tbl_answers.answer as answer"
    sql = sql & " FROM tbl_results, tbl_questions, tbl_answers"
    sql = sql & " WHERE tbl_questions.pid = tbl_results.question_pid AND"
    sql = sql & " tbl_resutls.question_pid = tbl_answers.question_pid"
    sql = sql & " AND tbl_questions.pid = "&question_pid&" GROUP BY total_hits"

    מה הבעיה פה?
    תודה לכל העוזרים, אלברט

  19. כל השדות שמופיעים ברשימת ה-SELECT
    ולא מופעלת עליהם פונק' אגרגציה כלשהי – צריכים גם להופיע ב-GROUP BY

  20. ניר טייב הגיב:

    אתה בטוח שיש לך…
    שדה בשפ PID באחד הטבלאות???

  21. albert הגיב:

    בוודאי!
    pid היה בהתחלה id, אבל אמרו לי שזו מילה שמורה אז שיניתי אותה ל-pid וכמובן שיניתי גם את השמות בבסיס הנתונים…
    מה עדיין יכולה להיות הבעיה?

    תודה לכל העוזרים, אלברט

  22. albert הגיב:


    אני כבר יוצא לי עשן מהאוזניים!
    הכנסתי את כל השדות שלא מופעלות עליהן פונק' אגרגציה כלשהי ל- GROUP BY,(כפי שאמרה ילדה בלבן):

    sql = "SELECT tbl_questions.author as author, tbl_questions.dmy as dmy, tbl_question.question as question,"
    sql = sql & " tbl_answers.answer as answer, tbl_results.hits as hits, COUNT(tbl_results.hits) as total_hits"
    sql = sql & " FROM tbl_questions, tbl_answers, tbl_results"
    sql = sql & " WHERE tbl_questions.id = tbl_answers.q_id"
    sql = sql & " AND tbl_questions.id = tbl_results.q_id"
    sql = sql & " AND tbl_questions.id = "&question_id&""
    sql = sql & " GROUP BY author, dmy, question, answer,hits"

    והנה השגיאה:

    Error Type:
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
    [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
    line 30
    ובשורה 30:
    rs.open sql, conn

    פירוט של שדות:

    tbl_questions:
    id = מספר מזהה של שאלה
    author = מחבר השאלה
    dmy = תאריך ושעה של השאלה(של הסקר)בגלל שאי אפשר להשתמש במילה הרגילה כי היא מילה שמורה
    question = שאלה הסקר

    tbl_answers:
    id = מספר המזהה של התשובה
    answer = תשובה לסקר
    q_id = לאיזו שאלה התשובה שייכת

    tbl_results:
    id = מספר מזהה של תוצאה
    a_id = איזו תשובה
    q_id = איזו שאלה
    hits = מספר ההצבעות לתשובה

    אני נורא מצטער על ההודעה הארוכה… חשבתי אולי יעזור אם אני אביא פירוט של כל בסיס הנתונים…
    תודה לכל העוזרים, אלברט המיואש…

  23. ניר טייב הגיב:

    שאלה…
    מה זה :::


    sql = sql & " AND tbl_questions.id = "&question_id&""

    יש משתנה כזה question_id ואם כן מהו מכיל???

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

  25. ניר טייב הגיב:

    אבל לידיעתך
    מפתח אתרים ב-ASP שלא מתעסק הרבה עם SQL ונותן לתוכנה ליצור לו שאילתות
    אז הוא לא מבין שהוא הורס לעצמו … נגיד בעוד 5 שנים תתקבל לעבודה במשרד חשוב ואחת הדרישות שלהם זה לדעת SQL ברמת ה-SQL SERVER או כל מסד אחר אבל ACCESS לא !!! כי ACCESS זה מסד דיי חלש ולא מאובטח מספיק…
    אני למשל עכשיו מתחיל ללמוד SQL ברמת ה-SQL SERVER כדי לעבור מהאקסס ל-SQL SERVER …

    בכל מקרה לתת לתוכנה לעשות לך שאילתות זה לא מספיק ומי שלא מנסה לא מצליח (חחח)

  26. albert הגיב:

    הנה לכם תגובות:
    א. כן, יש משתנה כזה question_id והוא מתקבל ע"י Request.Quarystring.
    ב. אני רוצה לבנות את האתר שלי בעצמי כמה שיותר!
    וחוצמזה יש לי בגרות על כל זה השנה, כך שאני צריך להבין כל אות ואות כדי להסביר לבוחן/ת ממשרד החינוך…
    אני מאוד מופתע לשמוע(לקרוא) את זה ממך("דני מלך המחשבים")!
    בכל מקרה אשמח לשמוע מכם תשובה לשאלה שלי…

    תודה, אלברט

  27. זהר פלד הגיב:

    לא רק שאתה טועה,
    זה עוד לא מתקרב בכלל לרמה הגבוהה של SQL…
    הרמה הגבוהה של SQL הוא משהו שלומדים במשך שנים, בלי טיפת הגזמה.

    חוצמזה שהרבה דברים שהאקסס עושה ב SQL שלו מיותרים ומסבכים אותך סתם…

  28. אוריקס הגיב:

    הכל תלוי ב"לאן אתה שואף להגיע"
    כלומר בשביל אפליקציות קטנות כמו ספר אורחים, אין בעייה בכלל עם אשפים של אקסס, מסכים איתך.

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

    גם אני, בהתחלה, חשבתי שאני הגעתי לרמה שצריך (ידעתי Where ו Order By). עד שהתחלתי לבנות דברים יותר מסובכים…

    אל תתן לאקסס לכתוב לך את השאילתות, כתוב אותן בעצמך.

    ועוד נקודה למחשבה: נניח ואתה מקבל קוד שמישהו כתב, ובו משפט SQL שהוא קצת מסובך. מה אתה עושה אז?

  29. אוריקס הגיב:

    ואולי גם זה יעזור
    הילדה כתבה כאן על איך משרשרים שאילתא.

  30. albert הגיב:

    =>
    איזה יופי! תודה רבה!
    הדפסתי את משפט ה-SQL וראיתי שחסרה לי שם אות….
    עכשיו, אני מקבל את השגיאה הבאה:

    Error Type:
    ADODB.Field (0x80020009)
    Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

    מה הנכוונה פה?

    תודה אלברט

  31. זהר פלד הגיב:

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

    כדי להמנע משגיאות כאלו, את כל הפעולות שאתה מבצע על ה recordset שלך בין הפתיחה לסגירה שלו, תכניס בתוך תנאי פשוט:
    ה rs הוא כמובן אובייקט ה recordset בדוגמא:

     
    rs.open sqlStr, con
      if NOT rs.eof then
       ' here you do all the things you need with the recordset
      end if
    rs.close

  32. albert הגיב:

    ==>
    מה הכוונה "ריק או נחמקה ממנו"?
    ואני עשיתי פעולה כזאת על הRECORDSET שלי:

    <%Do While Not rs.EOF%>
    …..
    <%
    rs.MoveNext
    loop
    %>

    תודה לך ולכל העוזרים, אלברט

  33. זהר פלד הגיב:

    בדיוק מה שזה נשמע –
    ה recordset שלך פשוט ריק – אין בו נתונים.
    כנראה שהשיאלתה שלך לא החזירה אף רשומה ממסד הנתונים.

    לגבי "נמחקה בו רשומה", יש אופציה למחוק רשומות מתוך ה recordset, ואז, אם מנסים לגשת אל רשומה שנמחקה ממנו, מקבלים את אותה שגיאה שאתה קיבלת.

  34. albert הגיב:

    איך זה יכול להיות?
    כלומר, אתה אומר שאין שום רשומה בטבלת התוצאות וטבלת התשובות שה- q_id שלו מתאים ל-ID של השאלה?
    לא יכול להיות… אני הכנסתי את הנתונים ידני ובדקתי שאכן ה-ID ים אכן מתאימים…
    מה יכולה להיות הבעיה?
    הנה שוב קוד הSQL אחרי כל השינויים:

    sql = "SELECT tbl_questions.author as author, tbl_questions.dmy as dmy, tbl_questions.question as question,"
    sql = sql & " tbl_answers.answer as answer, tbl_results.hits as hits, SUM(tbl_results.hits) as total_hits"
    sql = sql & " FROM tbl_questions, tbl_answers, tbl_results"
    sql = sql & " WHERE tbl_questions.id = tbl_answers.q_id"
    sql = sql & " AND tbl_questions.id = tbl_results.q_id"
    sql = sql & " AND tbl_questions.id = "&question_id&""
    sql = sql & " GROUP BY author, dmy, question, answer, hits"

    הוא נכון?
    תודה, אלברט

שלח תשובה