2013-02-27 5 views
0

데이터베이스 테이블 "user"를 확인하여 동일한 사용자 이름을 다시 만들 수 없도록 "username"이 있는지 확인하려고합니다. 이 유효성 검사기를 사용자 이름이 존재하면 메시지 상자가 존재합니다 표시됩니다.사용자 이름이 이미 데이터베이스에 존재하는지 확인

이를 통해 저를 인도하십시오, 사용자 이름이 존재하는 경우 나는 추가하고 확인하기 위해 지금까지 버튼 뒤에 코드를 다음 있습니다 :

private void btnSignupNew_Click(object sender, EventArgs e) 
     { 

      if (txtUsername.Text == "") 
      { 
       errorUsername.SetError(txtUsername, "Enter A Username"); 
      } 

      else if (txtPassword.Text == "") 
      { 
       errorPassword.SetError(txtPassword, "Enter A Valid Password"); 
      } 

       //so if there isnt no error in the fields itll go on and add the data in to the database. 
      else{ 

      //instance of sqlConnection 
      SqlConnection con = new SqlConnection("Data Source=etc"); 

      //instance of sqlCommand 
      SqlCommand cmd = new SqlCommand("INSERT INTO [User] values ('" + txtForename.Text + "', '" + txtSurname.Text + "', '" + txtUsername.Text + "', '" + txtPassword.Text + "')", con); 
      con.Open(); 
      cmd.ExecuteNonQuery(); 

      //query executed correcty or not 
      con.Close(); 
+6

당신은 SQL 주입 취약점을 가지고있다. – SLaks

+6

** 암호를 일반 텍스트 **에 저장하지 마십시오. – SLaks

+3

_SQL Injection_ 공격을 방지하려면 [매개 변수가있는 쿼리] (http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html)를 사용하십시오. –

답변

7

좋은의 연습으로, SQL을 피하기 위해 Parameters를 사용하여 지속성을 유지하려고 주입. 이 liek

시도 뭔가 :

private void btnSignupNew_Click(object sender, EventArgs e) 
{ 

    if (txtUsername.Text == "") 
    { 
     errorUsername.SetError(txtUsername, "Enter A Username"); 
    } 
    else if (txtPassword.Text == "") 
    { 
     errorPassword.SetError(txtPassword, "Enter A Valid Password"); 
    } 
    else 
    { 
     using (SqlConnection con = new SqlConnection("Data Source=etc")) 
     { 
      con.Open(); 

      bool exists = false; 

      // create a command to check if the username exists 
      using (SqlCommand cmd = new SqlCommand("select count(*) from [User] where UserName = @UserName", con)) 
      { 
       cmd.Parameters.AddWithValue("UserName", txtUsername.Text); 
       exists = (int)cmd.ExecuteScalar() > 0; 
      } 

      // if exists, show a message error 
      if (exists) 
       errorPassword.SetError(txtUsername, "This username has been using by another user."); 
      else 
      { 
          // does not exists, so, persist the user 
       using (SqlCommand cmd = new SqlCommand("INSERT INTO [User] values (@Forname, @Surname, @Username, @Password)", con)) 
       { 
        cmd.Parameters.AddWithValue("Forname", txtForname.Text); 
        cmd.Parameters.AddWithValue("Surname", txtSurname.Text); 
        cmd.Parameters.AddWithValue("UserName", txtUsername.Text); 
        cmd.Parameters.AddWithValue("Password", txtPassword.Text); 

        cmd.ExecuteNonQuery(); 
       }    
      } 

      con.Close(); 
     } 
    } 
} 
+0

고마워요! 하지만 약간의 문제가 사용자 이름이 있으면 오류 메시지가 나타납니다,하지만 "로그인"버튼을 다시 로그인 페이지로 데려다 줄께. 어떤 아이디어가 이것을 확산 시키는가? 감사. 그런데 내가 맨 아래에있는 코드는 다음과 같습니다. MessageBox.Show ("Sucessfully Signed Up"); Form1 signin = new Form1(); signin.Show(); this.Close(); } } – bandaa

+0

사용자의 유효성을 검사하는 것입니다. 귀하의 문제는 인증 문제와 같으며 다른 스레드에서이 문제를 피할 수 있습니다. 기존 사용자를 변경하는 경우 쿼리를 '... UserName = @ UserName 및 Id <> @Id "'와 같이 변경하여 기존 사용자 확인을 피할 수 있습니다. –

관련 문제