Как вставить десятичное значение из текстового поля в базу данных с помощью C # - PullRequest
2 голосов
/ 20 марта 2019

Я использую базу данных SQL Server и приложение Windows Forms.У меня есть 2 текстовых поля и 1 комбинированный список.Пользователи вводят свое имя и скорость работы в текстовые поля и выбирают год из выпадающего списка.Я пытаюсь вставить эти значения в мою базу данных.

EX:

2018    Mike    39,72     WORKERS

В базе данных:

year --> nvarchar(4)
name --> nvarchar(50)
rate --> decimal(18,2)
type --> nvarchar(50)

Мой код выглядит так:

SqlCommand cmd = new SqlCommand("INSERT INTO USERS(YEAR,NAME,RATE,TYPE) VALUES ('" + yearcombo.Text + "','" + name.Text + "','" + Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture) + ",'" + "WORKERS" + "')", connection);

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

В операторе INSERT меньше столбцов, чем значений, указанных в предложении VALUES.Количество значений в предложении VALUES должно соответствовать количеству столбцов, указанному в операторе INSERT.

Ответы [ 2 ]

11 голосов
/ 20 марта 2019

Этот тип вставки уязвим для инъекций, и, как вы уже обнаружили, трудно добавить значения, такие как десятичное число, DateTime, ... чтобы добавить столбцы, используйте Parameters.Add

SqlCommand cmd = new SqlCommand("INSERT INTO USERS(YEAR,NAME,RATE,TYPE) VALUES (@year, @name,@rate,@type)", connection);

cmd.Parameters.Add("@year", SqlDbType.Int).Value = int.Parse(yearcombo.Text);
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = name.Text;
cmd.Parameters.Add("@rate", SqlDbType.Decimal).Value = Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture);
cmd.Parameters.Add("@type", SqlDbType.VarChar).Value = "WORKERS";

Представьте, что кто-то меняет значение yearcombo (например, просто используя элемент inspect в chrome) и устанавливает его на:

"2019, 'a', 1, 'Something'); вставлять в ARESTRICTEDTABLE (somefield) значения ('somecolumn'); обновлять AnotherTable set SomeField = 'somevalue');; вставлять в пользователей (год, имя, рейтинг) , тип), (2019, "

тогда ваш командный текст будет:

"insert into users (year,name,rate,type) (2019,'a',1,'Something');insert into ARESTRICTEDTABLE(somefield) values('somecolumn'); update AnotherTable set SomeField = 'somevalue');, insert into users(year,name,rate,type),(2019," ,'" + name.Text + "','" + Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture) + ",'" + "WORKERS" + "')"
7 голосов
/ 20 марта 2019

Вы должны использовать SqlParameter с запросом, содержащим параметры: Должно быть так:

SqlCommand cmd = new SqlCommand("INSERT INTO USERS(YEAR,NAME,RATE,TYPE) VALUES (@YEAR, @NAME, @RATE, @TYPE)", connection);
cmd.Parameters.Add(new SqlParameter("@YEAR", yearcombo.Text));
cmd.Parameters.Add(new SqlParameter("@NAME", name.Text));
cmd.Parameters.Add(new SqlParameter("@RATE", Convert.ToDecimal(rate.Text, CultureInfo.CurrentCulture)));
cmd.Parameters.Add(new SqlParameter("@TYPE", "WORKERS"));

Я не проверял его, но он преобразовал ваш параметр в правильное десятичное число для вашего запроса. Также лучше использовать SqlParameter для проблем безопасности (предотвращая SQL-инъекцию )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...