צפיות
תשובות
בעיה בDB
שלום לכולם!
כשאני מנסה לפתוח 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 תשובות
מצאתי את הבעיה (נראה לי)
כתבת פעמיים AND אחד אחרי השני בשורות הבאות
sql = sql & " WHERE tbl_questions.id = tbl_results.question_id AND"
sql = sql & " AND tbl_resutls.question_id = tbl_answers.question_id"
וחסר and לפני התנאי האחרון
אה נכון!
פשוט הAND שהוא מיותר הוא היה אמור להיות בשורה שחסרה…
תודה לכולכם!
אלברט
אני עדיין מקבל שגיאה:
שיניתי את ה-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.
תודה לכל העוזרים, אלברט
שתי בעיות שראיתי:
הראשונה – אתה משתמש במילה שמורה – id
השניה, שהיא ככל הנראה גורמת להודעת השגיאה – חסר לך פסיק בין total_hits לבין tbl_questions.question.
מה שכן, אני רואה שכבר התחלת ליישם לפחות חלק מהמדריך לעבודה מסודרת מול מסד נתונים. החלק שלא יישמת הוא זה שמדבר על שמות של שדות – במקום id, לפי המדריך הנ"ל, היית צריך לכתוב משהו כמו intId, ביטוי שלעולם לא יהיה מילה שמורה בשום שפה.
אמממממ
א. תודה רבה!
ב. אתה יכול לסמן לי (הדגשה, אדום או קו תחתון) בקוד שלי איפה אני משתמש במילה שמורה id?
תודה, אלברט
כאן:
SELECT tbl_results.id,
השדה הראשון שאתה שולף ב SELECT הוא שדה בשם id מתוך טבלת tbl_results….
זה אמור לעשות לו בעיות?
כי גם בשתי הטבלאות האחרות יש שדה בשם id…
מה אני עושה?
הבעיתו הצפויות הן דוקא בעדכון,
הוספה או מחיקה, ולא בשליפה של נתונים (משום מה).
ניתן לעקוף את זה ע"י שימוש בסוגריים מרובעים מסביב למילה השמורה כמו כאן [id]. בכל אופן, עדיף פשוט לשנות את השם של השדה…
עשיתי שינוי עדיין יש בעיה:
אז ככה:
שיניתי את כל שמות השדות שהיו קשורות ל 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&""
מה הבעיה עכשיו?
תודה רבה רבה לך על העזרה, אלברט
כשעושים COUNT
חייבים להשתמש ב-GROUP BY.
אתה יכול לקרוא על זה במדריך ה-SQL באתר.
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&""
ו…
מה אומרת הפסוקית GROUP BY?
ואיך אני משתמש בזה בSQL שלי?
תודה לכל העוזרים, אלברט
הנה…
כנס בתפריט ל-מדורים –> SQL –> מדריכים –> מדריך SQL ושם יש משהו עך group by
אבל יקירתי, את טועה….
אין שום חובה להשתמש ב GROUP BY בשביל להשתמש בפונקציה קבוצתית כלשהי (ו COUNT בינהן, כמובן).
המשפט הבא, לדוגמא, גם תקין וגם עובד יופי:
SELECT COUNT(*)
FROM phonesTbl
WHERE strBezeqPhone LIKE "*03-*"
הכלל הוא טיפה שונה: מותר לשלוף פונקציה קבוצתית ביחד עם שדות רגילים, אך ורק בתנאי שהשדות הנשלפים יהיו מקובצים ב GROUP BY.
כלומר, הטעות כאן איננה השימוש ב COUNT ללא שימוש ב GROUP BY, אלא השימוש ב COUNT יחד עם שדות רגילים, כשאלו לא מקובצים.
מה, אסור לי לטעות?
קטנוני
גם טועה, גם מטעה, וגם אני הקטנוני?
אויש, התגעגתי אליכם 
לא,
אתה בעצמך אמרת: "מי שלא טועה זה שאף פעם לא מנסה"
וחוצמזה בני האדם טועים-;
עכשיו לשאלה שלי…
נכנסתי למדור הSQL עוד לפני ששאלתי עליה…
אני עדיין לא הבנתי מה משמעותה ואיך אני אמור להשתמש בה בקוד שלי?
תודה לכל העוזרים, אלברט
אממ…
מדריך ה 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
אוף….
אני מתחיל כבר להשתגע על ה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"
מה הבעיה פה?
תודה לכל העוזרים, אלברט
כל השדות שמופיעים ברשימת ה-SELECT
ולא מופעלת עליהם פונק' אגרגציה כלשהי – צריכים גם להופיע ב-GROUP BY
אתה בטוח שיש לך…
שדה בשפ PID באחד הטבלאות???
בוודאי!
pid היה בהתחלה id, אבל אמרו לי שזו מילה שמורה אז שיניתי אותה ל-pid וכמובן שיניתי גם את השמות בבסיס הנתונים…
מה עדיין יכולה להיות הבעיה?
תודה לכל העוזרים, אלברט
הילדה בלבן ענתה לך במדויק.
אני כבר יוצא לי עשן מהאוזניים!
הכנסתי את כל השדות שלא מופעלות עליהן פונק' אגרגציה כלשהי ל- 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 = מספר ההצבעות לתשובה
אני נורא מצטער על ההודעה הארוכה… חשבתי אולי יעזור אם אני אביא פירוט של כל בסיס הנתונים…
תודה לכל העוזרים, אלברט המיואש…
שאלה…
מה זה :::
sql = sql & " AND tbl_questions.id = "&question_id&""
יש משתנה כזה question_id ואם כן מהו מכיל???
לפי דעתי
הכי טוב זה לא להסתבך עם הרמה הגבוהה של שפת ה- SQL, אלא פשוט לתת ל-Access ליצור את השאילתה עבורכם ואחר כך רק לשנות את מה שצריך בדיוק.
אם מישהו רוצה הוא יכול גם ללמוד SQL דרך השאילתות שה- Access יוצר בעצמו.
אבל לידיעתך
מפתח אתרים ב-ASP שלא מתעסק הרבה עם SQL ונותן לתוכנה ליצור לו שאילתות
אז הוא לא מבין שהוא הורס לעצמו … נגיד בעוד 5 שנים תתקבל לעבודה במשרד חשוב ואחת הדרישות שלהם זה לדעת SQL ברמת ה-SQL SERVER או כל מסד אחר אבל ACCESS לא !!! כי ACCESS זה מסד דיי חלש ולא מאובטח מספיק…
אני למשל עכשיו מתחיל ללמוד SQL ברמת ה-SQL SERVER כדי לעבור מהאקסס ל-SQL SERVER …
בכל מקרה לתת לתוכנה לעשות לך שאילתות זה לא מספיק ומי שלא מנסה לא מצליח (חחח)
הנה לכם תגובות:
א. כן, יש משתנה כזה question_id והוא מתקבל ע"י Request.Quarystring.
ב. אני רוצה לבנות את האתר שלי בעצמי כמה שיותר!
וחוצמזה יש לי בגרות על כל זה השנה, כך שאני צריך להבין כל אות ואות כדי להסביר לבוחן/ת ממשרד החינוך…
אני מאוד מופתע לשמוע(לקרוא) את זה ממך("דני מלך המחשבים")!
בכל מקרה אשמח לשמוע מכם תשובה לשאלה שלי…
תודה, אלברט
אתה טועה
לא רק שאתה טועה,
זה עוד לא מתקרב בכלל לרמה הגבוהה של SQL…
הרמה הגבוהה של SQL הוא משהו שלומדים במשך שנים, בלי טיפת הגזמה.
חוצמזה שהרבה דברים שהאקסס עושה ב SQL שלו מיותרים ומסבכים אותך סתם…
בלי פאניקה! בלי פאניקה!
את כבר קראת?
הכל תלוי ב"לאן אתה שואף להגיע"
כלומר בשביל אפליקציות קטנות כמו ספר אורחים, אין בעייה בכלל עם אשפים של אקסס, מסכים איתך.
אבל לפעמים אתה צריך לעשות שאילתות בתוך שאילתות, לשלוף מכמה טבלאות ולעשות עוד כל מיני פעולות מסובכות…
מה גם שבמסדים יותר מתקדמים ניתן ממש לתכנת בעזרת השפה.
גם אני, בהתחלה, חשבתי שאני הגעתי לרמה שצריך (ידעתי Where ו Order By). עד שהתחלתי לבנות דברים יותר מסובכים…
אל תתן לאקסס לכתוב לך את השאילתות, כתוב אותן בעצמך.
ועוד נקודה למחשבה: נניח ואתה מקבל קוד שמישהו כתב, ובו משפט SQL שהוא קצת מסובך. מה אתה עושה אז?
ואולי גם זה יעזור
הילדה כתבה על איך משרשרים שאילתא.
=>
איזה יופי! תודה רבה!
הדפסתי את משפט ה-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.
מה הנכוונה פה?
תודה אלברט
מי טועה?
אז ככה:
השגיאה הזו אומרת שאתה מנסה לבצע פעולות על ה 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
"דני מלך המחשבים".
==>
מה הכוונה "ריק או נחמקה ממנו"?
ואני עשיתי פעולה כזאת על הRECORDSET שלי:
<%Do While Not rs.EOF%>
…..
<%
rs.MoveNext
loop
%>
תודה לך ולכל העוזרים, אלברט
נכון
בדיוק מה שזה נשמע –
ה recordset שלך פשוט ריק – אין בו נתונים.
כנראה שהשיאלתה שלך לא החזירה אף רשומה ממסד הנתונים.
לגבי "נמחקה בו רשומה", יש אופציה למחוק רשומות מתוך ה recordset, ואז, אם מנסים לגשת אל רשומה שנמחקה ממנו, מקבלים את אותה שגיאה שאתה קיבלת.
איך זה יכול להיות?
כלומר, אתה אומר שאין שום רשומה בטבלת התוצאות וטבלת התשובות שה- 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"
הוא נכון?
תודה, אלברט
בבקשה…