我有这个密码:
connection.Open();
string query = "UPDATE [dbo].[EmailPassword] SET HashedPassword = @hashedPassword, Salt = @salt, ForgotHisPassword = @forgotHisPassword where Email = @email";
SqlCommand command = new SqlCommand(query, connection);
string recoveredPassword = RandomPasswordGenerator.Generate();
PasswordHash passwordHash = new PasswordHash();
byte[] newHashedPassword = passwordHash.ComputeHash(recoveredPassword);
command.Parameters.AddWithValue("@hashedPassword", newHashedPassword);
command.Parameters.AddWithValue("@salt", passwordHash.saltAsString);
command.Parameters.AddWithValue("@forgotHisPassword", 1);
command.Parameters.AddWithValue("@email", TxtSendPasswordToEmail.Text);
command.ExecuteNonQuery();
我得到了这个错误:
必须声明标量变量“@hashedpassword”。
我一直在寻找解决办法,但找不到任何答案,所以我会非常感谢你的帮助!
编辑:我终于发现了问题:
这是代码行之后的一行,起初我认为这与我的错误无关:
if (TableFunctions.querySucceeded(command))
以下是函数的构建方式:
public static bool querySucceeded(string query, string strConnection)
{
SqlConnection connection = new SqlConnection(strConnection);
bool succeeded = false;
try
{
connection.Open();
SqlCommand command = new SqlCommand(query, connection);
if (command.ExecuteScalar() != null)
{
succeeded = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return succeeded;
}
这意味着我只发送我想执行的查询和连接,如果成功,它应该执行并返回,但是查询不包含我添加到上一个命令中的参数,这个命令试图在没有前一个命令的参数的情况下执行前一个命令,这就是失败的原因,它说:必须声明varaiable@hashedpassword。
我是在调试之后发现的,我也花了一些时间才得到它,但是谢谢大家的支持!
最佳答案
你可以试试这个代码。假设数据库中的列是varchar。如果不是,您可以很容易地将SqlDbType
更改为您拥有的类型:
connection.Open();
string query = "UPDATE [dbo].[EmailPassword] SET HashedPassword = @hashedPassword, Salt = @salt, ForgotHisPassword = @forgotHisPassword where Email = @email";
SqlCommand command = new SqlCommand(query, connection);
string recoveredPassword = RandomPasswordGenerator.Generate();
PasswordHash passwordHash = new PasswordHash();
byte[] newHashedPassword = passwordHash.ComputeHash(recoveredPassword);
command.Parameters.Add("@hashedPassword", SqlDbType.Varchar); // you have to send the data type explicitely
command.Parameters["@hashedPassword"].Value = Encoding.ASCII.GetBytes(newHashedPassword);
command.Parameters.AddWithValue("@salt", passwordHash.saltAsString);
command.Parameters.AddWithValue("@forgotHisPassword", 1);
command.Parameters.AddWithValue("@email", TxtSendPasswordToEmail.Text);
command.ExecuteNonQuery();
关于c# - 更新表时必须声明标量变量@,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41513738/