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的数量?
请告诉我这是否有意义,或者您是否需要更多信息。
答案 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,所以我不再有这个问题了。与往常一样,请务必清理用户输入。
希望这有帮助。