System.Data.SqlClient.SqlException: "Неправильный синтаксис около конструкции "nvarchar". Необходимо объявить скалярную переменную "@Статус"."

SqlCommand command = new SqlCommand(@"UPDATE Табель SET  Статус = @Статус, [Код смены] = @[Код смены], [Время входа] = @[Время входа], [Время выхода] = @[Время выхода]  WHERE [Код сотрудника] = @[Код сотрудника] AND Дата = @Дата AND [Код табеля] = @[Код табеля]", connectionString);
command.Parameters.AddWithValue("[Код табеля]", textBox5.Text);
command.Parameters.AddWithValue("[Код сотрудника]", код_сотрудникаTextBox.Text);
command.Parameters.AddWithValue("Дата", датаDateTimePicker.Text);
command.Parameters.AddWithValue("Статус", comboBox1.Text);
command.Parameters.AddWithValue("[Код смены]", comboBox2.Text);
command.Parameters.AddWithValue("[Время входа]", время_входаTextBox.Text);
command.Parameters.AddWithValue("[Время выхода]", время_входаTextBox.Text);
command.Connection.Open();
command.ExecuteNonQuery();
command.Connection.Close();

При выполнении запроса возникает ошибка:

Неправильный синтаксис около конструкции "nvarchar". Необходимо объявить скалярную переменную "@Статус".


Ответы (2 шт):

Автор решения: CrazyElf

В документации в примере в вызове AddWithValue название переменной используется с собачкой, так же как оно выглядит в строке с SQL кодом, так что попробуйте сделать так же:

        command.Parameters.AddWithValue("@[Код табеля]", textBox5.Text);
        command.Parameters.AddWithValue("@[Код сотрудника]", код_сотрудникаTextBox.Text);
        command.Parameters.AddWithValue("@Дата", датаDateTimePicker.Text);
        command.Parameters.AddWithValue("@Статус", comboBox1.Text);
        command.Parameters.AddWithValue("@[Код смены]", comboBox2.Text);
        command.Parameters.AddWithValue("@[Время входа]", время_входаTextBox.Text);
        command.Parameters.AddWithValue("@[Время выхода]", время_входаTextBox.Text);
→ Ссылка
Автор решения: Alexander Petrov

Цитата из документации Database Identifiers:

Rules for Regular Identifiers

  1. Embedded spaces or special characters are not allowed.

В именах параметров не разрешены пробелы.
Уберём из них пробелы и квадратные скобки.

Попутно исправим другие ошибки и недочёты: имя соединения (у вас оно почему-то названо connectionString), опасность потери ресурсов (используем using для устранения этого), использование устаревшего и опасного метода AddWithValue (заменим его на Add с указанием точного типа).

Кроме того, время_входаTextBox используется дважды. Будьте внимательны!

string sql = @"UPDATE Табель SET Статус = @Статус, [Код смены] = @КодСмены, [Время входа] = @ВремяВхода, [Время выхода] = @ВремяВыхода WHERE [Код сотрудника] = @КодСотрудника AND Дата = @Дата AND [Код табеля] = @КодТабеля";

using var connection = new SqlConnection(_connectionString);
connection.Open();

using var command = new SqlCommand(sql, connection);

command.Parameters.Add("КодТабеля", SqlDbType.Int).Value = textBox5.Text; // int.Parse(textBox5.Text)
command.Parameters.Add("КодСотрудника", SqlDbType.Int).Value = код_сотрудникаTextBox.Text;
command.Parameters.Add("Дата", SqlDbType.DateTime2).Value = датаDateTimePicker.Value;
command.Parameters.Add("Статус", SqlDbType.NVarChar).Value = comboBox1.Text;
command.Parameters.Add("КодСмены", SqlDbType.Int).Value = comboBox2.Text;
command.Parameters.Add("ВремяВхода", SqlDbType.DateTime2).Value = время_входаTextBox.Text;
command.Parameters.Add("ВремяВыхода", SqlDbType.DateTime2).Value = время_выходаTextBox.Text;

command.ExecuteNonQuery();

Благодаря использованию using соединение будет гарантировано закрыто, даже в случае возникновения исключения. Вызывать метод Close() не нужно.

Я не знаю, какие именно типы используются у вас в таблице, поэтому сами укажите правильные типы SqlDbType. При необходимости примените int.Parse и тому подобные методы. А лучше используйте NumericUpDown для ввода чисел вместо TextBox.

Почему не стоит использовать метод AddWithValue:
Can we stop using AddWithValue() already?
AddWithValue is evil!
AddWithValue is Evil
Достаточно прочитать любую из этих статей.

→ Ссылка