Member 13814075 Ответов: 3

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


Я использовал этот sql-код, но он сказал, что есть меньше столбцов, но это не так!!

SQL = "INSERT INTO Lezioni(NomeC, NomeS, Giorno, OraIni, OraFin, Costo)VALUES('" + NomeCorso + "', '" + NomeSala + "', '" + Giorno + "', '" + OraIniz + "', '" + OraFin + "', " + Costo + ")"


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

Я попытался Просмотреть код, но это правильно, я действительно не знаю, что делать!!

0x01AA

Попробовать это: .....+"','" Costo + "')".
В любом случае это очень плохая идея-объединять строки SQL.
1.) это опасно в отношении SQL-инъекции
2.) потерпит неудачу, если имя будет "д'Анджело" или что-то еще

3 Ответов

Рейтинг:
24

Wendelius

Скорее всего, у вас есть десятичное значение в Costo, и десятичный разделитель для вас-запятая. Например, если стоимость составляет 1,23, то ваше заявление будет выглядеть следующим образом

INSERT INTO Lezioni ( ... ) VALUES (..., 1,23)

Что вызывает дополнительные колонки в список значений

В SQL разделитель запятых должен быть точкой, поэтому вместо 1,23 значение должно быть 1,23.

Как уже указывалось, использование параметров исправило бы эту проблему среди многих других, так что это было бы предпочтительным решением. Видеть Класс Объектов Sqlparameter (Системы.Данных.Поставщики sqlclient)[^]

Однако если вы решите не использовать параметры, то вам необходимо убедиться, что десятичное значение преобразуется в строку с помощью запятой. Рассмотрим следующий пример
decimal costo = 1.23M;
string test =  costo.ToString(System.Globalization.CultureInfo.GetCultureInfo("en-US"));


Рейтинг:
2

Patrice T

SQL = "INSERT INTO Lezioni(NomeC, NomeS, Giorno, OraIni, OraFin, Costo)VALUES('" + NomeCorso + "', '" + NomeSala + "', '" + Giorno + "', '" + OraIniz + "', '" + OraFin + "', " + Costo + ")"

Из этого ничего нельзя сделать, что интересно, так это содержание переменной SQL потому что 1 из переменных может иметь неудачное содержание типа
NomeCorso= "A','B";

Это SQL-инъекция.

Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Рейтинг:
0

Dave Kreskowiak

Погуглите это и начните читать: "атака SQL-инъекций". Это будет объяснять, почему то, что вы делаете, является серьезной угрозой безопасности.

Затем Google для "параметризованных запросов C# SQL", чтобы узнать, что с этим делать, с дополнительным бонусом, что он даже исправляет вашу проблему!


Member 13814075

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

0x01AA

Смотрите мои комментарии к вашему вопросу и замените его "', " + Costo + ")" около "','" + Costo + "')"

Dave Kreskowiak

Именно здесь начинаются плохие привычки, от которых трудно избавиться. Как я уже говорил, небольшое исследование покажет вам, как решить проблему самостоятельно.