עבור לתוכן

עזרה|זריקת exception

Featured Replies

פורסם



using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

namespace LibrarySite
{
public partial class Defult : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["isAdmin"] ==null)
{
imgAdmin.Visible = false;
if (Session["isUser"] == null)
{
imgUser.Visible = false;
}
}

}
}
protected void btnDoLogin_Click(object sender, EventArgs e)
{

string connectionstring = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Documents and Settings\\omer\\שולחן העבודה\\ws16910michleviz\\db\\LibraryDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection connection = new SqlConnection(connectionstring);
try
{
connection.Open();
txtauthorised.Text = "חיבור פתוח";
Session["IsUser"] = true;

}
catch (AccessViolationException ex)
{
lblMassage.Text = ex.Message;
//lblMassage.Text = "הנתונים שהוקלדו אינם תקינים";
Response.Redirect("Reg.aspx");
if (txtUserName.Text == "Coco" && txtPassword.Text == "120993")
Session["isAdmin"] = true;



}
string username = txtUserName.Text;
string password = txtPassword.Text;
SqlCommand command = new SqlCommand("SELECT * FROM [Korym] where UserNickName='" + username + "' AND UserPassword= '" + password + "'", connection);
SqlDataReader reader = null;
reader = command.ExecuteReader();
while (reader.Read())
{

lblMassage.Text = string.Format("ברוך הבא- ", username.ToString());
btnDoLogin.Visible = false;
imgUser.Visible = true;
}


}
protected void txtUserName_TextChanged(object sender, EventArgs e)
{

}

protected void imgUser_Click(object sender, ImageClickEventArgs e)
{

}
}
}


מה שלמעשה אני רוצה שיקרה בפועל זה שכשאר אין משתמש מזוהה הוא יבדוק ב catch האם יש משתמש עם סיסמא מסויימת אם לא אז שיעביר את הלקוח לדף אחר ואם הוא מוצא את אותו משתמש מסויים(מנהל-UserName=omer Pas..) אז שיצור Session["IsAdmin"..

מן הסתם זה לא עובד ואני לא מבין למה..תודה על העזרה...

פורסם

לא ברורה לי בכלל הלוגיקה של הקוד שלך.

מה הקשר ל-AccessViolationException? אתה יודע מה המשמעות של החריגה הזו?

למה בכלל אתה רוצה לעבוד עם חריגות? מה רע ב-if/else פשוט?

פורסם
  • מחבר

1. מתודת הPage_Load-בודק האם יש סשן של אדמין או יוזר.אם אין,אז היא מחביאה שתי תמונות שכשמתחברים בין אם זה מנהל או משתמש אז מוצדגת לו תמונה בהתאדם.

2.פונקצית הbtnDo...יוצרת קישור למסד נתונים אם השאילתה למציאת משתמש תקינה(יש כזו) אזי הודעה בהתאם ואם לא אז אני יוצא מנקודת הנחה שעכשיו נכנס ה catch לפעולה..

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

יש קצת האמת בעיה בלוגיקה,בשביל זה באתי לפה :P..

פורסם
  • מחבר

לגבי ה exception מן הסתם לא הבנתי בדיוק את משמעות החריגה..

if/false,אני יודע שתמיד בחיבור למסד נתונים משתמשים ב try and catch.

פורסם

לא יודע מי לימד אותך את זה.

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

משתמשים ב-try/catch כשאתה חושש שפונקציה מסוימת תזרוק חריגה כלשהי, ורוצה להתכונן בהתאם. לדוגמה, כשאתה פותח חיבור למסד נתונים באמצעות SqlConnection.Open, יש סיכוי מסוים שהחיבור ייכשל - נניח, אם יש בעיות תקשורת, או שהכנסת פרטי משתמש לא נכונים להתחברות. אז עוטפים את הקריאה לפונקציה ב-try/catch ומטפלים בחריגות האפשריות. אתה לא צריך לנחש איזו חריגה יכולה להיזרק - הכל כתוב בתיעוד של הפונקציה, לדוגמה כאן.

הלוגיקה של הפונקציה שלך צריכה להיות משהו כזה:

1. תתחבר למסד הנתונים.

2. בצע את השליפה מהמסד, לפי פרטי המשתמש.

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

4. אם כן הוחזרו רשומות - מזל טוב, זהו משתמש חוקי. קח את הרשומה הראשונה (אמורה להיות בכל מקרה רק אחת, כי אם כתבת את הקוד שלך נכון אז לא אמורים להיות שני משתמשים עם אותו שם וסיסמה) ותעשה מה שצריך עם הפרטים של המשתמש, כולל לקבוע את פרטי ה-session.

פורסם
  • מחבר

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

במקרה שהסיסמא לא נכונה או שאין משתמש כזה אין בעיה לבדוק משתמש וסיסמא ספציפים.ז"א בדיקה ישירה כמו לדו':

TextBox.Text="sdfs" and pas.Text... נכון?.

בכל מקרה תודה רבה!,אין עליך שניצל!!,אתה תמיד מכסה חומר שמערכת החינוך הכושלת לא מצליחה לעשות(טוב סטיתי מהנושא :) ).

