-2

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

我有一个四个文本框,其中 2 个是 DateTime

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

          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 开头,并给出错误,即 where ..附近的语法不正确

请帮忙。

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

我在建立这个负责 SQL 注入的查询后调用另一个方法

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

4

6 回答 6

3

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

WHERE 1=0

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


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

AND (@disName IS NULL OR DiscountName=@disName)
于 2012-07-16T12:20:14.270 回答
1

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

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

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

if(selectQuery.Length > 0)
{
  selectQuery.Length -= 4;
}
于 2012-07-16T12:21:51.820 回答
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 或您自己的查询构建类。

于 2012-07-16T12:18:09.517 回答
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 注入攻击。

于 2012-07-16T12:23:44.550 回答
0

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

当查询以 OR 开头时,您的情况看起来像您的 StringBuilder 附加这样的查询 SELECT * FROM EMPLOYEE WHERE OR SURNAME = 'SOFT'及其无效,因为 OR KEYWORD 直接在 WHERE 之后

于 2012-07-16T12:17:50.480 回答
0

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

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

      }

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

      }
于 2012-07-16T12:26:40.797 回答