我正在构建一个应用程序,允许用户根据一组标准选择他们选择的汽车。
这些标准是:
汽车的条件(新的,二手的,已售出的)
年度汽车(从1900年到2013年,我们将在2014年进入市场时加入)
价格的汽车($ 0 - $ 10,000,一直超过$ 20,000)
汽车(敞篷车,运动用品,轿车等)的类型
制作汽车(讴歌,雷克萨斯,丰田,马自达等)
汽车模型(传奇,凯美瑞,卡罗拉等)
以上所有标准都是从数据库填充的下拉列表控件。
到目前为止,我能够为Year,Make和Model创建级联下拉列表控件。
用户从 ddlYear 下拉列表中选择汽车年份,例如1987年,并且所有为1987年制作的Makes会自动填充到 ddlMake 下拉列表中。
然后,当用户选择Make时,该年份和该年份的模型将自动填充到 ddlModel 下拉列表控件中。
这部分工作正常。
我真正需要你帮助的是如何构建允许用户从 ddlCondition 下拉列表中选择条件的代码,年份来自 ddlYear 下拉列表,价格范围来自 ddlPrice 下拉列表,来自 ddlType 下拉列表的车型,来自 ddlMake 下拉列表中的车型,最后来自 ddlModel的车型下拉列表,然后单击“搜索”按钮以显示结果。
' SQL Query (base)
Dim sql = "SELECT * FROM YourVehiclesTable WHERE "
'Begin checking our values and appending to our clauses
'If Condition has a value
If Not String.IsNullOrEmpty(ddlCondition.SelectedValue) Then
'Append to query
sql += String.Format(" Condition = '{0}' AND", ddlCondition.SelectedValue)
End If
'Check Year
If Not String.IsNullOrEmpty(ddlYear.SelectedValue) Then
'Append to query
sql += String.Format(" Year = '{0}' AND", ddlYear.SelectedValue)
End If
'Check Price
If Not String.IsNullOrEmpty(ddlPrice.SelectedValue) Then
'Append to query
sql += String.Format(" Price <= '{0}' AND", ddlPrice.SelectedValue)
End If
'continue with rest
'When we are finished make sure to strip off any remaining "AND" and "WHERE"s that may be present at the end
sql = sql.TrimEnd(" WHERE ").TrimEnd("AND")
我不太确定如何将所有内容放在一起,以便用户选择条件,年份,价格,车辆类型,制作,模型并单击“搜索”按钮以显示结果。
有没有比我使用显示代码的方法更好的方法?
提前感谢您的大力帮助。
请看截图。
答案 0 :(得分:3)
有更好的方法吗?是的,我认为有。
在我使用多个参数进行此类搜索时,无法保证输入的是哪个参数,我使用存储过程;尝试动态编写一个类似于你在问题中显示的SQL查询对我来说太容易出错(加上你冒着SQL注入的风险)。
存储过程定义为您要使用的每个条件都有一个参数,并将每个参数默认为NULL
,然后在查询正文中我们可以轻松地排除任何仍为NULL
的参数例如
CREATE PROCEDURE VehicleSearch
(
@Condition NVARCHAR(50) = NULL,
@Year NVARCHAR(4) = NULL,
@Make NVARCHAR(50) = NULL,
@Model NVARCHAR(50) = NULL
)
AS
SELECT
*
FROM
YourVehiclesTable v
WHERE
(@Condition IS NULL OR v.Condition = @Condition)
AND
(@Year IS NULL = OR v.Year = @Year)
AND
(@Make IS NULL OR v.Make = @Make)
AND
(@Model IS NULL or v.Model = @Model)
单击“搜索”按钮时,将调用存储过程,仅传递用户选择的参数;其他参数将默认为NULL并从查询中排除。
答案 1 :(得分:0)
我个人会使用一个级别参数:
CREATE PROCEDURE SearchIt
(
@Condition VARCHAR(50) = NULL,
@Year VARCHAR(4) = NULL,
@Make VARCHAR(50) = NULL,
@Model VARCHAR(50) = NULL,
@Level INT
)
AS
IF (@Level = 1)
BEGIN
SELECT *
FROM MyTable
WHERE VehCondition = @Condition
END
ELSE IF (@Level = 2)
BEGIN
SELECT *
FROM MyTable
WHERE VehCondition = @Condition
AND VehYear = @Year
END
ELSE IF (@Level = 3)
BEGIN
SELECT *
FROM MyTable
WHERE VehCondition = @Condition
AND VehYear = @Year
AND VehPrice = @Price
END
ELSE IF (@Level = 4)
BEGIN
SELECT *
FROM MyTable
WHERE VehCondition = @Condition
AND VehYear = @Year
AND VehPrice = @Price
AND VehType = @Type
END