我正在创建一个简单的应用程序,用户创建帐户。我希望用户能够在创建帐户后更改密码。
我在c#中使用Oledb来做这个。
string test = "testing";
con.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = con;
string query = "UPDATE tbl_users SET password = '" + test + "' WHERE username = '" + txtLoginUsername.Text + "'";
MessageBox.Show(query);
command.CommandText = query;
command.ExecuteNonQuery();
con.Close();
我一直得到错误:";system . data . oledbexcexception: ' UPDATE语法错误'">
这个错误发生在以下行:
command.ExecuteNonQuery();
为了澄清Hossein的回答,当您通过将字符串添加在一起来构建查询命令时,您对sql注入敞开了大门。请仔细阅读,以保护您未来的发展。
参考使用"参数"。这基本上指的是查询的占位符值,比如"在这里插入"。而不是像在密码和用户名的值前后包装单引号那样在查询中添加部分。
查看原始查询
"UPDATE tbl_users SET password = '" + test + "' WHERE username = '" + txtLoginUsername.Text + "'";
如果有人输入了
的值Password: What's Up
Username: O'Conner
您的最后一个查询命令与您的方法连接时将创建一个值
UPDATE tbl_users SET password = 'What's Up' WHERE username = 'O'Conner'
看看字面值现在是如何打乱了字符串的意图的。
使用"@"值,这是告诉SQL,嘿…将会有另一个值随着提供的名称,请使用该值在这里。在一些数据库中,它们不使用命名参数,而是使用"?"代替单个字符作为占位符,您必须按照它们在您试图准备的语句中出现的确切顺序添加参数。
另一件个人偏好的事情。如果您的列名是UserName
in,我将使用"@parmUserName"所以你知道它是显式的参数,而不是偶然地做UserName = UserName
而没有得到结果。多了几个字符,但很明显它的目的和来源。
怎么应用呢?再来看看侯赛因的回答。注意两个
command.Parameters.AddWithValue("@password", "test");
command.Parameters.AddWithValue("@username", txtLoginUsername.Text);
这是向command
对象添加参数的地方。说明,在您看到@password
的地方,使用我在这里放置的以下值,与@username
相同。
祝你好运。
使用以下语法
在查询中使用括号表示密码因为密码是保留字
链接保留世界列表
using (var connection = new OleDbConnection("Your Connection String"))
{
var query = "UPDATE tbl_users SET [password] = @password WHERE username = @username";
using (var command = new OleDbCommand(query, connection))
{
connection.Open();
command.Parameters.AddWithValue("@password", "test");
command.Parameters.AddWithValue("@username", txtLoginUsername.Text);
command.ExecuteNonQuery();
}
}