Asp.net 如何正确编写此数据库搜索查询?
我正在尝试编写一个查询,它将根据许多不同的表单字段搜索数据库。我希望查询按输入的字段过滤,而忽略表单上未输入的任何字段。例如: 表单字段: -项目名称 -项目编号 -项目经理 因此,如果用户为项目名称输入一个“Joe”,那么无论该记录中的其他值是什么,它都应该返回名称字段中带有任何形式“Joe”的所有结果 我一直试图用严格的SQL来实现这一点,但我得到的结果是不正确的(但却是预期的)。我有一些非常重要的问题,如果它们非常牵强,我道歉 第一个查询是使用AND语句为所有条件设置的。我意识到它不起作用,因为数据库中的空值仍然不能被通配符拾取Asp.net 如何正确编写此数据库搜索查询?,asp.net,sql,tsql,search,dotnetnuke,Asp.net,Sql,Tsql,Search,Dotnetnuke,我正在尝试编写一个查询,它将根据许多不同的表单字段搜索数据库。我希望查询按输入的字段过滤,而忽略表单上未输入的任何字段。例如: 表单字段: -项目名称 -项目编号 -项目经理 因此,如果用户为项目名称输入一个“Joe”,那么无论该记录中的其他值是什么,它都应该返回名称字段中带有任何形式“Joe”的所有结果 我一直试图用严格的SQL来实现这一点,但我得到的结果是不正确的(但却是预期的)。我有一些非常重要的问题,如果它们非常牵强,我道歉 第一个查询是使用AND语句为所有条件设置的。我意识到它不起作用
<ListDataSource CommandText="
SELECT [surveyid],
[projectnumber],
[siteno],
[person],
[subatpdate],
[projectname],
[priorsurveyor],
[siteaddress],
[sitecity],
[sitestate],
[sitezip],
[survey],
[zoning],
[environmental],
[emg_projectnumber],
[zoning_projectnumber],
[surveyor_projectnumber]
FROM tblrawprojectdatabase
WHERE [projectnumber] LIKE '%' + @projectnumber + '%'
AND [siteno] LIKE '%' + @siteno + '%'
AND [person] LIKE '%' + @person + '%'
AND [subatpdate] LIKE '%' + @subatpdate + '%'
AND [projectname] LIKE '%' + @projectname + '%'
AND [priorsurveyor] LIKE '%' + @priorsurveyor + '%'
AND [siteaddress] LIKE '%' + @siteaddress + '%'
AND [sitecity] LIKE '%' + @sitecity + '%'
AND [sitestate] LIKE '%' + @sitestate + '%'
AND [sitezip] LIKE '%' + @sitezip + '%'
AND [survey] LIKE '%' + @survey + '%'
AND [zoning] LIKE '%' + @zoning + '%'
AND [environmental] LIKE '%' + @environmental + '%'
AND [emg_projectnumber] LIKE '%' + @emg_projectnumber + '%'
AND [zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%'
AND [surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' "
在构建CommandText变量时,在asp代码中执行一些条件逻辑。例如,如果在ProjectName文本框中未输入任何内容,则不要将其包括在查询中。此外,您可以考虑使用或逻辑代替。这将取决于你想要达到的目标
这里有一个大概的方法。这不是真正的代码,它只是显示了方法:
string WhereClause = "where 1 = 2 "
if a project name was specified.
WhereClause = WhereClause + something about the project name.
etc
另外,请记住包含查询参数。关于这一点,请在临时表中添加所有内容,删除所有需要的内容,然后从临时表返回
SELECT [surveyid], [projectnumber], [siteno], [person], [subatpdate], [projectname],
[priorsurveyor], [siteaddress], [sitecity], [sitestate], [sitezip], [survey], [zoning],
[environmental], [emg_projectnumber], [zoning_projectnumber], [surveyor_projectnumber]
INTO #temp
FROM tblRawProjectDatabase
WHERE ([projectnumber] LIKE '%' + @projectnumber + '%' OR [projectnumber] IS NULL) AND
([siteno] LIKE '%' + @siteno + '%' OR [siteno] IS NULL) AND
([person] LIKE '%' + @person + '%' OR [person] IS NULL) AND
([priorsurveyor] LIKE '%' + @priorsurveyor + '%' OR [priorsurveyor] IS NULL) AND
([siteaddress] LIKE '%' + @siteaddress + '%' OR [siteaddress] IS NULL) AND
([sitecity] LIKE '%' + @sitecity + '%' OR [sitecity] IS NULL) AND
([sitestate] LIKE '%' + @sitestate + '%' OR [sitestate] IS NULL) AND
([sitezip] LIKE '%' + @sitezip + '%' OR [sitezip] IS NULL) AND
([survey] LIKE '%' + @survey + '%' OR [survey] IS NULL) AND
([zoning] LIKE '%' + @zoning + '%' OR [zoning] IS NULL) AND
([environmental] LIKE '%' + @environmental + '%' OR [environmental] IS NULL) AND
([emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' OR [emg_projectnumber] IS NULL) AND
([zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' OR [zoning_projectnumber] IS NULL) AND
([surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' OR [surveyor_projectnumber] IS NULL)
DELETE FROM #temp WHERE ProjectManaer IS NULL
SELECT * FROM #temp
DROP TABLE #temp
顺便说一句,你把SQL放在一起的方式让自己很容易受到SQL注入的影响。为了获得免费搜索功能,我会使用Lucene这样的平台,而不是直接搜索数据库。ErikE,在这一点上,功能将是一个美丽的景象,但我会注意到这一点。是什么让它变得脆弱?我有PHP和MySql的背景,所以这些东西的设置方式仍然让我感到困惑。戴,我在DotNetNuke中使用XMod模块。不幸的是,在数据库交互模块中,搜索数据库并不是他们认为必要的功能,所以我正在尝试解决它。我尝试了多种变体,或者似乎总是让它返回不需要的结果。我想到了使用ASP代码来创建查询,但我希望在没有代码的情况下有一些方法来实现这一点,因为查询是在XMOD for DotNetNuke中执行的。我知道该模块有自己的小脚本标记,所以我将看看这是否是一种更好的方法。它使用参数,我只是没有复制和粘贴这些参数。在应用程序代码中可以执行的大多数逻辑也可以在tsql中执行。当然,您必须使用动态sql。感谢您的回复。我想我不太明白你的意思。这个临时桌有什么好处?可悲的是,如果只是存在短路或操作员,我的当前设置就不会有任何问题。
SELECT [surveyid], [projectnumber], [siteno], [person], [subatpdate], [projectname],
[priorsurveyor], [siteaddress], [sitecity], [sitestate], [sitezip], [survey], [zoning],
[environmental], [emg_projectnumber], [zoning_projectnumber], [surveyor_projectnumber]
INTO #temp
FROM tblRawProjectDatabase
WHERE ([projectnumber] LIKE '%' + @projectnumber + '%' OR [projectnumber] IS NULL) AND
([siteno] LIKE '%' + @siteno + '%' OR [siteno] IS NULL) AND
([person] LIKE '%' + @person + '%' OR [person] IS NULL) AND
([priorsurveyor] LIKE '%' + @priorsurveyor + '%' OR [priorsurveyor] IS NULL) AND
([siteaddress] LIKE '%' + @siteaddress + '%' OR [siteaddress] IS NULL) AND
([sitecity] LIKE '%' + @sitecity + '%' OR [sitecity] IS NULL) AND
([sitestate] LIKE '%' + @sitestate + '%' OR [sitestate] IS NULL) AND
([sitezip] LIKE '%' + @sitezip + '%' OR [sitezip] IS NULL) AND
([survey] LIKE '%' + @survey + '%' OR [survey] IS NULL) AND
([zoning] LIKE '%' + @zoning + '%' OR [zoning] IS NULL) AND
([environmental] LIKE '%' + @environmental + '%' OR [environmental] IS NULL) AND
([emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' OR [emg_projectnumber] IS NULL) AND
([zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' OR [zoning_projectnumber] IS NULL) AND
([surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' OR [surveyor_projectnumber] IS NULL)
DELETE FROM #temp WHERE ProjectManaer IS NULL
SELECT * FROM #temp
DROP TABLE #temp