2010-08-17 2 views
1

J'essaie de changer le mot de passe de l'utilisateur. Je ne suis pas en mesure de mettre à jour le mot de passe :(Le message que je reçois est mot de passe changé où il n'est pas changé .. Mon code est le suivant .. S'il vous plaît si quelqu'un peut suggérer où je vais mal Je suis juste un débutant ...La table n'est pas mise à jour lorsqu'elle est utilisée. ExecuteNonquery

protected void Button1_Click(object sender, EventArgs e) 
{ 
    DatabaseLayer data = new DatabaseLayer(); 

    string username = Session["Authenticate"].ToString(); 
    string password = TextBox1.Text; 
    string newpass = TextBox2.Text; 
    string confirm = TextBox3.Text; 
    string flag = ""; 

    if (newpass.ToString() == confirm.ToString()) 
    { 
     flag = data.passwordChange(username, password, newpass); 
     Literal1.Text = flag.ToString(); 
    } 
    else 
    { 
     Literal1.Text = "New Password does not match the Confirm Password "; 
    } 
} 

l'événement click ci-dessus doit changer mon mot de passe et la fonction est passwordChange comme suit ..

public string passwordChange(string username, string password, string newPasswd) 
{ 
    string SQLQuery = "SELECT password FROM LoginAccount WHERE username = '" + username + "'"; 
    string SQLQuery1 = "UPDATE LoginAccount SET password = ' " + newPasswd + " ' WHERE username = ' " + username + "'"; 
    SqlCommand command = new SqlCommand(SQLQuery, sqlConnection); 
    SqlCommand command1 = new SqlCommand(SQLQuery1, sqlConnection); 

    sqlConnection.Open(); 
    string sqlPassword = ""; 
    SqlDataReader reader; 

    try 
    { 
     reader = command.ExecuteReader(); 


     if (reader.Read()) 
     { 
      if (!reader.IsDBNull(0)) 
      { 
       sqlPassword = reader["password"].ToString(); 
      } 
     } 
     reader.Close(); 

     if (sqlPassword.ToString() == password.ToString()) 
     { 
      try 
      { 
       int flag = 0; 
       flag = command1.ExecuteNonQuery(); 

       if (flag > 0) 
       { 
        sqlConnection.Close(); 
        return "Password Changed Successfully"; 
       } 
       else 
       { 
        sqlConnection.Close(); 
        return "User Password could not be changed"; 
       } 
      } 
      catch (Exception exr) 
      { 
       sqlConnection.Close(); 
       return "Password Could Not Be Changed Please Try Again"; 
      } 
     } 
     else 
     { 
      sqlConnection.Close(); 
      return "User Password does not Match"; 
     } 
    } 
    catch (Exception exr) 
    { 
     sqlConnection.Close(); 
     return "User's Password already exists"; 
    } 
} 

J'avais mis un point d'arrêt près

if(flag>0) 

il montre encore que executeNonquery aint retourner la valeur des lignes mises à jour et aussi dans le Backend du serveur SQL, son ne change pas, S'il vous plaît si quelqu'un pouvait me corriger ... Dois-je utiliser d'autres commandes d'exécution ou quelque chose? Je le fais avec VS 2008 et SQL Server 2005 ..

+2

Vous devez absolument paramétrer cette requête pour éviter l'injection SQL. –

+0

@Martin va donc résoudre mon problème? Je veux dire au moins cela devrait fonctionner correctement? –

+1

Non, ce n'était pas une réponse à votre question, c'est pourquoi je l'ai laissé comme un commentaire. Si quelqu'un entre un mot de passe comme "DROP TABLE LoginAccount; -" vous finirez par exécuter l'instruction de la table DROP par exemple. –

Répondre

6

1: Il est votre espacement entre vos guillemets simples et doubles: (comme: ' " + username + " ')
2) Vous supplient pour injection SQL.

Essayez ceci dans votre méthode PasswordChange:

public string PasswordChange(string userName, string oldPass, string newPass) 
{ 
    using(SqlConnection sqlConnection = new SqlConnection(
     ConfigurationManager.ConnectionStrings["LoginDb"].ConnectionString)) 
    { 
    string sqlToConfirmOldPass = 
     "SELECT password FROM LoginAccount WHERE username = @userName"; 
    string sqlToUpdatePassword = 
     "UPDATE LoginAccount SET password = @newPass WHERE username = @userName"; 

    SqlCommand confirmOldPass = new SqlCommand(sqlToConfirmOldPass, sqlConnection); 
    confirmOldPass.Parameters.AddWithValue("@userName", userName); 

    SqlCommand updatePassword = new SqlCommand(sqlToUpdatePassword, sqlConnection); 
    updatePassword.Parameters.AddWithValue("@newPass", newPass); 
    updatePassword.Parameters.AddWithValue("@userName", userName); 

    [Rest of your code goes here] 
    } 
} 

je aussi ne vois pas où vous définissez votre SqlConnection, j'ai donc ajouté une ligne qui. Vous devrez le modifier en fonction de vos besoins.

+0

Bonne prise sur les espaces dans la déclaration. – hometoast

+0

j'avais pris la chaîne de connexion global..will essayer pour la méthode paramétrée .. –

+0

merci. La chose est que je l'utilise pour la première fois .. je veux dire que je fais un projet hobby .. merci une tonne –

0

Si vous obtenez zéro lignes affectées double vérifier que votre clause WHERE fonctionne réellement. Je parie que si vous avez sélectionné WHERE username = '" + username + "'", vous ne trouverez pas la ligne que vous recherchez. Ce serait, au moins, la première chose que je confirmerais.

1

Essayez peut-être ce code à la place.

public string passwordChange(string username, string password, string newPasswd) 
{ 
    string SQLQuery = "SELECT password FROM LoginAccount WHERE username = @username"; 
    string SQLQuery1 = "UPDATE LoginAccount SET password = @newPassword WHERE username = @username"; 
    SqlCommand command = new SqlCommand(SQLQuery, sqlConnection); 
    command.Parameters.AddWithValue("@username", username); 

    SqlCommand command1 = new SqlCommand(SQLQuery1, sqlConnection); 
    command1.Parameters.AddWithValue("@username", username); 
    command1.Parameters.AddWithValue("@newPassword", newPasswd); 

    sqlConnection.Open(); 
    string sqlPassword = ""; 
    SqlDataReader reader; 

    try 
    { 
     reader = command.ExecuteReader(); 


     if (reader.Read()) 
     { 
      if (!reader.IsDBNull(0)) 
      { 
       sqlPassword = reader["password"].ToString(); 
      } 
     } 
     reader.Close(); 

     if (sqlPassword.ToString() == password.ToString()) 
     { 
      try 
      { 
       int flag = 0; 
       flag = command1.ExecuteNonQuery(); 

       if (flag > 0) 
       { 
        sqlConnection.Close(); 
        return "Password Changed Successfully"; 
       } 
       else 
       { 
        sqlConnection.Close(); 
        return "User Password could not be changed"; 
       } 
      } 
      catch (Exception exr) 
      { 
       sqlConnection.Close(); 
       return "Password Could Not Be Changed Please Try Again"; 
      } 
     } 
     else 
     { 
      sqlConnection.Close(); 
      return "User Password does not Match"; 
     } 
    } 
    catch (Exception exr) 
    { 
     sqlConnection.Close(); 
     return "User's Password already exists"; 
    } 
} 
Questions connexes