多选项搜索的语法

时间:2012-04-18 23:14:14

标签: c# asp.net sql syntax

ASP.NET 4.0,Web表单,C#,SQL

我几乎有类似于您在约会网站上看到的搜索表单。多个下拉框,每个ddbox都有特定值以及“任意”值。我想不出一个简单的方法来创建这个语法在下面的例子之外,c#代码隐藏按钮点击事件中的很多其他if语句:

if
= && = && =
else if<br/>
= && = && !=
else if<br/>
= && != && != 
else if<br/>
!= && = && !=

...这里是与选定值相同的序列

if
Any && Any && Any
else if
Any && Any && Not Any
else if
Any && Not Any && Not Any
else if
Not Any && Any && Not Any

这一直持续到我遍历所有场景。在按钮上单击后面的代码将获取所选值并决定要执行的查询。似乎导致头痛的是ddbox中的值“any”。是否有一种首选的方法来构造c#或sql语法以减少else的数量?

请告诉我这是否有意义,或者您是否需要更多信息。

2 个答案:

答案 0 :(得分:2)

我会写这样的东西:

create procedure usp_search (
    @param1 varchar(50) = null
   ,@param2 carchar(50) = null
) as
begin
    select field1
          ,field2
          ,field3
          ,fieldN
      from table t with(nolock)
     where ((@param1 is null) or (t.fieldX == @param1))
       and ((@param2 is null) or (t.fieldY == @param2))
end

然后在你的客户端上你喜欢

//code
var connection = new SqlConnection("connection_string");
var command = new SqlCommand();
command.Connection = connection;
command.CommandText = "usp_Search";
command.CommandType = CommandType.StoredProcedure;
if((string.IsNullOrEmpty(stringVariable1)) || (stringVariable2.ToLower().Equals("any"))) {
    command.Parameters.Add("@param1", SqlType.VarChar, 50).Value = DBNull.Value;
} else {
    command.Parameters.Add("@param1", SqlType.VarChar, 50).Value = stringVariable1;
}
if((string.IsNullOrEmpty(stringVariable2)) || (stringVariable2.ToLower().Equals("any"))) {
    command.Parameters.Add("@param2", SqlType.VarChar, 50).Value = DBNull.Value;
} else {
    command.Parameters.Add("@param2", SqlType.VarChar, 50).Value = stringVariable2;
}
// code

这些方面的东西......这样你的搜索查询可以检索过滤或未过滤的结果..当然你必须注意这类查询的一些陷阱

编辑:仅在C#代码中完成同样的事情就是这样:

var sb = new StringBuilder();
sb.Append("select field1 ,field2, field3, fieldN ");
sb.Append("from table t with(nolock) ");
sb.Append("where ((@param1 is null) or (t.fieldX == @param1))");
sb.Append("and ((@param2 is null) or (t.fieldY == @param2))");

var connection = new SqlConnection("connection_string");
var command = new SqlCommand();
command.Connection = connection;
command.CommandText = sb.ToString();
command.CommandType = CommandType.Text;
if((string.IsNullOrEmpty(stringVariable1)) || (stringVariable2.ToLower().Equals("any"))) {
    command.Parameters.Add("@param1", SqlType.VarChar, 50).Value = DBNull.Value;
} else {
    command.Parameters.Add("@param1", SqlType.VarChar, 50).Value = stringVariable1;
}
if((string.IsNullOrEmpty(stringVariable2)) || (stringVariable2.ToLower().Equals("any"))) {
    command.Parameters.Add("@param2", SqlType.VarChar, 50).Value = DBNull.Value;
} else {
    command.Parameters.Add("@param2", SqlType.VarChar, 50).Value = stringVariable2;
}

答案 1 :(得分:0)

首先,我建议在下一个项目中使用ORM,因为动态sql在应用程序设计方面有很多这样的警告。

那就是说,我处理这个问题的方法是在括号内放置任何可选的搜索词,这样我就可以这样做:

(SomeField ='Blah'OR 1 = 1)

请记住,我并不是说这是一个很好的解决方案,但它确实可以减少嵌套语句的数量,因为您可以按顺序构造SQL语句。

请考虑以下代码:

SQL = "SELECT CompanyName, CompanyState FROM Companies WHERE ";
SQL += "(CompanyName = '" & CompanyName & "' " + (CompanyName == "AnyKey" ? " OR 1=1" : "") + ") ";
SQL += "(CompanyState = '" & CompanyState & "' " + (CompanyState == "AnyKey" ? " OR 1=1" : "") + ") ";

同样,我强调这不应该被认为是好的。我已经转移到ORM,所以我不再有这个问题了。与往常一样,请务必清理用户输入。

希望这有帮助。