שלח תשובה

זירת השאלות

402
צפיות
36
תשובות

שאלה בחלוקת לעמודים

,‏ 2 בנובמבר, 2004

יש את המאמר כאן באתר, ויש את הקטע של הצגת הנתונים:

Do While Not rs.EOF AND i < rs.pagesize
    ' Data manipulation
    i=i+1
    rs.MoveNext
Loop


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

תודה לעוזרים.

תגיות:

36 תשובות

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

    או אפילו יותר טוב (ברוב המוחלט
    (ברוב המוחלט של המקרים).
    לשלוף אך ורק את המידע שאנו צריכים בשאילתת ה-SQL
    עוד מידע על הביצוע של זה דרך ה-SQL אפשר למצוא ב-FAQ של מדור SQL

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

    השאילתה הזאת מאד מאד לא יעילה
    על טבלה בעלת מאה אלף רשומות באקסס, עם אינדקסים, היא תרוץ כמה דקות.

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

    גם אם תשלוף הכל ואז תחלק ברמת ה-ASP
    זה ירוץ קצת יותר מכמה דקות (במיוחד שיש הרבה נתונים שלא נחוצים לאותו עמוד)
    אפשר לשפר זאת בד"כ על ידי פיצול השאילתא הזו לשתי שאילתות
    האחת שמוציאה רשימה של IDים ואז להכניס אותה ברמת ה-ASP ל-getString מופרד בפסיק.
    השאילתא השנייה תקבל את הרשימה לתוך in .

    זה בד"כ ישפר את הביצועים.

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

    לא נכון
    1. קודם כל, זה לא ירוץ יותר מכמה דקות.
    2. אם אתה מתכוון לשאילתה אחת לדף הראשי ושאילתה אחת לשאר הדפים – אני מסכים איתך – אבל זה לא הנושא ולא קשור למה שאמרתי.
    3. אתה צודק בכיוון שלך – השאלה איך זה יראה שאתה משרשר מחרוזת בגודל מאות אלפי תווים ועוד אח"כ שולח אותה למסד.

    בדיוק תכננתי מאמר על זה בווב אפדייט הקרוב

  5. Night הגיב:

    בעיה עם rs.PageCount
    שאני משתמש במאפיין הזה (שם אותו בתוך משתנה)
    מוחזרת לי שגיאה: Invalid character
    rs לא EOF
    ניסיתי גם להדפיס את הערך של rs.PageCount ומחזיר אותה שגיאה.

    למישהו יש מושג מה הבעיה?

  6. BuildHome הגיב:

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

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

    בקשר ל-2
    אז בכלל לא נגעתי שנושא הזה (למרות שאני מסכים עם זה).

    בקשר ל-1 אז
    אני למדתי מכאן/תפוז/איציק 1(בזמנו) שרצוי לשלוף אך ורק את הנתונים שצריך
    חלוקה לעמודים ברמת ה-ASP מכריחה אותך לשלוף את כל הנתונים (מעבר למה שצריך) וא"כ לבחור את סט הנתונים שצריך.

    בקשר ל-3 אז לא הבנתי איך הגעת ל-עשרות אלפי תווים.

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

    אורי, אם זה בלי benchmark זה לא זה.
    אם אתה זוכר את המאמר המפורסם של דגון על יעילות של JS לעומת VBS, אנחנו רוצים גם מדידת זמנים וגרפים…

    או לפחות, באיזה סדרי גודל של רשומות עדיף להשתמש בשאילתה מקוננת ובאיזה עדיף להשתמש בחלוקה מתוך ה recordset…

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

  9. Night הגיב:

    לא עובד
    קוד:

    rs.ActiveConnection=conn
    rs.PageSize=numRecs
    rs.CacheSize=numRecs
    rs.Open sql,,3,1
    if not rs.EOF then
     pCount=rs.PageCount
     rs.AbsolutePage=p

    אותה שגיאה..

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

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

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

    תחשוב מה זה לעשות getString
    לעשרות אלפי רשומות.
    קודם כל, זה מופרד בפסיקים וכבר מוסיף הרבה. דבר שני – ה ID לא מורכבים מספרה אחת, אלא כמה ספרות – מה שמנפח את גודל השאילתה. אני בספק אם המנוע יכול לקבל כזה גודל של שאילתא – כך שאתה יכול להוריד את אפשרות ה GetString.

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

    ההתחמקות האלגנטית…
    אני בטוח שהכלב אפפעם לא אכל לך את שיעורי הבית…

    האיגואנה שלך פשוט השתינה עליהם, אה?

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

    תגדיר לי יצירתי
    נגיד ויש לי טבלת מאמרים:
    ID, נושא, תוכן, כתב ID, תאריך פירסום

    יש לי בטבלה אלפי מאמרים אני רוצה לחלק את המאמרים לעמודים , 15 מאמרים בכל עמוד כאשר יש לכל מאמר 120 אותיות ראשונות של המאמר, וכמובן שבשאילתא אני מבצע JOIN כדי לקבל את הכתב ואת ה-ID שלו.

    אני יודע לעשות זאת בדרך הרגילה.
    עכשיו תראה לי דרך יצירתית כדי לעשות חלוקה לעמודים עבור השאילתא הזו:

    SELECT a.aId, a.subject, Left(a.content,120) AS f120Con, a.publishDate, a.writerId, b.wrtName
    FROM tblArticles AS a INNER JOIN tblWriter AS b ON a.writerId=b.wrtID

    אשמח לשמוע את רעיון יצירתי

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

    חס וחלילה התחמקות –
    אני כבר עשיתי את זה

    ובקשר ל benchmarking – יהיה בווב אפדייט הקרוב. וסתם בשביל הסקרנות – בסביבות 1000 רשומות זה כבר מתחיל לרוץ יותר מידי זמן.

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

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

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

    אפשר להעביר את ה-ID האחרון שנשלף
    באותו עמוד לעמוד הבא ב-QueryString ןאז לשלוף 15 הודעות ראשונות שה-ID שלהן אחרי ה-ID שנשלח
    וכך הלאה . הבעיה היא זה לנחש את ה-IDים של העמודים הבאים.

    וזה מופיע ב-FAQ.

  17. Night הגיב:

    זה אותו דבר
    בקוד שצירפתי, היה את השורה:

    rs.activeConnection=conn

    אז לא צריך לרשום conn בשורה של פתיחת משפט הSQL..
    בכל זאת ניסיתי לרשום conn ולא השתנה כלום.

    למישהו יש פתרון בבקשה?

  18. MasterMind הגיב:

    צמע… זה לא ממש בריא….
    לשלוף את כל הרשומות כשאתה צריך רק 15  הנה תשובה מתאימה של ניר המלך(או טייב או nir the king – ראבק  כמה שינית את השם משתמש שלך)
    https://www.webmaster.org.il/Faq_A.asp?sSubject=7&QId=118
    נ.ב.
    מתאים גם לSQL SREVER ואם תרים את ראשך קצת למעלה
    תראה עוד בשירשור שלך (תגרה) קטנה בנוגע לחלוקה

  19. MasterMind הגיב:

    חחח אמרתי לו אבל הוא לא מקשיב
    וזה מה שאמרתי שלא ממש בריא להוציאת כל המידע
    עדיף להוציא רק את ה 15 הראשונים ואותם להכניס למערך
    אתה לא מאמין איזה פלאות זה עושה

  20. Night הגיב:

    אני משתמש בMySQL!
    והרעיון של שליפת 15 רשומות ואז לפי הID של הרשומה האחרונה שולפים עוד 15 וכ'ו..
    יש בעיה, אני לא יודע כמה עמודים יהיו אז אני לא יכול לעשות תפריט ניווט.

  21. BuildHome הגיב:

    תשובה
    תעשה סה"כ מספר הרשומות חלקי מספר הרשומות לעמוד ותיקח את המספר ללא השארית ויש לך את מספר העמודים.
    במידה והתוצאה קטנה מ-1 אז יש רק עמוד אחד.

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

    ב-MySQL זה יותר פשוט
    שאתה מעביר עמודים אתה שולח ב-QS את המס' של העמוד
    אתה קובע משתנה מסויים שהוא מס' הרשומות בעמוד ואז עושה משהו כזה:

    SELECT <fields>
    FROM <tbl(s)>
    ORDER BY <fld> [DESC]
    LIMIT <number of records in page>*<page number>, 2*<number of records in page>;

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

    תיקון קטן

    dim sql, to, from,pagenumber
    const numOfRec =15
    pagenumber = cint(Request("PageNumber"))
    from = cint(numOfRec*pagenumber)
    to = from + numOfRec
    sql = "SELECT <fields> " &_
             "FROM <tbl(s)> " &_
             "ORDER BY <fld> [DESC] " &_
             "LIMIT " & from & ", " & to & ";"

    oRecordset.Open sql, oConnection

  24. Night הגיב:

    תודה רבה לשניכם!
    הבנתי את העיקרון ואני אבנה את זה.
    תודה רבה.

  25. Night הגיב:

    שגיאה מוזרה
    כנראה לIIS שלי יש בעיה עם העמוד המסויים הזה שאני בונה, בשורה 21.
    לא משנה מה כתוב בשורה הזאת, הוא כותב לי שגיאה:
    Invalid character
    ניסיתי לעשות את השורה הערה, למחוק אותה לגמרי.. יש לי את השגיאה הזאת.
    הבעיה שהייתה לי עם rs.pageCount (זה היה שורה 20) הוחזרה לי אותה שגיאה…

    זה קרה אי פעם למישהו? מה אני אמור לעשות עכשיו? אני לא יכול לכתוב כלום בשורה הזאת. תמיד תיהיה לי שגיאה.

  26. Night הגיב:

    נו בבקשה תעזרו…
    אני נואש אני לא יודע מה לעשות עם זה!

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

    בפעם האחרונה שקרה לי דבר כזה
    נאלצתי לכתוב את כל הדף מחדש, ורק אז זה עבד.

    יכול מאוד להיות שהשורה שכתובה בהודעת השגיאה היא לא השורה הבעייתית,
    נסה לכתוב מחדש 5 שורות מעל ומתחת לשורה שמופיעה בהודעת השגיאה.

    אם זה לא יעבוד, נראה לי שאין מנוס מלכתוב את כל הדף מחדש.

  28. Night הגיב:

    הא אבל..
    אם אני יעשה העתק הדבר לעמוד, או שאני יעתיק את הקוד וישים אותו בעמוד אחר בעל שם אחר, השגיאה תחזור.

    איך אני כותב את זה מחדש כך שזה יפעיל את זה ולא "יחשוב" שעשיתי העתק הדבק?

שלח תשובה