【发布时间】:2017-05-21 16:34:32
【问题描述】:
我有这个代码:
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;
}
这意味着我只向它发送我想要执行的查询和连接,它应该执行它并在成功时返回但是查询不包含我添加到上一个命令的参数,因此,这个命令尝试执行没有上一个命令的参数的上一个命令,这就是失败并说:必须声明变量@HashedPassword。 使用debug后找到了,也花了一些时间才搞定,谢谢大家的支持!
【问题讨论】:
-
你的数据库中 HashedPassword 列的 DataType 是什么?
-
你正试图传递一个字节数组。
-
AddWithValue()有已知问题。使用显式数据类型添加。 -
HashedPassword 列的数据类型为 Binary(64)
标签: c# database command sql-server-2014 variable-declaration