Как? Параметры и LIKE оператор SQL

72

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

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

Можно ли использовать такие параметры? или они действительны только в экземпляре, например:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%' (где <string> - объект поиска).

EDIT: Я создаю эту функцию с помощью VB.NET, влияет ли это на синтаксис, который вы, ребята, внесли?

Кроме того, я запустил этот оператор в SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% max% ') `и возвращает результаты.

Теги:

6 ответов

72
Лучший ответ

Ваш визуальный базовый код будет выглядеть примерно так:

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')")

cmd.Parameters.Add("@query", searchString)
  • 2
    Как отметил Адам в своем ответе, это не защищает от внедрения SQL. Запрос должен быть параметризован.
  • 5
    Не могли бы вы привести пример, где это не препятствует внедрению SQL? Из моего тестирования работает нормально
Показать ещё 4 комментария
95

Ну, я бы пошел с:

 Dim cmd as New SqlCommand(
 "SELECT * FROM compliance_corner"_
  + " WHERE (body LIKE @query )"_ 
  + " OR (title LIKE @query)")

 cmd.Parameters.Add("@query", "%" +searchString +"%")
  • 0
    Это правильно, принятый ответ, предоставленный Джоном, имеет неправильный синтаксис!
  • 3
    Я не уверен, как его синтаксис неправильный, его решение работало просто отлично. У меня есть функция, которая создает и возвращает инструкцию SQL для использования в DataTable или что-то еще.
Показать ещё 7 комментариев
23

вам нужно сделать:

LIKE '%' + @param + '%'

  • 0
    отличное решение - даст больше +1, если возможно! Спасибо
1

Иногда символ, используемый в качестве заполнителя %, не то же самое, если вы выполняете запрос из VB, как при его выполнении из MS SQL/Access. Попробуйте изменить свой символ-заполнитель от % до *. Это может сработать. Однако, если вы отлаживаете и хотите скопировать строку SQL непосредственно в MS SQL или Access для ее проверки, вам может потребоваться изменить символ на % в MS SQL или Access, чтобы фактически вернуть значения.

Надеюсь, что это поможет

1

Возможно, вам придется объединить знаки% с вашим параметром, например:

LIKE '%' || @query || '%'

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

0

попробуйте также этот путь

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%')  OR  title LIKE CONCAT('%',@query,'%') )")
cmd.Parameters.Add("@query", searchString)
cmd.ExecuteNonQuery()

Используется Конкат вместо +

Ещё вопросы

Сообщество Overcoder
Наверх
Меню