402
צפיות
צפיות
36
תשובות
תשובות
שאלה בחלוקת לעמודים
יש את המאמר כאן באתר, ויש את הקטע של הצגת הנתונים:
Do While Not rs.EOF AND i < rs.pagesize
' Data manipulation
i=i+1
rs.MoveNext
Loop
עכשיו, חבל לי להשאיר רקורדסט פתוח למשך כל הלולאה.. אז חשבתי לעשות getRows.
השאלה היא, מה אני עושה עם הקוד למעלה, כך שיתאים לעבודה עם מערך של תוצאות השאילתה?
תודה לעוזרים.
36 תשובות
המאמר
נכון מאוד חבל
לכן אפשר פשוט להעביר את הכל ל-getRows
או אפילו יותר טוב (ברוב המוחלט
(ברוב המוחלט של המקרים).
לשלוף אך ורק את המידע שאנו צריכים בשאילתת ה-SQL
עוד מידע על הביצוע של זה דרך ה-SQL אפשר למצוא ב-FAQ של מדור SQL
ממש לא.
למה לא ?
שאומרים משהו רצוי לפרט
השאילתה הזאת מאד מאד לא יעילה
על טבלה בעלת מאה אלף רשומות באקסס, עם אינדקסים, היא תרוץ כמה דקות.
גם אם תשלוף הכל ואז תחלק ברמת ה-ASP
זה ירוץ קצת יותר מכמה דקות (במיוחד שיש הרבה נתונים שלא נחוצים לאותו עמוד)
אפשר לשפר זאת בד"כ על ידי פיצול השאילתא הזו לשתי שאילתות
האחת שמוציאה רשימה של IDים ואז להכניס אותה ברמת ה-ASP ל-getString מופרד בפסיק.
השאילתא השנייה תקבל את הרשימה לתוך in .
זה בד"כ ישפר את הביצועים.
לא נכון
1. קודם כל, זה לא ירוץ יותר מכמה דקות.
2. אם אתה מתכוון לשאילתה אחת לדף הראשי ושאילתה אחת לשאר הדפים – אני מסכים איתך – אבל זה לא הנושא ולא קשור למה שאמרתי.
3. אתה צודק בכיוון שלך – השאלה איך זה יראה שאתה משרשר מחרוזת בגודל מאות אלפי תווים ועוד אח"כ שולח אותה למסד.
בדיוק תכננתי מאמר על זה בווב אפדייט הקרוב
בעיה עם rs.PageCount
שאני משתמש במאפיין הזה (שם אותו בתוך משתנה)
מוחזרת לי שגיאה: Invalid character
rs לא EOF
ניסיתי גם להדפיס את הערך של rs.PageCount ומחזיר אותה שגיאה.
למישהו יש מושג מה הבעיה?
תשובה
אילו הרשאות הגדרת לפתיחת הרקורדסט?
צריך להגדיר את המספרים 3,1 וזה אמור לעבוד (לא יודע איך זה אצלך – תראה קוד רלוונטי).
בקשר ל-2
אז בכלל לא נגעתי שנושא הזה (למרות שאני מסכים עם זה).
בקשר ל-1 אז
אני למדתי מכאן/תפוז/איציק 1(בזמנו) שרצוי לשלוף אך ורק את הנתונים שצריך
חלוקה לעמודים ברמת ה-ASP מכריחה אותך לשלוף את כל הנתונים (מעבר למה שצריך) וא"כ לבחור את סט הנתונים שצריך.
בקשר ל-3 אז לא הבנתי איך הגעת ל-עשרות אלפי תווים.
אורי, אם זה בלי benchmark זה לא זה.
אם אתה זוכר את המאמר המפורסם של דגון על יעילות של JS לעומת VBS, אנחנו רוצים גם מדידת זמנים וגרפים…
או לפחות, באיזה סדרי גודל של רשומות עדיף להשתמש בשאילתה מקוננת ובאיזה עדיף להשתמש בחלוקה מתוך ה recordset…
אני מניח שלא תוכל לבדוק את זה על יותר משנים שלושה סוגים של מסדי נתונים, אז יש מצב שלא יהיו תוצאות חד משמעיות, אבל לדעתי זה חלק בלתי נפרד מהמאמר.
מאות-אלפי
לא עובד
קוד:
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
אותה שגיאה..
ככה
rs.open sql,conn,3,1
תגובה לשניכם
התשובה היא לא זה ולא זה… צריך למצוא דרך יצירתית לנהל את הנתונים שלכם (כל מקרה לגופו) כדי לדעת בדיוק מה לשלוף.
תחשוב מה זה לעשות getString
לעשרות אלפי רשומות.
קודם כל, זה מופרד בפסיקים וכבר מוסיף הרבה. דבר שני – ה ID לא מורכבים מספרה אחת, אלא כמה ספרות – מה שמנפח את גודל השאילתה. אני בספק אם המנוע יכול לקבל כזה גודל של שאילתא – כך שאתה יכול להוריד את אפשרות ה GetString.
ההתחמקות האלגנטית…
אני בטוח שהכלב אפפעם לא אכל לך את שיעורי הבית…
האיגואנה שלך פשוט השתינה עליהם, אה?
תגדיר לי יצירתי
נגיד ויש לי טבלת מאמרים:
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
אשמח לשמוע את רעיון יצירתי
חס וחלילה התחמקות –
אני כבר עשיתי את זה
ובקשר ל benchmarking – יהיה בווב אפדייט הקרוב. וסתם בשביל הסקרנות – בסביבות 1000 רשומות זה כבר מתחיל לרוץ יותר מידי זמן.
יפורסם בווב אפדייט הקרוב
תכננתי מאמר על זה. בנתיים תחשוב
אפשר להעביר את ה-ID האחרון שנשלף
באותו עמוד לעמוד הבא ב-QueryString ןאז לשלוף 15 הודעות ראשונות שה-ID שלהן אחרי ה-ID שנשלח
וכך הלאה . הבעיה היא זה לנחש את ה-IDים של העמודים הבאים.
וזה מופיע ב-FAQ.
זה אותו דבר
בקוד שצירפתי, היה את השורה:
rs.activeConnection=conn
אז לא צריך לרשום conn בשורה של פתיחת משפט הSQL..
בכל זאת ניסיתי לרשום conn ולא השתנה כלום.
למישהו יש פתרון בבקשה?
צמע… זה לא ממש בריא….
לשלוף את כל הרשומות כשאתה צריך רק 15 הנה תשובה מתאימה של ניר המלך(או טייב או nir the king – ראבק כמה שינית את השם משתמש שלך)
נ.ב.
מתאים גם לSQL SREVER ואם תרים את ראשך קצת למעלה
תראה עוד בשירשור שלך (תגרה) קטנה בנוגע לחלוקה
תסתכל כאן
ולא הייתי קורא לזה תגרה
חחח אמרתי לו אבל הוא לא מקשיב
וזה מה שאמרתי שלא ממש בריא להוציאת כל המידע
עדיף להוציא רק את ה 15 הראשונים ואותם להכניס למערך
אתה לא מאמין איזה פלאות זה עושה
אני משתמש בMySQL!
והרעיון של שליפת 15 רשומות ואז לפי הID של הרשומה האחרונה שולפים עוד 15 וכ'ו..
יש בעיה, אני לא יודע כמה עמודים יהיו אז אני לא יכול לעשות תפריט ניווט.
תשובה
תעשה סה"כ מספר הרשומות חלקי מספר הרשומות לעמוד ותיקח את המספר ללא השארית ויש לך את מספר העמודים.
במידה והתוצאה קטנה מ-1 אז יש רק עמוד אחד.
ב-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>;
תיקון קטן
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
תודה רבה לשניכם!
הבנתי את העיקרון ואני אבנה את זה.
תודה רבה.
שגיאה מוזרה
כנראה לIIS שלי יש בעיה עם העמוד המסויים הזה שאני בונה, בשורה 21.
לא משנה מה כתוב בשורה הזאת, הוא כותב לי שגיאה:
Invalid character
ניסיתי לעשות את השורה הערה, למחוק אותה לגמרי.. יש לי את השגיאה הזאת.
הבעיה שהייתה לי עם rs.pageCount (זה היה שורה 20) הוחזרה לי אותה שגיאה…
זה קרה אי פעם למישהו? מה אני אמור לעשות עכשיו? אני לא יכול לכתוב כלום בשורה הזאת. תמיד תיהיה לי שגיאה.
נו בבקשה תעזרו…
אני נואש אני לא יודע מה לעשות עם זה!
בפעם האחרונה שקרה לי דבר כזה
נאלצתי לכתוב את כל הדף מחדש, ורק אז זה עבד.
יכול מאוד להיות שהשורה שכתובה בהודעת השגיאה היא לא השורה הבעייתית,
נסה לכתוב מחדש 5 שורות מעל ומתחת לשורה שמופיעה בהודעת השגיאה.
אם זה לא יעבוד, נראה לי שאין מנוס מלכתוב את כל הדף מחדש.
טוב, תודה.
הא אבל..
אם אני יעשה העתק הדבר לעמוד, או שאני יעתיק את הקוד וישים אותו בעמוד אחר בעל שם אחר, השגיאה תחזור.
איך אני כותב את זה מחדש כך שזה יפעיל את זה ולא "יחשוב" שעשיתי העתק הדבק?