更新表时必须声明标量变量@

时间:2017-01-06 20:22:16

标签: c# database command sql-server-2014 variable-declaration

我有这段代码:

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

这意味着我只发送它想要执行的查询和连接,它应该执行它并返回如果成功但是查询不包含我添加到上一个命令的参数因此,此命令尝试执行上一个命令而没有上一个命令的参数,这就是failes并说:必须声明可变的@HashedPassword。 我在使用调试后找到它并且花了一些时间才得到它,但是谢谢大家的支持!

2 个答案:

答案 0 :(得分:0)

您可以尝试使用此代码。假设您的数据库中的列是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();

答案 1 :(得分:0)

就像@ Gordon-linoff和其他人在评论中提到的那样。你应该把你的代码更改为:

command.Parameters.Add("@hashedPassword", SqlDbType.Binary);
command.Parameters["@hashedPassword"].Value = newHashedPassword;

检查this