在c#中动态构建SQL“OR”查询

时间:2012-07-16 12:12:19

标签: c# asp.net sql

我的asp.net应用程序出现问题,我正在动态构建SQL查询,我在使用WHERE子句并根据输入的字段添加OR。这是场景。

我有一个四个TextBox,其中2个是DateTime

我想在数据库中搜索任何一个文本框中是否有值并返回绑定到GridView的结果。现在,如果有多个文本框值,那么我也需要添加它并在where子句中构建OR。如果任何一个文本框中没有值,则需要返回所有结果。但我在构建查询时遇到问题,因为我必须通过if else循环来查看是否有任何值或null。这是我的代码。

          StringBuilder selectQuery = new StringBuilder();
          disCode = SearchTextCouponCode.Text;
          disName = SearchTextCouponName.Text;

          if(StartDate.SelectedDate != null)
                 startDate = StartDate.SelectedDate.ToString("yyyy-MM-dd");

          if(EndDate.SelectedDate != null)     
                 endDate = EndDate.SelectedDate.ToString("yyyy-MM-dd");


          // here is the main thing where i am getting the error
          if (!string.IsNullOrEmpty(disCode))
          {
                 selectQuery.Append("DISCOUNTCode = '" + disCode + "'");

          }

          if (!string.IsNullOrEmpty(disName))
          {
                 selectQuery.Append(" OR DISCOUNTName = '" + disName + "'");

          }

          if (startDate != "0001-01-01")
          {
                 selectQuery.Append(" OR StartDate = '" + startDate + "'");

          }

          if(endDate != "0001-01-01")
                 selectQuery.Append(" OR EndDate = '" + endDate + "'");


          // I am using Object Data Source and the method i am passing is taking care of the SQL injection     
          DataSourceDis.SelectParameters["sqlCriteria"].DefaultValue = selectQuery.ToString();
          GridDis.DataBind();

现在,当我运行应用程序,并将disCode文本框保留为空时,查询以OR开头并给出错误语法附近的错误..

请帮忙。

/////////////////////////////////////////////// //////////

我在构建这个正在处理SQL注入的查询后调用另一个方法

/////////////////////////////////////////////// //////////

6 个答案:

答案 0 :(得分:3)

您可以做的最简单的事情是将WHERE更改为:

WHERE 1=0

然后确保所有WHERE条件都以OR

开头

正如Richard所指出的那样,这不是最佳实践,您最好使用存储过程或LINQ。使用存储过程,您可以将所有这些参数传递给过程,然后执行以下操作:

AND (@disName IS NULL OR DiscountName=@disName)

答案 1 :(得分:1)

我一般都是这样做的;

var conds = new List<string> ();

     // here is the main thing where i am getting the error
      if (!string.IsNullOrEmpty(disCode))
      {
             conds.Add("DISCOUNTCode = '" + disCode + "'");
      }

      if (!string.IsNullOrEmpty(disName))
      {
             conds.Add("DISCOUNTName = '" + disName + "'");
      }

      if (startDate != "0001-01-01")
      {
             conds.Add("StartDate = '" + startDate + "'");
      }

      if(endDate != "0001-01-01")
             conds.Add("EndDate = '" + endDate + "'");

     selectQuery.Append(String.Join(" OR ",conds));

这样构建查询有点可怕 - 最好使用预处理语句或LINQ或您自己的查询构建类。

答案 2 :(得分:1)

您可以将所有行设置为最后(而不是开头)" OR ",例如......

selectQuery.Append("DISCOUNTCode = '" + disCode + "' OR ");

然后在使用.ToString()之前......

if(selectQuery.Length > 0)
{
  selectQuery.Length -= 4;
}

答案 3 :(得分:1)

如果您使用WHERE 1=0 OR解决方案,可能会对性能产生影响。

我建议创建一个变量来标记连接并在添加条件时更改它

string conjuction = " ";
if (!string.IsNullOrEmpty(disCode)) 
{ 
             selectQuery.Append(conjunction);
             selectQuery.Append("DISCOUNTCode = '" + disCode + "'"); 
             conjuction = " OR ";              
} 

if (!string.IsNullOrEmpty(disName)) 
{ 
             selectQuery.Append(conjunction);
             selectQuery.Append("DISCOUNTName = '" + disName + "'"); 
              conjuction = " OR ";
} 

我不知道您的输入来自哪里,但请注意当前代码中可能存在SQL注入攻击。

答案 4 :(得分:0)

有效的Sql查询e.g. SELECT * FROM EMPLOYEE WHERE Name = 'Hat' OR SURNAME = 'SOFT'

在查询以OR开头时看起来像你的情况你的StringBuilder像这样追加查询 SELECT * FROM EMPLOYEE WHERE OR SURNAME = 'SOFT'及其无效是因为在WHERE

之后直接使用OR KEYWORD

答案 5 :(得分:0)

当您的disCode文本框为空时,条件将为“OR DISCOUNTName”,这是错误的,您不能在其后使用“或”

     if (!string.IsNullOrEmpty(disCode))
      {
             selectQuery.Append("DISCOUNTCode = '" + disCode + "'");

      }

      if (!string.IsNullOrEmpty(disName))
      {
             selectQuery.Append(" OR DISCOUNTName = '" + disName + "'");

      }