Я программист-новичок. У меня есть страница, как показано ниже. У меня есть база данных автомобилей, и я должен выполнить поиск из базы данных с этой страницы. Существует множество критериев, по которым пользователи могут вводить и выбирать значения. Но пользователю не нужно заполнять или выбирать все критерии. Например, пользователь может искать автомобиль, который зависит только от "Знак" или может выполнять поиск, который зависит от года = "2007". Топливо = "дизель" Gear = "Автоматический"... и т.д. Моя проблема заключается в том, как спроектировать запрос, который может определить, какие элементы управления имеют значение или нет. Я использую С# и MSSQL Server.
Вы должны создать свой запрос достаточно гибким (обработка незаполненных параметров) для работы со всеми условиями поиска. Рассмотрим тот же пример. если пользователь вводил только поле метки и оставался пустым
предположим, что у вас есть эти параметры
@mark varchar(20)
@series varchar(20)
@model varchar(20)
select * from tbl
where (@mark is null or markColumn=@mark) and
(@series is null or series Column=@series ) and
(@model is null or model Column=@model )
Я бы посоветовал вам передать все параметры indivitually в SP. это позволяет избежать динамического построения запроса и избежать инъекций SQL.
Как упоминалось ранее, будьте осторожны с SQL-инъекцией.
Я бы избежал sp с несколькими параметрами, так как эти параметры могут быть довольно многочисленными, и sp должен измениться. Кроме того, запрос qill будет очень медленным.
Из того, что я видел, лучше построить запрос в коде с помощью только необходимых ограничителей/фильтров и избежать
@param is null OR filed = @param
вот очень подробная статья о том, как обращаться с этой темой:
Динамические условия поиска в T-SQL от Erland Sommarskog
он охватывает все проблемы и методы попыток писать запросы с несколькими необязательными условиями поиска
вот оглавление:
Introduction The Case Study: Searching Orders The Northgale Database Dynamic SQL Introduction Using sp_executesql Using the CLR Using EXEC() When Caching Is Not Really What You Want Static SQL Introduction x = @x OR @x IS NULL Using IF statements Umachandar Bag of Tricks Using Temp Tables x = @x AND @x IS NOT NULL Handling Complex Conditions Hybrid Solutions – Using both Static and Dynamic SQL Using Views Using Inline Table Functions Conclusion Feedback and Acknowledgements Revision History
у вас может быть что-то в строках
select * from cars where model like case when @model = '' then '%' else '%'+@model+'%' end
и т.д. и т.д. Уродливый, но он должен работать.
вот быстрый запрос, который я выбил в качестве примера
declare @model varchar(20)
set @model = 't'
select *
from (
select 'one' as model
union
select 'two'
union
select 'three'
) as model
where model like case when @model = '' then '%' else '%'+@model+'%' end
Затем вы добавляете AND-предложения ad infinitum, используя% s, когда пусто и строка поиска, когда требуется.
Linq не создает оператор select, пока он фактически не используется. Таким образом, вы можете сделать что-то похожее на следующее:
public IQueryable<object> GetObjects(int a, string b)
{
var q = from i in items
where(i=>i.id == a)
select i;
if(!string.IsNullOrEmpty(b))
q = q.where(o=>o.Name == b);
return q;
}
Это было от манжеты, поэтому я мог бы иметь синтаксис не на 100%, но он должен быть близок.
Я должен был упомянуть, это метод, который ваша форма вызывала бы для получения набора результатов.
Вы можете составить запрос динамически в своем приложении, объединив все поля, у которых есть значения, указанные для них. Например: "... WHERE Model = 'abc' AND Color = 'Blue' AND...". Поля, которые не имеют значений, просто не будут включены в предложение WHERE. Если вы используете этот метод, вы должны быть ОЧЕНЬ осторожны, чтобы проверить свои поля ввода для атак SQL-инъекций.
Лучшим способом было бы создать хранимую процедуру в базе данных с параметрами для всех полей ввода. Вы можете передать нулевые значения для тех полей, для которых пользователь не вводил значение. Тем не менее, вы должны убедиться, что ваш SP может корректно обрабатывать параметры с нулевыми значениями и соответствующим образом фильтровать ваш результат.