katkot_rewsh Ответов: 3

В чем же ошибка в этом коде


В чем же ошибка в этом коде
Мне нужно выбрать из конкретной таблицы, используя два файла вместе, используя (и) (&)
Выберите из таблицы, где filed1 и подано 2 и подано 3 = условие1, условие 2, условие 3
Любой может помочь

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

строка sQry = "SELECT * FROM Conductors where Type =('"+Convert.Метод toString(поле combobox1.Элемент)+"') и формы = ('" + преобразование.Метод toString(comboBox2.Элемент) + "'),";

3 Ответов

Рейтинг:
24

0x01AA

Самая большая ошибка заключается в построении SQL-оператора непосредственно с помощью пользовательского ввода.
Используйте всегда параметризованные запросы, чтобы избежать SQL-инъекции.
Примечание: для вашего кода на данный момент это не так уж критично, потому что вы используете индекс combobox.

Ошибка в вашем случае заключается в том, что вы соединяете строки неправильно. Чтобы сделать соединение строк более читабельным я предлагаю использовать так называемую интерполяцию строк:

string sQry = $"SELECT * FROM Conductors where Type = '{comboBox1.SelectedItem.ToString()}' and Shape = '{comboBox2.SelectedItem.ToString()}'" ... etc;


Опять же: не создавайте sql-операторы непосредственно из пользовательского ввода.

Смотрите также Решение № 2 от @SLFC-Майка, в котором описывается гораздо более подробно
Надеюсь, это поможет.


MadMyche

+5 для простого набора текста быстрее, чем я

0x01AA

Нет-нет, вы описываете все это гораздо подробнее и гораздо лучше, чем я *большие пальцы вверх*

MadMyche

.. но вы использовали причудливую строку интерполяции

Maciej Los

5ed!

0x01AA

Спасибо тебе, Мацей!

Рейтинг:
19

MadMyche

Скорее всего, в вашем заявлении есть несколько ошибок.

Главная проблема, которую я вижу, - это серьезная уязвимость, известная как SQL-инъекция Вы никогда не должны соединять введенные пользователем данные в виде строк вместе, чтобы сформировать инструкцию SQL. Правильный способ добавления переменных в команду заключается в следующем Параметры

string sQry = "SELECT * FROM Conductors WHERE Type = @Type AND Shape = @Shape";

SqlCommand cmd = new SqlCommand(sQry, {SqlConnection});
cmd.Parameters.AddWithValue("@Type", Convert.ToString(comboBox1.SelectedItem));
cmd.Parameters.AddWithValue("@Shape", Convert.ToString(comboBox2.SelectedItem));
Следующее, на что нужно обратить внимание, - это ваш синтаксис; обычно, если вы собираетесь обернуть свой условия в скобках это будет вокруг всего сравнения, а не только термина, или; вы можете опустить их на довольно простых предложениях
-- yours (translated)
SELECT * FROM Conductors WHERE Type =('TypeValue') AND Shape = ('ShapeValue')

-- preferred
SELECT * FROM Conductors WHERE (Type = 'TypeValue') AND (Shape = 'ShapeValue')
-- without parenthesis
SELECT * FROM Conductors WHERE Type ='TypeValue' AND Shape = 'ShapeValue'
И последнее, на что следует обратить внимание, - это используемые термины; похоже, что некоторые из используемых имен столбцов могут быть классифицированы как зарезервированный или особый; в этом случае они должны быть определены как таковые, чтобы указать это в качестве имени столбца (или другого объекта SQL по мере необходимости). Правило, которое я использую для определения этого, заключается в том, что если я набираю его в SQL Studio и цвет меняется, то он должен быть завернут. Если вы посмотрите на эти примеры кода, то увидите, что Тип был выделен. В SQL Server вы бы заключили этот термин в [квадратные скобки].
SELECT * FROM Conductors WHERE [Type] ='TypeValue' AND [Shape] = 'ShapeValue'


0x01AA

+5

Maciej Los

5ed!

Рейтинг:
1

Hank Williams

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


Dave Kreskowiak

Всего лишь на год опоздал.