我是一名新手程序员。我的页面如下所示。我有一个汽车数据库,我必须使用此页面从数据库中搜索。用户可以输入和选择值有许多标准。但是用户不必填写或选择所有标准。例如,用户可以搜索仅依赖于“Mark”的汽车或者可以搜索依赖于Year =“2007”Fuel =“diesel”Gear =“Automatic”...等等。我的问题是如何设计一个可以查询的检测哪些控件有价值。我使用C#和MSSQL Server。
答案 0 :(得分:2)
您应该足够灵活地构建查询(处理未填充的参数)以处理所有搜索条件。考虑相同的例子。如果用户仅输入标记字段,则保留为空白
示例代码,假设您有这些参数
@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 )
我建议您将所有参数单独传递给SP。这避免了查询的动态构造,并将避免SQL注入。
答案 1 :(得分:1)
如前所述,请注意sql注入。
我会避免带有多个参数的sp,因为这些参数可能是一个很大的数字,并且sp需要改变。此外,查询要非常慢。
从我所看到的,最好在代码中构建查询,只使用所需的限制器/过滤器并避免
@param is null OR filed = @param
答案 2 :(得分:1)
这是一篇关于如何处理这个主题的非常全面的文章:
Dynamic Search Conditions in T-SQL by 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's 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
答案 3 :(得分:0)
您可以通过连接具有为其指定值的所有字段,在应用程序中动态编写查询。例如“...... WHERE Model ='abc'AND Color ='Blue'AND ......”。没有值的字段将不包含在WHERE子句中。如果您使用此方法,则需要非常小心检查SQL注入攻击的输入字段。
更好的方法是在数据库中创建一个存储过程,该存储过程具有所有输入字段的参数。您可以为用户未输入值的字段传入空值。但是,您必须确保SP可以正确处理具有空值的参数并相应地过滤结果集。
答案 4 :(得分:0)
你可以拥有
的内容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子句,空时使用%s,需要时使用搜索字符串。
答案 5 :(得分:0)
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%,但应该很接近。
我应该提到,这是表单调用以获取结果集的方法。