【问题标题】:Must declare the scalar variable @ when updating table更新表时必须声明标量变量@
【发布时间】: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


【解决方案1】:

你可以试试这个代码。假设您的数据库中的列是 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();

【讨论】:

    【解决方案2】:

    就像@Gordon-linoff 和 cmets 中提到的其他人一样。你应该把你的代码改成这样:

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

    签出this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多