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 шт):
В документации в примере в вызове 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);
Цитата из документации Database Identifiers:
Rules for Regular Identifiers
- 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
Достаточно прочитать любую из этих статей.