שוב תודה :xyxthumbs:

פורסם

מה? למה שתרצה לעשות כזה דבר? אין שום סיבה ששם משתמש וסיסמה כלשהם יהיו כתובים בתוך הקוד עצמו (מה שנקרא hard-coded). הכל צריך לשבת בתוך מסד הנתונים.

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

ניסתי את ה System.Invaild ולא הולך...

[







using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;


namespace LibrarySite
{
public partial class Defult : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["isAdmin"] ==null)
{
imgAdmin.Visible = false;
if (Session["isUser"] == null)
{
imgUser.Visible = false;
}
}

}
}
protected void btnDoLogin_Click(object sender, EventArgs e)
{
//תתחבר למסד הנתונים.
string connectionstring = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Documents and Settings\\omer\\שולחן העבודה\\ws16910michleviz\\db\\LibraryDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection connection = new SqlConnection(connectionstring);
try
{
connection.Open();
txtauthorised.Text = "חיבור פתוח";



}
catch (System.Data.InvalidExpressionException)
{
//אם לא הוחזרו רשומות - סימן שאין משתמש כזה, או שהסיסמה לא נכונה. במקרה כזה אתה צריך להודיע על שגיאה ולהפנות את המשתמש לדף ההרשמה.
lblMassage.Text = "הנתונים שהוקלדו אינם תקינים";
Response.Redirect("Reg.aspx");


}
//בצע שליפה
SqlCommand command = new SqlCommand("SELECT * FROM [Korym] where UserNickName='" + username + "' AND UserPassword= '" + password + "'", connection);
SqlDataReader reader = null;
reader = command.ExecuteReader();
while (reader.Read())
{
//אם כן הוחזרו רשומות - מזל טוב, זהו משתמש חוקי. קח את הרשומה הראשונה (אמורה להיות בכל מקרה רק אחת, כי אם כתבת את הקוד שלך נכון אז לא אמורים להיות שני משתמשים עם אותו שם וסיסמה) ותעשה מה שצריך עם הפרטים של המשתמש, כולל לקבוע את פרטי ה-session.
lblMassage.Text = string.Format("ברוך הבא- ", username.ToString());
btnDoLogin.Visible = false;
imgUser.Visible = true;
Session["IsUser"] = true;
}


}
protected void txtUserName_TextChanged(object sender, EventArgs e)
{


}


protected void imgUser_Click(object sender, ImageClickEventArgs e)
{


}
}
}




פורסם

מה הקשר ל-InvalidExpressionException? איך הגעת לחריגה הזו? קראת איפשהו שזו חריגה שיכולה להיזרק מ-SqlConnection?

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

פורסם
  • מחבר

איך אני אני בודק אם השאילתא החזירה תוצאה?,והאם היא נכונה?.

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

פורסם

השאילתא מחזירה תוצאות לתוך ה-reader. כל פעם שאתה קורא לפונקציה reader.Read, היא קוראת את הרשומה הבאה שהוחזרה ע"י השאילתא שלך. אם יש רשומה לקרוא היא מחזירה true, אחרת היא מחזירה false. תחשוב איך להשתמש בזה כדי לדעת כמה רשומות החזירה השאילתא, ואיך להשתמש בזה כדי לדעת אם היא הצליחה או לא.

פורסם
  • מחבר

תודה רבה :xyxthumbs:

ארכיון

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

דיונים חדשים