2013-10-02 2 views
0

Я пытаюсь выполнить ORDER BY функции в следующей функции поиска:Поисковый фильтр упорядочить по функции не работает

public DataSet SearchTable() 
    { 

     string sql1 = "SELECT * from dbo.Documents1 order by Received_Date"; 

     bool flag = false; 

     if (!txtRef.Text.Equals("")) 
     { 
      if (flag == false) 
      { 
       sql1 = sql1 + " where Ref LIKE N'%" + txtRef.Text + "%'"; 
       flag = true; 

      } 
      else 
      { 
       sql1 = sql1 + " and Ref LIKE N'%" + txtRef.Text + "%'"; 
      } 
     } 

     if (!txtSubject.Text.Equals("")) 
     { 
      if (flag == false) 
      { 
       sql1 = sql1 + " where Subject LIKE N'%" + txtSubject.Text + "%'"; 
       flag = true; 

      } 
      else 
      { 
       sql1 = sql1 + " and Subject LIKE N'%" + txtSubject.Text + "%'"; 
      } 
     } 

Я получаю следующее сообщение об ошибке:

Incorrect syntax near the keyword 'where'. 

Любая идея, как исправить Это? Заранее спасибо.

+1

кстати. вы можете проверить пустую строку с помощью string.IsNullOrEmpty http://msdn.microsoft.com/en-us/library/system.string.isnullorempty.aspx –

+0

Это только я или это кричит SQL Injection ... кто-нибудь? – Jakub

+1

Вместо всех повторных проверок флагов вы можете создать список условий в виде отдельных строк, затем (как только все будет сделано) 'string.Join' с ними и' 'как разделитель и префикс' «ГДЕ». Вы также можете изучить параметры одновременно. –

ответ

2

Вы заказываете до Где. Это не правильный синтаксис SQL.

Попробуйте проделать следующее:

public DataSet SearchTable() 
    { 

     string sql1 = "SELECT * from dbo.Documents1"; 

     bool flag = false; 

     if (!txtRef.Text.Equals("")) 
     { 
      if (flag == false) 
      { 
       sql1 = sql1 + " where Ref LIKE N'%" + txtRef.Text + "%'"; 
       flag = true; 

      } 
      else 
      { 
       sql1 = sql1 + " and Ref LIKE N'%" + txtRef.Text + "%'"; 
      } 
     } 

     if (!txtSubject.Text.Equals("")) 
     { 
      if (flag == false) 
      { 
       sql1 = sql1 + " where Subject LIKE N'%" + txtSubject.Text + "%'"; 
       flag = true; 

      } 
      else 
      { 
       sql1 = sql1 + " and Subject LIKE N'%" + txtSubject.Text + "%'"; 
      } 
     } 

     sql1 = sql1 + " order by Received_Date"; 
+0

Спасибо, jyparask. Сохраняйте хорошую работу. –

+0

Рад помочь ... –

0

Я создал метод разнесенных для возврата SQL-запрос. Предложение «Заказ по» вынимается и добавляется непосредственно перед возвратом запроса. Также удалено условие «else» из первого блока, поскольку оно всегда будет истинным.

public string GetSQL() 
     { 

      string sql1 = "SELECT * from dbo.Documents1"; 

      bool flag = false; 

      if (!txtRef.Text.Equals("")) 
      { 
       sql1 = sql1 + " where Ref LIKE N'%" + txtRef.Text + "%'"; 
       flag = true; 
      } 

      if (!txtSubject.Text.Equals("")) 
      { 
       if (flag == false) 
       { 
        sql1 = sql1 + " where Subject LIKE N'%" + txtSubject.Text + "%'"; 
        flag = true; 

       } 
       else 
       { 
        sql1 = sql1 + " and Subject LIKE N'%" + txtSubject.Text + "%'"; 
       } 
      } 

      sql1 = sql1 + " order by Received_Date"; 

      return sql1; 
     } 
0

Код, который у вас есть, уязвим для SQL Injection.

Во избежание использования, пожалуйста, SqlParameter. Код может выглядеть следующим образом:

public DataSet SearchTable() 
    { 
     string sqlStatement = "SELECT * from dbo.Documents1"; 
     bool flag = false; 

     var reference = "something"; // txtRef.Text 
     var subject = "something else"; // txtSubject.Text 

     var sqlCommand = new SqlCommand(); 

     if (!string.IsNullOrWhiteSpace(reference)) 
     { 
      var referenceParameter = new SqlParameter("@referenceParam", SqlDbType.VarChar, 100) { Value = reference }; 
      sqlCommand.Parameters.Add(referenceParameter); 
      sqlStatement += AddWhereLike("Ref", "@referenceParam", flag); 
      flag = true; 
     } 

     if (!string.IsNullOrWhiteSpace(subject)) 
     { 
      var subjectParameter = new SqlParameter("@subjectParam", SqlDbType.VarChar, 100) { Value = reference }; 
      sqlCommand.Parameters.Add(subjectParameter); 
      sqlStatement += AddWhereLike("Subject", "@subjectParam", flag); 
      flag = true; 
     } 

     sqlStatement += " order by Received_Date"; 

     sqlCommand.CommandText = sqlStatement; 

     // do your database reading here 
    } 

    private static string AddWhereLike(string columnName, string paramId, bool isFirstWhereCondition) 
    { 
     var whereCondition = isFirstWhereCondition ? " where " : " and " + columnName + "LIKE N'%" + paramId + "%' "; 
     return whereCondition; 
    } 
Смежные вопросы