我有这个密码:

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/

10-09 19:49