按钮单击“不更新SQL Server表”

本文关键字:SQL Server 不更新 更新 单击 按钮 | 更新日期: 2023-09-27 18:19:52

我有一个asp.net应用程序,用户可以在其中更改密码,我会单击"提交"按钮,显示成功模式,但我的SQL Server表不会更新。

查看-提交按钮

<asp:Button runat="server" ID="btnChangePassword" Text="Change Password" CssClass="btn btn-success" OnClick="btnChangePassword_Click" data-toggle="modal" data-target="#placesModal" data-backdrop="static" data-keyboard="false"/> 

视图-模式关闭按钮

<div class="modal-footer SuggestPlaceFooter">
    <asp:Button runat="server" id="btnClose" CssClass="btn btn-success" Text="Close" OnClick="btnClose_Click" data-dismiss="modal" ToolTip="Click to close this screen." />
</div>

代码隐藏-提交按钮onclick

protected void btnChangePassword_Click(object sender, EventArgs e)
{
    #region Update 'Password' column in the 'Users' table
    string connection = ConfigurationManager.ConnectionStrings["PaydayLunchConnectionString1"].ConnectionString;
    SqlConnection conn = new SqlConnection(connection);
    conn.Open();
    SqlCommand com = new SqlCommand(
                        "UPDATE Users " +
                        "SET Password values('" + txtConfirmPassword + "') " +
                        "WHERE Username = " + Session["Username"] + " ", conn);
    com.ExecuteNonQuery();
    conn.Close();
}

代码隐藏-关闭按钮onclick

protected void btnClose_Click(object sender, EventArgs e)
{
    txtPassword.Text = string.Empty;
    txtConfirmPassword.Text = string.Empty;
}

SQL表详细信息

表名称=用户

要更新的列=密码

更新显然应该ONLY为登录的使用进行更新,我认为我可以使用Session["Username"],因为我在其他地方使用它,因为这个名称与SQL server中的Username列匹配。

按钮单击“不更新SQL Server表”

您的更新查询错误,因此该列没有更新。此外,您的查询已对Sql Injection开放。我已经相应地更改了您的代码,还使用了using块来确保连接对象关闭并正确处理。

为了确保连接始终是关闭的,请打开using块内部的连接,如下面的代码片段所示。这样做可以确保在代码退出块时自动关闭连接参考

string password = txtConfirmPassword;
var userName = Session["Username"];
string myQuery = "UPDATE Users SET Password = @password Where Username = @username";
using (SqlConnection connection = new SqlConnection("ConnectionString"))
{
  using (SqlCommand cmd = new SqlCommand(myQuery, connection))
  {
     cmd.Parameters.Add("@password", SqlDbType.NVarChar).Value = password;
     cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = userName;
     connection.Open();
     cmd.ExecuteNonQuery();
   }
} //connection closed and disposed here

您的SQL命令应该是这样的:

SqlCommand com = new SqlCommand(
                        "UPDATE Users " +
                        "SET Password = '" + txtConfirmPassword.Text + "' " +
                        "WHERE Username = " + Session["Username"] + " ", conn);

看看这里:http://www.techonthenet.com/sql_server/update.php

EDIT:或者更好的方法是,您的查询应该使用参数来避免SQL注入攻击,如下所示:

SqlCommand com = new SqlCommand(
                        "UPDATE Users " +
                        "SET Password = @password" + 
                        "WHERE Username = @username ;" , conn);
com.Parameters.Add(new SqlParameter("@password", System.Data.SqlDbType.VarChar).Value = txtConfirmPassword.Text);
com.Parameters.Add(new SqlParameter("@username", System.Data.SqlDbType.VarChar).Value = Session["Username"].ToString());

在这里可以找到一个准备好的UPDATE命令的基本示例:http://rosettacode.org/wiki/Parametrized_SQL_statement#C.23

我受到了所有模态的影响,因为除非我将其全部删除,否则它不会碰到任何断点,我还将Update语句更新为:

SqlCommand com = new SqlCommand(
                 "UPDATE Users " +
                 "SET Password ='" + txtConfirmPassword.Text + "' " +
                 "WHERE Username ='" + Session["Username"] + "' ", conn);