【问题标题】:Table is not getting updated , when used executeNonquery使用 executeNonquery 时,表未更新
【发布时间】:2011-03-31 00:38:06
【问题描述】:

我正在尝试更改用户密码。我无法更新密码:(。我收到的消息是密码已更改,因为密码未更改。。 我的代码如下..请如果有人能建议我哪里出错了。我只是一个初学者...

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 ";
    }
}

以上点击事件一定要修改我的密码,函数passwordChange如下..

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";
    }
}

我在附近放了一个断点

if(flag>0)

它仍然显示 executeNonquery 没有返回更新的行值,并且还在 SQL 服务器的后端,它没有改变, 请如果有人可以纠正我...我应该使用其他执行命令还是什么? 我正在使用 VS 2008 和 SQL Server 2005 进行此操作..

【问题讨论】:

  • 您绝对应该将此查询参数化以避免 SQL 注入。
  • @Martin 那能解决我的问题吗?我的意思是至少这应该可以正常工作?
  • 不,这不是您问题的答案,这就是我将其作为评论留下的原因。例如,如果有人输入'DROP TABLE LoginAccount;-- 之类的密码,您最终将执行 DROP table 语句。
  • @Martin OMG.. 我不知道.. 我是新手,正在构建一个 Web 应用程序。谢谢你的信息.. :)

标签: c# sql visual-studio-2008 ado.net


【解决方案1】:

1:这是单引号和双引号之间的间距:(例如:' " + username + " '
2) 你在乞求 SQL 注入。

在你的 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]
   }
}

我也没有看到您设置 SqlConnection 的位置,因此我为此添加了一行。您需要根据需要对其进行修改。

【讨论】:

  • 很好地抓住了语句中的空格。
  • 谢谢。问题是我第一次使用它.. 我的意思是我正在做一个爱好项目.. 非常感谢
【解决方案2】:

也许试试这个代码。

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";
    }
}

【讨论】:

    【解决方案3】:

    如果您的行数为零,请仔细检查您的 WHERE 子句是否确实有效。我敢打赌,如果您选择 WHERE username = '" + username + "'",您将找不到您要查找的行。至少,这是我要确认的第一件事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2014-03-04
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多