Member 13996041 Ответов: 2

Выброшено исключение: 'system.data.oledb.oledbexception' in system.data.dll system.data.oledb.oledbexception (0x80040e14): синтаксическая ошибка (отсутствует оператор) в выражении запроса


Я практикую свой собственный проект, но у меня есть синтаксическая ошибка, которую я не могу понять.
Это класс курса, который имеет свойства courseID, courseName, description и creditHour. Метод DBSetup() подключается к базе данных. Метод InsertDB () - это вставка 4 значений в базу данных.
Идентификатор_курса, CourseName, описание несколько строк. CreditHour - это int.

public string cmd;

public void InsertDB()
        {
            DBSetup();

            cmd = "INSERT into Patient values(" + getCourseID() + "," +
                             "'" + getCourseName() + "'," +
                             "'" + getDescription() + "'," +
                             getCreditHour() + ")";


            OleDbDataAdapter2.InsertCommand.CommandText = cmd;
            OleDbDataAdapter2.InsertCommand.Connection = OleDbConnection2;
            Console.WriteLine(cmd);

            try
            {
                OleDbConnection2.Open();
                int n = OleDbDataAdapter2.InsertCommand.ExecuteNonQuery();

                if (n == 1)
                    Console.WriteLine("Data Inserted...");
                else
                    Console.WriteLine("ERROR: Inserting Data");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                OleDbConnection2.Close();
            }
        } // end InsertDB()


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

Я думаю, что синтаксис строки cmd неверен. Я могу неправильно ставить кавычки и двойные коуты. Я пытался понять это в течение многих часов. Я не могу этого понять.

2 Ответов

Рейтинг:
18

Patrice T

Цитата:
но у меня есть синтаксическая ошибка, которую я не могу понять.

Синтаксис вашего запроса зависит от значения CourseName и Description, простого Апострофа в этих полях достаточно, чтобы полностью изменить синтаксис. Эта проблема - "SQL-инъекция".
cmd = "INSERT into Patient values(" + getCourseID() + "," +
"'" + getCourseName() + "'," + "'" + getDescription() + "'," + getCreditHour() + ")";

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


Рейтинг:
0

MadMyche

Второе лучшее, что можно сделать правильно (использовать параметры, а не сцепленные строки), - это то, что вам не нужно беспокоиться обо всех кавычках и одинарных кавычках; и это делает его намного чище и проще проверять значения.

Пять минут моего времени ушло на эту параметризованную версию:

cmd = "INSERT into Patient values(@CourseID, @CourseName, @Description, @CreditHour)";
 
string CourseID = getCourseID();
string CourseName = getCourseName();
string Description = getDescription();
int CreditHour = getCreditHour();

// insert breakpoint somewhere in here to check the incoming values

OleDbDataAdapter2.InsertCommand.CommandText = cmd;
OleDbDataAdapter2.InsertCommand.Connection = OleDbConnection2;
OleDbDataAdapter2.InsertCommand.Parameters.AddWithValue("@CourseID", CourseID);
OleDbDataAdapter2.InsertCommand.Parameters.AddWithValue("@CourseName", CourseName);
OleDbDataAdapter2.InsertCommand.Parameters.AddWithValue("@Description", Description);
OleDbDataAdapter2.InsertCommand.Parameters.AddWithValue("@CreditHour", CreditHour);