0

我正在构建一个应用程序,允许用户根据一组标准选择他们选择的汽车。

这些标准是:

汽车状况(新、旧、已售)

汽车年份(从 1900 年到 2013 年,当它们进入市场时,我们将包括 2014 年)

汽车价格(0 - 10,000 美元,一直到 20,000 美元以上)

汽车类型(敞篷车、运动型多功能车、轿车等)

汽车品牌(讴歌、雷克萨斯、丰田、马自达等)

车型(传奇、凯美瑞、卡罗拉等)

以上所有标准都是从数据库填充的下拉列表控件。

到目前为止,我能够为 Year、Make 和 Model 创建级联下拉列表控件。

用户从ddlYear下拉列表中选择汽车年份,例如 1987 年,所有为 1987 年构建的 Makes 都会自动填充到ddlMake下拉列表中。

然后,当用户选择 Make 时,该品牌和该年份的模型会自动填充到ddlModel下拉列表控件中。

这部分工作正常。

我真正需要你的帮助是如何构建允许用户从 ddlCondition 下拉列表中选择 Condition、从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")

我不太确定如何将它们放在一起,以便用户选择条件、年份、价格、车辆类型、品牌、型号,然后单击搜索按钮以显示结果。

有没有比我使用显示代码的方法更好的方法?

预先感谢您的大力协助。

请看截图。

在此处输入图像描述

4

2 回答 2

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 并从查询中排除。

于 2013-09-02T15:00:07.407 回答
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
于 2013-09-02T15:54:15.337 回答