C# 高级搜索查询

C# 高级搜索查询,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,我正在尝试建立一个免费的婚姻网站,主页上有一些文本框和下拉列表,还有一个搜索按钮 单击它会将访问者带到另一个页面以及所有字段的查询字符串 我使用以下存储过程来显示搜索结果 ALTER PROCEDURE dbo.homesearch @gender varchar(6), @age int, @age2 int, @religion varchar(50), @status varchar(11), @resCountry varchar(50), @resCity varchar(50) AS

我正在尝试建立一个免费的婚姻网站,主页上有一些文本框和下拉列表,还有一个搜索按钮

单击它会将访问者带到另一个页面以及所有字段的查询字符串

我使用以下存储过程来显示搜索结果

ALTER PROCEDURE dbo.homesearch
@gender varchar(6),
@age int,
@age2 int,
@religion varchar(50),
@status varchar(11),
@resCountry varchar(50),
@resCity varchar(50)
AS
SELECT * 
    FROM [users] 
    WHERE 
       ( ([age] > @age) OR ([age] < @age2) OR 
         ([gender] = @gender) OR ([religion] = @religion) OR 
         ([status] = @status) OR ([resCountry] = @resCountry) OR 
         ([resCity] = @resCity))

RETURN
问题是我被OR&AND困住了

如果我使用OR,那么它将显示许多不相关的结果

如果我使用,那么如果任何搜索查询为空,该怎么办

对不起,我是新手,我的问题对你们朋友来说可能太幼稚了

另一个问题是,这是否是最好且安全的方法?如果没有,那么我如何改进它。

如果您正在使用和

在现实世界中,我可能不会使用N/A,可以使用空字符串、整数或任何你喜欢的东西,只要等式测试的两边都一样


另一方面,我会使用=进行年龄测试。

这取决于你想要什么

与&OR在任何编程语言(如TSQL)中的区别如下:

当您使用或在条件之间 比如:【年龄】>@age或【年龄】<@age2或【性别】=@性别或【宗教】=@宗教 这意味着即使有一个条件为真,也要从用户中选择*

但是当你在不同的条件下使用 比如:【年龄】>@年龄和【年龄】<@age2和【性别】=@性别和【宗教】=@宗教 意味着如果我的所有条件都为真,请从用户中选择*

因此,如果希望结果包含具有所有条件的用户,请使用和。
但是,如果您希望结果包含甚至具有一个或多个条件的用户,请使用or。

因此,基本思想是参数可能为null,也可能不为null,因此请按如下方式进行查询

ALTER PROCEDURE dbo.homesearch
@gender varchar(6),
@age int,
@age2 int,
@religion varchar(50),
@status varchar(11),
@resCountry varchar(50),
@resCity varchar(50)

AS
SELECT * FROM [users] 
WHERE (@gender is null or gender = @gender)
AND ((@age is null or age > @age)
AND (@age2 is null or age <@age2))
AND (@religion is null or religion=@religon)
AND (@status is null or status =@status )
AND (@resCountry is null or resCountry =@resCountry )
AND (@resCity is null or resCity =@resCity )
RETURN

使用存储过程是查询数据的最佳实践和安全方式之一。您也可以使用动态sql添加更多高级搜索功能,但这样做不是最佳做法,而且很容易受到sql注入攻击。

我已经编辑了您的标题。请看,如果共识是否定的,他们就不应该这样做。
SELECT * FROM [users] 
WHERE (isNull([religion],'N/A') = Coalesce(@religion, [relegion], 'N/A') 
... etc
ALTER PROCEDURE dbo.homesearch
@gender varchar(6),
@age int,
@age2 int,
@religion varchar(50),
@status varchar(11),
@resCountry varchar(50),
@resCity varchar(50)

AS
SELECT * FROM [users] 
WHERE (@gender is null or gender = @gender)
AND ((@age is null or age > @age)
AND (@age2 is null or age <@age2))
AND (@religion is null or religion=@religon)
AND (@status is null or status =@status )
AND (@resCountry is null or resCountry =@resCountry )
AND (@resCity is null or resCity =@resCity )
RETURN