我是c#的新手。
我正在使用c#使用三个DropDownLists和一个提交按钮在asp.net中使用搜索功能。比方说,这是一个汽车网站。
有2个DropDownLists:
如果用户只选择第一个(例如 - 他/她选择'丰田'而不选择其他)并单击提交,它将显示数据库中的所有丰田汽车。如果用户同时选择“制作”和“模型”,则会缩小搜索范围。
如果用户没有选择所有下拉列表,我应该如何为此编写sql query
以及如果用户选择全部内容。
下拉列表项直接从数据库中添加。我也不知道如何在下拉列表的顶部设置默认值文本。
con.Open();
if (!IsPostBack)
{
cmd = new SqlCommand("SELECT DISTINCT CarMake FROM Car", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
DropDownList1.Items.Add(dr[0].ToString());
}
}
答案 0 :(得分:3)
特别是当从这样的公共webform构建SQL时,您应该(我会说必须)使用参数构建查询,不是字符串连接。否则它是等待发生的SQL注入攻击。
处理多种过滤器可能性的一种简单方法是在基本SQL命令中使用Like
运算符。如果未选择品牌或型号,只需包含外卡而不是品牌或型号名称:
var baseQuery = "SELECT * FROM Car "
"WHERE MAKE LIKE @MakeFilter AND MODEL LIKE @ModelFilter";
var cmd = new SqlCommand(baseQuery, con);
cmd.Parameters.Add(new SqlParameter(
"@MakeFilter", (string)ddlMake.SelectedValue ?? "%"));
cmd.Parameters.Add(new SqlParameter(
"@ModelFilter", (string)ddlModel.SelectedValue ?? "%"));
答案 1 :(得分:0)
您可以将通用SQL查询分配给这样的字符串:
string query =“SELECT * FROM cars”;
根据用户从下拉列表中的选择,为SQL查询添加条件:
if (ddlMake.SelectedIndex != 0)
{
query = query+" WHERE make='"+ddlMake.SelectedValue+"'"+;
}
if (ddlModel.SelectedIndex != 0)
{
if(query.Contains("WHERE"))
query = query + " AND model='"+ddlModel.SelectedValue+"'";
else
query = query + " WHERE model='"+ddlModel.SelectedValue+"'";
}
希望这有帮助。
答案 2 :(得分:0)
您基本上需要一个基本的表达式构建器。根据他们选择的选项,您将建立一个条件列表。然后你将它们加在一起,并将它们与WHERE子句放在一起。
注意:从用户输入(尤其是公共网页)生成SQL时需要小心。这会让您面临SQL注入的风险。 I recommend looking up parameterized SQL and building SQL commands using parameters.
var parts = new List<string>();
if( criteria.Make.HasValue )
{
parts.Add( string.Format( "make = '{0}'", criteria.Make.Value ) );
}
if( criteria.Model.HasValue )
{
parts.Add( string.Format( "model = '{0}'", criteria.Model.Value ) );
}
query += string.Join( " AND ", parts );