2013-04-26 4 views
0

У меня проблема с кодом на C#. Я создал форму входа в C# 2010. Когда я проверяю имя пользователя, я использовал if-condition внутри while loop, но дело в том, что даже когда имя пользователя и пароль верны, он выполняет команду else-statement. Пожалуйста, помогите мне решить эту проблему.с использованием условия IF внутри цикла while в C#

Вот мой код:

private void btnlogin_Click(object sender, EventArgs e) { 
    string connection= 
     @"Data Source=.\SQLEXPRESS;" 
     +" AttachDbFilename=|DataDirectory|ResturantDB.mdf;" 
     +" Integrated Security=True; User Instance=True"; 

    SqlConnection cn=new SqlConnection(connection); 

    try { 
     cn.Open(); 
    } 
    catch(Exception) { 
     // print the exception's message? 
     MessageBox.Show("Connection to Database failed; check Connection!"); 
    } 

    SqlCommand cmd=new SqlCommand("SELECT * FROM [Login]", cn); 
    cmd.Connection=cn; 
    SqlDataReader reader=null; 
    reader=cmd.ExecuteReader(); 

    while(reader.Read()) { 
     if(
      txtuser.Text==(reader["Username"].ToString()) 
      && 
      txtpass.Text==(reader["Password"].ToString()) 
      ) { 
      //MessageBox.Show("logged in!"); 
      Home newhome=new Home(); 
      newhome.Show(); 
      this.Hide(); 
     } 
     else { 
      MessageBox.Show("Incorrect credentials!"); 
     } 
    } 
} 
+0

У вас есть только один ро w в таблице входа в систему? –

+5

Во-первых: кажется, что вы храните пароли в текстовом виде. Не надо! На SO есть много вопросов о хэшировании и солевом пароле. пожалуйста, внимательно прочитайте их. Во-вторых: вы не хотите запрашивать * все * строки в своей учетной записи. Только тот, который соответствует данному 'Username'. Тогда проверьте только один раз. Не используйте здесь петлю. – Corak

ответ

0

я решить ее на этом пути:

private void btnlogin_Click(object sender, EventArgs e) 
{ 
    string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|ResturantDB.mdf;Integrated Security=True;User Instance=True"; 
    SqlConnection cn = new SqlConnection(connection); 
    try 
    { 
     cn.Open(); 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Conncetion to Database faild check Connection !"); 
    } 

    while (true) 
    { 
     SqlCommand cmd = new SqlCommand("SELECT [Password] FROM [Login] WHERE [Username] = '" + txtuser.Text + "'", cn); 
     cmd.Connection = cn; 
     SqlDataReader reader = null; 
     reader = cmd.ExecuteReader(); 

     if (!reader.HasRows) 
      MessageBox.Show("User does not exist. Please, try again."); 
     else 
     { 
      //username should be unique, so only one row is possible to have 
      reader.Read(); 
      if (txtpass.Text == (reader["Password"].ToString())) 
       { 
        //MessageBox.Show("loged in!"); 
        Home newhome = new Home(); 
        newhome.Show(); 

        this.Hide(); 
        return; 
       } 
      else 
        MessageBox.Show("Incorrect credentian..! Try again."); 
     } 
    } 
} 
+0

Посмотрите на комментарии к ответу @ crapple. Используйте [SqlParameter] (http://msdn.microsoft.com/library/system.data.sqlclient.sqlparameter.aspx), и, как сказал @comecme, у вас могут возникнуть проблемы, если в 'Username' есть несколько' Password '. – Corak

2

Вы проверки, если все пользователи имеют такое же имя пользователя и пароль. Вам нужно уточнить свой SQL, чтобы выбрать только одного пользователя. Кроме того, пожалуйста, прочитайте хэширование пароля для своих пользователей.

2

Потому что это в петле.

создать переменную bool. обновить его значение в цикле (если найдено то же имя пользователя и пароль) и проверить вне на основе его значения.

ли это

bool found; 
while (reader.Read()) 
{ 
    if (txtuser.Text == (reader["Username"].ToString()) && 
     txtpass.Text == (reader["Password"].ToString())) 
    { 
     found = true; 
     break; 
    }     
} 
if (found) 
{ 
    MessageBox.Show("loged in!"); 
    Home newhome = new Home(); 
    newhome.Show(); 

    this.Hide(); 
} 
else 
{ 
    MessageBox.Show("Incorrect credentian..!"); 
} 
+1

Это сработает, если случайно найденная запись будет первой с правильным именем пользователя (и паролем). Лучше будет '' SELECT * FROM [Login] WHERE Username = @Username "'. И затем 'cmd.Parameters.AddWithValue (« @ Username », txtuser.text)' – Corak

+0

@Corak Изменено. Благодарю. –

3

вы должны использовать перерыв, когда имя пользователя находится в вашем случае условие как

bool found = false; 
while (reader.Read()) 
{ 
    if (txtuser.Text == (reader["Username"].ToString()) && txtpass.Text == (reader["Password"].ToString())) 
    { 
    //MessageBox.Show("loged in!"); 
    Home newhome = new Home(); 
    newhome.Show();    
    this.Hide(); 
    found = true; 
    break; 
    } 
} 

if (!found) 
    MessageBox.Show("Incorrect credentian..!"); 

вы получаете в блок еще, потому что если Логин не правильно, появится окно сообщений, которое находится в n-1 случаях в вашем коде.

+0

спасибо hoffmanuel, это действительно помогло, и я сделал это сейчас, его работа прекрасна спасибо .. !! –

+0

добро пожаловать. но я предлагаю не использовать простые текстовые пароли, как сказал Корак. – hoffmanuel

0

Нет необходимости в цикле через записи для вашего использования случае этот запрос, compate имя пользователя и пароль в запросе:

"SELECT * FROM [Login] where Username='" + txtuser.Text "' and password = '" + txtpass.Text + "'" 
+1

Ради всего хорошего и святого используйте [SqlParameter] (http://msdn.microsoft.com/library/system.data.sqlclient.sqlparameter.aspx). – Corak

+0

Теоретически это может быть то, что пользователь может иметь несколько паролей. – comecme

+0

@ comecme - действительно, но это не было бы актуальным, потому что для входа в систему вы хотите узнать, существует ли хотя бы один действительный логин для предоставленного имени пользователя и пароля. Если существует более одного, но не * этого конкретного *, то логин не выполняется. – Corak

0

Простой и безопасный метод

SqlCommand cmd = new SqlCommand("Select uname, pswd from [Login] where uname [email protected] and pswd [email protected]", conn); 
     cmd.Parameters.Add(new SqlParameter("@uname", "username here")); 
     cmd.Parameters.Add(new SqlParameter("@ps", "pasword here"));    
     SqlDataReader reader = cmd.ExecuteReader(); 
     if (reader.Read()) 
     { 
      //MessageBox.Show("logged in!"); 
      Home newhome = new Home(); 
      newhome.Show(); 

      this.Hide(); 

     } 
     else 
     { 
      MessageBox.Show("Incorrect credentials!"); 
     } 
Смежные вопросы