Member 13512434 Ответов: 1

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


Я пытаюсь вставить данные обратно в базу данных mysql, но я не уверен, откуда я получаю эту ошибку.

Я продолжаю получать ошибку ...
Необработанное исключение типа "System.Data.SqlClient.SqlException" произошло в System.Data.dll

Дополнительная информация: неправильный синтаксис рядом с 'nvarchar'.

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

private void SubmitBtn_Click(object sender, EventArgs e)
 {
     SqlCommand cmd = new SqlCommand ("INSERT into [Materials Inventory] (Item, Barcode, Material, Location, Amount, [Date Added]) "+
          " Values (@Item,@Barcode,@Material,@Location,@Amount,@[Date Added])", sqlcon);   // add the parameter names

     sqlcon.Open();  //open the connection
     cmd.Parameters.AddWithValue("@Item", SqlDbType.VarChar).Value = comboBox1.Text;
     //comboBox1.Text);
     cmd.Parameters.AddWithValue("@Barcode", textBox3.Text);  // parameter name with respect to the value
     cmd.Parameters.AddWithValue("@Material", textBox4.Text);
     cmd.Parameters.AddWithValue("@Location", textBox5.Text);
     cmd.Parameters.AddWithValue("@Amount", textBox6.Text);
     cmd.Parameters.AddWithValue("@Date Added", textBox7.Text);

     cmd.ExecuteNonQuery();
     sqlcon.Close();  // close the connection

            }


Что я уже пробовал:

код переписывают, вынимая @

Richard Deeming

"... в в MySQL база данных..."
"... Система.Данных.Sqlclient как ..."

Почему вы используете классы MS SQL Server для общения MySQL[^]?

Или ты хотел сказать "моя база данных SQL"?

1 Ответов

Рейтинг:
1

OriginalGriff

Имена важны!
Сравнивать:

Values (@Item,@Barcode,@Material,@Location,@Amount,@[Date Added])
С заданными вами параметрами:
cmd.Parameters.AddWithValue("@Date", textBox7.Text);
Видите разницу?
Попробуй:
Values (@Item,@Barcode,@Material,@Location,@Amount,@Date)
и это должно сработать.

Но... у вас будут проблемы.
Два, которые произойдут, оба вызваны одним и тем же: вы не подтверждаете.
1) если пользователь вводит число в текстовое поле 6, оно будет работать. Но если они допустят ошибку, ваше приложение выйдет из строя с ошибкой преобразования SQL.
2) то же самое с textBox7 и датой, но еще хуже - у вас нет гарантии, что пользователь ввел дату в том же формате, что и экземпляр SQL server, поэтому даже если пользователь введет действительную дату, ваше приложение все равно может аварийно завершиться, потому что SQL не распознает ее или, что еще хуже, неправильно преобразует ее в дату и сохраняет как неправильное значение.

Всегда используйте int.Метод tryparse, двухместная.TryParse и DateTime.TryParse преобразует входные данные пользователя в фактические значения, а затем передает преобразованные значения в SQL в качестве параметров.

Кстати: сделайте себе одолжение и перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo" - и ваш код станет легче читать, более самодокументируемым, более легким в обслуживании - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...