1

我想更新我的 m/s 访问数据库中的一个表,我的用户输入了一个新密码以替换旧密码,但我在更新语句中有语法错误。请帮忙!

public partial class resetPassword : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            string userName = (string) Session["username"];

        string str = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\inetpub\wwwroot\JetStar\database\JetstarDb.accdb";
        var con = new OleDbConnection(str);
        con.Open();

        string pwd = Request.Form["conPassword"];
        OleDbCommand cmd = new OleDbCommand("UPDATE [users] SET password = '" + pwd + "' WHERE username = '" + userName + "'", con);

        try
        {
            cmd.ExecuteNonQuery();
            MessageBox.Show("Your password has been changed successfully."); 
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        finally
        {
            con.Close();
        }
    }
}
4

2 回答 2

4

这可能是因为password是 Microsoft Access 上的保留关键字。您应该将它与方括号一起使用[password]

但更重要的是

您应该始终使用参数化查询。这种字符串连接对SQL 注入攻击是开放的。

不要将密码存储为纯文本。阅读:在数据库中存储密码的最佳方式

使用using语句来处理你的OleDbConnectionand OleDbCommand

using(OleDbConnection con = new OleDbConnection(str))
using(OleDbCommand cmd = con.CreateCommand())
{
    cmd.CommandText = "UPDATE [users] SET [password] = ? WHERE username = ?";
    cmd.Parameters.Add("pass", OleDbType.VarChar).Value = pwd;
    cmd.Parameters.Add("user", OleDbType.VarChar).Value = userName;
    con.Open();
    try
    {
        cmd.ExecuteNonQuery();
        MessageBox.Show("Your password has been changed successfully."); 
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }
}
于 2014-12-11T08:34:02.790 回答
2

如果您在使用命令之前打印命令并阅读错误消息,那么所有 DB 问题的92.3% (a)会变得很明显。

所以替换:

OleDbCommand cmd = new OleDbCommand("UPDATE [users] SET password = '" + pwd + "' WHERE username = '" + userName + "'", con);

有类似的东西:

String s = "UPDATE [users] SET password = '" + pwd + "' WHERE username = '" + userName + "'";
Console.WriteLine(s);
OleDbCommand cmd = new OleDbCommand(s, con);

然后发布结果:

Response.Write(ex.Message);

让所有人都看到,并仔细检查它告诉你的内容。


(a)我刚刚从无处提取的统计数据 - 实际值可能大不相同。

于 2014-12-11T08:35:18.457 回答