2017-01-06 3 views
2

У меня есть этот код:Необходимо объявить скалярную переменную @ при обновлении таблицы

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(); 

И я получаю эту ошибку:

Must declare the scalar variable "@hashedPassword".

Я искал для решения достаточно долго и я не мог найти ответа, поэтому я буду очень благодарен за вашу помощь!

Edit: я, наконец, нашел проблему:

здесь находится линия прямо после этого строки кода, которые сначала я думал, не имеет ничего общего с моей ошибкой:

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

, который означает, что я отправить это только запрос я хочу, чтобы выполнить и соединение, и он должен выполнить его и вернуться, если успешно, но запрос не содер n параметры, которые я добавил к предыдущей команде, таким образом, эта команда пытается выполнить предыдущую команду без параметров предыдущей команды, и это то, что является ошибкой, и говорит: Должен объявлять varayable @HashedPassword. Я нашел его после того, как я использовал отладку, и мне тоже понадобилось некоторое время, чтобы получить его, но спасибо всем за поддержку!

+1

Что такое DataType столбца HashedPassword в вашей базе данных? – Steve

+0

вы пытаетесь передать массив байтов. –

+0

См. Http://stackoverflow.com/questions/15518051/save-byte-array-in-sql-server – Loring

ответ

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(); 
+0

Я попробовал его, и он не сработал. – WeinForce

0

Так же, как @ Гордон-linoff и другие упомянутые в комментариях. Вы должны изменить свой код на этот:

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

Проверить this вне.

+0

Я тоже попробовал, и он не работал. – WeinForce

Смежные вопросы