动态生成SQL“OR”查询中我有我的asp.net应用程序,其中我动态构建SQL查询我在哪里使用WHERE子句和添加或取决于所输入的字段问题C#

问题描述:

。这里是场景。动态生成SQL“OR”查询中我有我的asp.net应用程序,其中我动态构建SQL查询我在哪里使用WHERE子句和添加或取决于所输入的字段问题C#

我有一个文本框四,出2日期时间

我想在数据库中进行搜索,如果有任何一个文本框中输入一个值,并返回被绑定到一个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注入的护理后,另一种方法

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

+1

使用参数化查询后。你仍然可以用相同的方式构建它,但是将文本框输入直接连接到查询中意味着你很容易受到SQL注入的影响 – 2012-07-16 12:22:13

+2

SQL注入SQL注入SQL注入为什么仍然存在这样的问题? – n8wrl 2012-07-16 12:26:07

+0

我建立这个查询后,正在调用另一个方法,正在照顾SQL注入 – 2012-07-16 12:31:49

您可以设置所有线路有" OR "末(而不是开头),如...

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

,然后使用.ToString()面前......

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

这一个解决了我的问题。 +1 – 2012-07-16 12:50:01

+1

不客气@Patel,很高兴我能帮上忙 - 正如我在这个问题的评论中所说的那样,我会认真考虑在你构建selectQuery之前清理你的输入**,因为它比做它容易得多然后 – freefaller 2012-07-16 12:53:05

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

看起来像你的情况,当查询开始或你的StringBuilder附加这样的查询 SELECT * FROM EMPLOYEE WHERE OR SURNAME = 'SOFT'并直接后的监守无效的或关键字WHERE

+0

多数民众赞成在这里我的观点...我怎么停止或即将到来开始..我正在使用if else看看是否有值,然后加上OR – 2012-07-16 12:30:38

我一般会做这样的;

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或您自己的查询构建类。

+0

如果其中一个字段为空,那么它会在最后加上OR来做这件事。 – 2012-07-16 12:28:11

+0

@ patel.milanb它不会 - 但无论如何,我改变了我的想法和我的回答 – 2012-07-16 12:35:54

你可以做最简单的事情就是改变WHERE到:

WHERE 1=0 

然后确保你所有的WHERE条件开始OR


正如理查德指出然而,这不是最佳实践,你会更好地使用存储过程或LINQ。使用存储过程,你可以通过这些参数的过程,然后像做:

AND (@disName IS NULL OR [email protected]) 
+0

如果你使用所有的“或”,然后从“WHERE 1 = 0”开始(否则1 = 1将接受所有的事情,忽略实际情况)。 – 2012-07-16 12:23:47

+0

@HansKesting好点! – Curt 2012-07-16 12:24:15

+0

@HansKesting编辑后 – Curt 2012-07-16 12:24:31

如果使用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注入攻击的可能性。

+0

可以说,如果disCode存在并且所有三个参数都是空的,那么它将在最后附加OR并将导致错误。 – 2012-07-16 12:26:28

+0

不,它真的不会 – podiluska 2012-07-16 12:27:15

+0

@patel,我怕你错了,它会工作...这是一个不错的解决方案,虽然比绝对必要更复杂 – freefaller 2012-07-16 12:31:41

当你disCode文本框为空,则情况将是“OR DISCOUNTName”这是不对的,你不能用“OR”,其中

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

     } 

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

     } 
+1

我认为OP意识到这一点......这就是为什么他们首先问这个问题 – freefaller 2012-07-16 12:32:56