C# 为什么在这个update语句中出现语法错误?

C# 为什么在这个update语句中出现语法错误?,c#,ms-access,syntax-error,oledb,update-statement,C#,Ms Access,Syntax Error,Oledb,Update Statement,我想更新m/s access数据库中的一个表,在该表中,用户输入了新密码以替换旧密码,但update语句中出现语法错误。请帮忙 public partial class resetPassword : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void SubmitButton_Click(o

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

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();
        }
    }
}

这可能是因为
密码
是Microsoft Access上的密码。您应该将其与方括号一起使用,如
[password]

但更重要的是 你应该经常使用。这种类型的字符串连接对攻击是开放的

不要将密码存储为纯文本。阅读:

用于处理
OLEDB连接
OLEDB命令

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

这可能是因为
密码
是Microsoft Access上的密码。您应该将其与方括号一起使用,如
[password]

但更重要的是 你应该经常使用。这种类型的字符串连接对攻击是开放的

不要将密码存储为纯文本。阅读:

用于处理
OLEDB连接
OLEDB命令

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);
    }
}
92.3%(a)如果在使用命令之前打印命令并阅读错误消息,则所有DB问题中有92.3%会变得明显

因此,请替换:

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) 我刚刚不知从何处得到的一个统计数据——实际值可能大不相同。

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

因此,请替换:

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) 我刚刚不知从何处收集到的一个统计数据-实际值可能大不相同。

首先要解决的问题是:使用参数化SQL,而不是将值直接放入SQL中。第二件要修复的事情:不要将明文密码放入数据库。这两种方法都不可能解决您当前的问题,但鉴于此处缺乏安全性,代码不起作用比它造成安全漏洞要好。此外,发布语法错误消息可能有助于更快地发现错误。正如乔恩Switt已经声明的那样,参数化SQL不太容易出现故障,因此您可能需要考虑使用它。在这个语句中可能存在“字符串STR= @”提供程序=微软.ACE。OELDB 12的问题;数据源=C:\inetpub\wwwroot\JetStar\database\JetstarDb.accdb”;“改用双斜杠将解决此问题。@AmolBavannavar-字符串标记为字符串文字(前面的
@
)。在这种情况下,反斜杠不需要转义。@Tim好的,Tim。感谢您的支持。首先要解决的问题是:使用参数化SQL,而不是将值直接放入SQL。第二件要修复的事情:不要将明文密码放入数据库。这两种方法都不可能解决您当前的问题,但鉴于此处缺乏安全性,代码不起作用比它造成安全漏洞要好。此外,发布语法错误消息可能有助于更快地发现错误。正如乔恩Switt已经声明的那样,参数化SQL不太容易出现故障,因此您可能需要考虑使用它。在这个语句中可能存在“字符串STR= @”提供程序=微软.ACE。OELDB 12的问题;数据源=C:\inetpub\wwwroot\JetStar\database\JetstarDb.accdb”;“改用双斜杠将解决此问题。@AmolBavannavar-字符串标记为字符串文字(前面的
@
)。在这种情况下,反斜杠不需要转义。@Tim好的,Tim。感谢您的支持。@ArielSeah错误信息到底是什么?我假设您的列是
VarChar
,我在
.Add()
方法中添加了
OleDbType.VarChar
作为第二个参数。错误消息是:“int不包含'Value'的定义,并且找不到接受第一个'int'类型参数的扩展方法'Value'。在添加上面修改的代码之后,错误变成“操作必须使用可更新的查询”。我的密码字段来自表单字段作为密码,而用户名来自用户登录和存储时的会话。@ArielSeah错误消息到底是什么?我假设您的列是
VarChar
,我在
.Add()
方法中添加了
OleDbType.VarChar
作为第二个参数。错误消息是:“int不包含'Value'的定义,并且找不到接受第一个'int'类型参数的扩展方法'Value'。在添加上面修改的代码之后,错误变成“操作必须使用可更新的查询”。我的密码字段作为密码来自表单字段,而用户名来自用户登录和存储时的会话。