2011-12-26 4 views
2

У меня есть функция, которая вызывается с параметром под названием «имя», теперь она отлично работает. Пока я не сделаю поиск с «в нем». Поэтому я отправляю это как имяФункция поиска не работает должным образом

Plastic & Foam 3'X5' XLT 

Когда я отправляю, что он возвращает пустое место на сайте (без ошибок), но если я отправлю jusr Plastic & Foam, он отлично работает, он возвращается в порядке. Теперь в SQL части я получаю это, когда я отправить запрос через студию управления, как этот

exec sp_productSearch 'Plastic & Foam 3''X5'' XLT' 

SELECT Name FROM PProducts WHERE NAME LIKE '%Plastic & Foam 3'X5' XLT' 
Msg 102, Level 15, State 1, Line 1 
Incorrect syntax near 'X5'. 

В C# я посылаю список текста этого

Server.HtmlEncode(txtproductname.Text.Trim().Replace("'", "''")) 

Любые идеи, что я могу делать неправильно?

PS: Хранимая процедура проста, что-то вроде этого

Select Name from PProducts Where NAME LIKE '%' + @NAME + '%' ; 

Спасибо.

+3

Разрешение '' 'в ваших поисковых запросах/базе данных - очень плохая практика (sql-инъекция) – Matten

+0

Нам нужно увидеть код C#, а не SQL-запросы, чтобы иметь возможность ответить на этот вопрос. Кроме того, пожалуйста, измените заголовок, чтобы суммировать вашу проблему. Благодарю. – Arjan

+0

Пожалуйста, введите код C#, который показывает, где вы храните хранимую процедуру 'sp_productSearch'. Я подозреваю, что вам нужно использовать параметры в своем SQL-запросе вместо того, чтобы вводить значение строки для поиска непосредственно в ваш вызов хранимой процедуры. –

ответ

1

Похоже, у вас уже есть параметр, называемый @NAME

Так хранимая процедура просто нужно сделать

SELECT Name 
FROM PProducts 
WHERE NAME LIKE '%' + @NAME + '%' 

или, лучше, поэтому он возвращает правильные результаты в том случае, если какой-либо из вашего продукта имена которых содержат шаблон символы, такие как % не используют LIKE вообще и использовать

SELECT Name 
FROM PProducts 
WHERE CHARINDEX(@NAME,NAME) > 0 

Или, еще лучше, используйте полнотекстовый поиск

Я предполагаю, что вы строите строку запроса внутри хранимой процедуры и затем выполняете ее. Это не обязательно на основе того, что вы опубликовали до сих пор, и представляет собой риск инъекций SQL.

Также не удаляйте вручную значение txtproductname.Text. Передайте его в «как есть», используя параметры.

3

Вы передаете ' символов «raw» для запроса в SQL? Вы столкнулись с проблемой, которая называется SQL injection.

Просьба найти решение для безопасной передачи данных на ваш SQL-сервер. Для C# вы должны проверить eg. this question для более подробных советов.

+4

Я думаю, что он сталкивается с проблемой, называемой [Маленькая Bobby Tables] (http://imgs.xkcd.com/comics/exploits_of_a_mom.png) ;-) –

+2

@UweKeim lol ... – lalibi

1

EDITED

Это последняя часть ваших вопросов немного страшно

Select Name from PProducts Where NAME LIKE ''%' + @NAME + '%''' 

мне было интересно, почему вы используете так много цитат и вы возможно выполнение SQL с помощью конкатенации:

EXEC 'Select Name from PProducts Where NAME LIKE ''%' + @NAME + '%''' 

Если это так, то быстрый/грязный способ его устранения состоит в том, чтобы избежать котировок дважды, что означает что-то l икэ:

EXEC sp_productSearch 'Plastic & Foam 3''''X5'''' XLT' 

Это заявление должно работать без проблем но это действительно плохой способ для выполнения SQL-запроса с использованием пользовательского ввода. Другие ответы уже охватывают это.

С другой стороны, & становится & с вызовом Html Encode в соответствии с this page, поэтому будьте осторожны с этим.

+0

Читайте вопрос. Они говорят, что этот запрос в SSMS 'exec sp_productSearch 'Plastic & Foam 3''X5' 'XLT'' генерирует эту ошибку' Некорректный синтаксис около' X5 '.'. Нет «HTMLEncode» в поле зрения и на его собственном поиске «Пластик» & Пена ', а не« Пластик и пена »означает просто потенциально неправильные результаты, а не синтаксическую ошибку. Хотя я согласен, что использовать его неправильно. –

+1

Вы правы. Отредактировал мой ответ. – lalibi

+0

те цитаты exta были ошибкой при написании там там спасибо – jedgard

Смежные вопросы