2013-04-29 3 views
1

로그인 양식을 만들려고하는데 문제가있는 반면 else 문은 무시 된 것 같습니다.If-Else 문이 while 루프 내에서 작동하지 않습니다.

어떻게이 코드를 추출하여 잘못된 데이터를 텍스트 상자에 넣었을 때 메시지 상자가 나타나게 할 수 있습니까? 모든 데이터베이스가 올바르게 설정됩니다.

try 
{ 
    sc.Open(); 
    SqlDataReader myReader = null; 
    SqlCommand myCommand = new SqlCommand("select * from StudentRecords where ID = '" + txtBoxUsername.Text + "' ", sc); //where ID = '" + txtBoxUsername.Text + "' and DOB = '" + textBoxPassword.Text + "' 
    myReader = myCommand.ExecuteReader(); 

    while (myReader.Read()) 
    { 
     if (txtBoxUsername.Text == (myReader["ID"].ToString()) && textBoxPassword.Text == (myReader["DOB"].ToString())) 
     { 
      LoginSuccessForm loginfrm = new LoginSuccessForm(); 
      loginfrm.Show(); 
      this.Hide(); 
     } 
     else if (txtBoxUsername.Text != (myReader["ID"].ToString()) || textBoxPassword.Text != (myReader["DOB"].ToString())) 
     { 
      MessageBox.Show("Incorrect Password and/or Username", "Error"); 
      break; 
     } 

    } 
    sc.Close(); 
} 

while 루프 외부에 messagebox를 넣으려고했는데 원하는 방식으로 작동하지 않습니다. try 메소드 다음에 catch가 있고, 나는 공간을 절약하기 위해 그것을 포함하지 않았다.

데이터베이스에서 첫 번째 사용자 만 데려 오는 것 같습니다. 단서 또는 지침을 주시면 감사하겠습니다.

+0

* 실제로 매개 변수화 된 쿼리를 사용해야합니다. SQL injection에 취약합니다. – Blorgbeard

+1

답장을 보내 주셔서 감사합니다. 그러나 SQL 인젝션은 단순히 대학 프로젝트이므로 걱정할 필요가 없습니다. – Glitchezz

+3

이것이 문제는 아니지만 'else if (txt ...')를 간단한 'else'로 대체 할 수 있습니다. if 체크는 중복됩니다 – MAV

답변

4

최대 한 행만 기대하기 때문에 결과를 반복 할 필요가 없습니다. 나는 이런 식으로 할 것 : 어떤 결과가 없었다 경우

using (var cmd = sc.CreateCommand()) { 
    cmd.CommandText = "select 1 from Students where Username=.. and Password= .."; 
    if (cmd.ExecuteScalar() != null) { 
     // username and password matched a user 
    } 
    else { 
     // no match 
    } 
} 

ExecuteScalar은 먼저 첫 번째 행의 열을 돌려줍니다.

실제 프로젝트 인 경우 SqlParameters을 사용하여 SQL 주입 취약점을 피하고 일반 텍스트 암호를 저장하는 대신 해시/솔트를 살펴야합니다.

+0

고맙습니다. 공장! – Glitchezz

관련 문제