C# 为什么在这个update语句中出现语法错误?
我想更新m/s access数据库中的一个表,在该表中,用户输入了新密码以替换旧密码,但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
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'。在添加上面修改的代码之后,错误变成“操作必须使用可更新的查询”。我的密码字段作为密码来自表单字段,而用户名来自用户登录和存储时的会话。