ExecuteScalar

אוהדד

New member
היי.... איך מורץ המסך שלי ?

היי, כתבתי מסך aspx פשוט שבו כפתור אחד, ב Code Behind של ארוע ה Button Click כתבתי מעט קוד. הרצתי את העמוד. מה בדיוק קורה שם מאחור ? האם הדף נשלח ל IIS, ה IIS מעבד אותו, מפיק דף HTML הנשלח ללקוח, ואת הדף הזה הדפדפן מציג לי ? ומה קורה כשאני לוחץ על הכפתור ? מה בדיוק נשלח לשרת ?
 

אוהדד

New member
הפרדה בין קוד לעיצוב

הרעיון של הפרדה בין קוד שרת, לעיצוב המסך הינו מעולה, אך משהו לא מסתדר לי. בדוגמא הזו למשל. אני מבין לא הפרידו לקבצים שונים את העיצוב (HTML) וקוד השרת (script), האם זה פיצ'ר רק של ויזואל סטודיו דוט נט ? ומה שיותר חשוב הוא, שכאשר אני כותב זאת ויזואל סטודיו דוט נט,אז הוא מוסיף לי עוד כל מיני קטעי קוד (למשל ב Initalize), פה אני לא רואה קוד כזה...
 

yuval k

New member
../images/Emo26.gif

ראה במאמר ב-Webmaster.org.il
 

yuval k

New member
ענייני הפרדה ../images/Emo11.gif

• בדוגמא הזו אין צורך בכך. הקוד שייך לתצוגה (מעדכן פריטי תצוגה), ולכן מקומו שם. • הפונקציות הנוספות שה-Visual Studio מוסיף לך לא נחוצות לתפקוד שרצינו להדגים בקובץ, לכן הן לא מופיעות שם.
 

אוהדד

New member
מממ....

אם הייתי כותב את הקוד ב VS, אך קוד ה Page Load היה נכתב בקובץ ה cs, נכון ?
 

yuval k

New member
אם היית כותב את קוד צד-השרת של הדף

בתור Code Behind, אז כן.
 

אוהדד

New member
אז אני מחליט היכן לכתוב

את קוד צד השרת, בין אם בקוב. Code Behind, ובין אם באותו קובץ של עיצוב ה HTML ? פרט לנוחות, אין שום הבדל ? אם יש לי פרוייקט גדול, אני יכול לקחת את כל קוד צד השרת של כל עמוד, ולדחוץ אותו בתוך קובץ ה aspx, ב head, בתוך טאג script, וא היה שום הבדל ת'כלס ?
 

gilad g

New member
יש הבלים בקוד..

השמות של המתודות שלך שונים, אתה מוסיף Event Handlers, עושה Overrides כשצריך, וכו'. הבדל מהותי - הקוד שבדף ה-ASPX מתקמפל בזמן ריצה, ואילו הקוד שבקבצי ה-cs מתקמפל כשאתה מבקש מה-VS לקמפל אותו
 

אוהדד

New member
לא ממש הבנתי...

יש לי נניח פרודצורה Page_Load, זה משנה אם היא תכתב ב ASPX במקום ב CS ? (פרט לסוגייתה קימפול שהזכרת)
 

gilad g

New member
לא.

מבחינת המשמעות - המשמעות של Page_Load ב-codebehind ובדף ASPX היא אותה משמעות (טוב, כמעט). הסינטקס של ההכרזה עליהן הוא לא אותו דבר.
 

gilad g

New member
זה לא אותו סינטקס:

//aspx public void Page_Load(object sender, EventArgs e) { //..... } //Code Behind protected override void OnLoad(EventArgs e) { //.... }​
ב-CodeBehind אפשר גם להוסיף event handler, אבל זה סתם פוגע בביצועים.
 

אוהדד

New member
לא הפוך ?

כי אצלי ב Code Behind (mypage.cs) מופיע: private void Page_Load(object sender, System.EventArgs e)
 

gilad g

New member
זה בגלל שה-VS.NET

משתמש ב-Event Handlers, והוא מסתיר ממך את החלק שמחבר את Page_Load ל-event. פתח את "Web Forms Designer Generated Code", ותראה את החצי השני שהוא לא מראה לך. אני לא אוהב לעבוד ככה (ולדעתי, לא אמורים לעבוד ככה), אלא בשיטת ה-Override ל-OnLoad. סתם לזרוק event זה יקר מבחינת ביצועים.
 

אוהדד

New member
private void InitializeComponent()

אני מתחיל להבין...
this.Load += new System.EventHandler(this.Page_Load); אני מבין שהשורה הנ"ל היא שייך ה EventHandler, אפשר הסבר קצר יותר לעומק ? this זה מצביע ל... ? =+ ? הוא מגדיל את עצמו ? ולבסוף : אני מבין שהוא משייך את הפונקציה Page_Load ל Load, לא ל OnLoad...
 

gilad g

New member
הממ

"this זה מצביע ל... ?" מצביע לקלאס שאנחנו נמצאים בו. במקרה שלך, זה ה-Codebehind class (זה שיורש מ-Page). "=+ ? הוא מגדיל את עצמו ?" לא. += הוא אופרטור של שיוך delegate (כלומר, "כתובת-של" מתודה מסוימת) ל-event. "ולבסוף : אני מבין שהוא משייך את הפונקציה Page_Load ל Load, לא ל OnLoad..." Load זה שמו של ה-event. OnLoad היא מתודה prtoected שנמצאת במחלקה Page והתפקיד שלה הוא רק להקפיץ את ה-event. כשעושים override למתודה הזאת, בעצם אומרים "עכשיו המתודה שאני כותב פה תרוץ במקום ה-OnLoad של ה-base class (ה-base class, להזכירך הוא Page).
 

אוהדד

New member
ExecuteScalar

מדוע אינני מצליח לבצע את :
OleDbCommand countCmd = new OleDbCommand("select count(*) from mytable",myConn); int countRows = (int)countCmd.ExecuteScalar();​
myConn הוא קונקשין שפתחתי לפני כן. השגיאה :
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. Source Error: Line 44: OleDbCommand countCmd = new OleDbCommand("select count(*) from mytable",myConn); Line 45: Line 46: int countRows = (int)countCmd.ExecuteScalar(); Line 47: /* Line 48: if (countRows == 1)​
 

אוהדד

New member
אתה זה אני רואה, זה כתוב.. השאלה

היא למה, ואיך פותרים את זה ? ולא יכול להיות שהשאילתא לא החזירה כלום, זה (*)count וכמובן שבדקתי אותה לפני כן...
 
למעלה