Member 13806021 Ответов: 3

Sql command - незамкнутая метка


Пожалуйста, я пытаюсь сделать две вставки одновременно, в этой команде я получил и ошибку
"Незамкнутая кавычка после строки символов ')'.'
"


cmd.CommandText = "INSERT Proby (projektId,formaId,maszynaId,detalId, celId) select Projekt.projektId, Forma.formaId, Maszyna.maszynaId, Detal_komplet.detalId, Cel.celId from Projekt, Forma,Maszyna,Detal_komplet,Cel where" +
                   " projektNazwa = '" + comboProjekt.SelectedValue.ToString() + "' and formaNazwa = '"
                   + comboForma.SelectedValue.ToString() + "' and maszynaNazwa = '"
                   + comboMaszyna.SelectedValue.ToString() + "' and detalNazwa = '"
                   + comboDetal.SelectedValue.ToString() + "' and celNazwa = '"
                   + comboCel.SelectedValue.ToString() + " & Proby(czasTrw) values('"+comboTrwanie.SelectedValue.ToString()+"')";


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

Я попытался добавить метку четверостишия в другом месте, но безрезультатно

Richard MacCutchan

Не используйте конкатенацию строк для команд SQL. Используйте правильные параметризованные запросы, которые будут иметь двойное преимущество, избегая простых ошибок, подобных приведенным выше, и защищая от SQL-инъекций.

3 Ответов

Рейтинг:
25

CHill60

Не используйте сцепленные строки для создания sql - команд- вы рискуете SQL-инъекция[^] атака.

Воспользуйся параметризованные запросы[^] чтобы избежать этого, и вы обнаружите, что это также исправит эту конкретную проблему

[EDIT] я начал преобразовывать ваш запрос в использование параметров и зашел так далеко ...

cmd.CommandText = "INSERT Proby (projektId,formaId,maszynaId,detalId, celId) select Projekt.projektId, Forma.formaId, Maszyna.maszynaId, Detal_komplet.detalId, Cel.celId from Projekt, "
     + "Forma,Maszyna,Detal_komplet,Cel where " 
     + " projektNazwa = @projectNazwa and formaNazwa = @formaNazwa and maszynaNazwa = @maszynaNazwa " 
     + " and detalNazwa = @detalNazwa and celNazwa = @celNazwa & Proby(czasTrw) values(@Trwanie)"
				   
     cmd.Parameters.AddWithValue("@projectNazwa", comboProjekt.SelectedValue.ToString());
     cmd.Parameters.AddWithValue("@formaNazwa", comboForma.SelectedValue.ToString());
     cmd.Parameters.AddWithValue("@maszynaNazwa", comboMaszyna.SelectedValue.ToString());
     cmd.Parameters.AddWithValue("@detalNazwa", comboDetal.SelectedValue.ToString());
     cmd.Parameters.AddWithValue("@celNazwa", comboCel.SelectedValue.ToString());
     cmd.Parameters.AddWithValue("@Trwanie", comboTrwanie.SelectedValue.ToString());
но потом я смог заметить values(@Trwanie) в конце вашего SQL - это не выглядит правильным для меня и, вероятно, вызовет дальнейшие проблемы. Избавься от него.


Wendelius

Хороший совет! Либо значения, либо выбор неверен, трудно сказать, какой из них, но, как вы указали, оба не могут остаться.

Member 13806021

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

CHill60

С удовольствием. Да, они действительно выглядят чистыми, не так ли?..и я уверен, что вы согласитесь, что гораздо легче заметить ошибки.

Maciej Los

5ed!

Рейтинг:
1

Patrice T

Попробуй:

+ comboCel.SelectedValue.ToString() + "' & Proby(czasTrw) 

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


Рейтинг:
0

Wendelius

Как уже указывалось, всегда используйте параметр. Но также глядя на ваш SQL-оператор, кажется немного странным, что у вас есть 5 таблиц в вашем запросе, но вы не присоединяетесь к ним . Вам не хватает условий присоединения?

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

...Cel.celId 
from Projekt, Forma,Maszyna,Detal_komplet,Cel 
where projekt.projektNazwa...


CHill60

Тоже хороший совет! Я совершенно упустил это из виду :-)

Maciej Los

5ed!