Динамическое предложение where в параметре

В настоящее время я пытаюсь создать предложение where для SqlCommand.

что-то похожее на это

myCommand.CommandText = "SELECT * " +
                        "FROM TABLE1 " + 
                        "@whereClause";
//I build up the where clause with a StringBuilder
myCommand.Parameters.AddWithValue("@whereClause" theClause.ToString());

Но не похоже, что это возможно. Я получил исключение:

SqlException Неверный синтаксис рядом с '@whereClause'

Причина, по которой я хочу сделать что-то подобное, заключается в том, что я хочу избежать вызова X к базе данных, и таким образом я оставляю сортировку и фильтрацию на сервере.

Есть ли способ сделать что-то подобное?

/edit : предложение where будет выглядеть примерно так WHERE (TABLE1.COL1 = 'the value' OR TABLE1.COL1 = 'another value' OR TABLE1.COL1 = 'this value' ... )

/edit Наконец, это произошло из-за глупой опечатки... после того, как я изменился, чтобы не использовать параметризовать запрос. Я поддержу тот ответ, который помог мне. Я отмечу как ответ то, что было ближе к исправлению моей ситуации, даже если это не исправило мою (глупую) ошибку


person Rémi    schedule 01.10.2013    source источник
comment
Как выглядит ваш myCommand при отладке?   -  person Soner Gönül    schedule 01.10.2013
comment
@whereClause, вероятно, будет заключен в кавычки, потому что это строка. Почему бы вам не использовать myCommand.CommandText = "SELECT * " + "FROM TABLE1 " + theClause.ToString(); Кроме того, theClause имеет префикс WHERE?   -  person Jeroen van Langen    schedule 01.10.2013
comment
что возвращает theClause.ToString()?   -  person Microsoft DN    schedule 01.10.2013
comment
Я не понимаю связи между динамическим sql и я хочу избежать обращения X к базе данных, и таким образом я оставляю сортировку и фильтрацию на сервере.   -  person Tim Schmelter    schedule 01.10.2013
comment
@Jeroen Я бы рекомендовал не создавать такие строки SQL, потому что это увеличивает риск внедрения SQL.   -  person Andrew    schedule 01.10.2013
comment
@Andrew, обычно для параметров да. Но это не параметры, поэтому ответственность за макет запроса лежит в другом месте.   -  person Jeroen van Langen    schedule 01.10.2013


Ответы (3)


Кажется, вы пытаетесь добавить все предложение WHERE в качестве параметра - это не сработает!

Итак, предположим, вам нужно построить что-то вроде этого

SELECT * from TABLE1 WHERE Field1=@Field1Value and Field2=@Field2Value

И предполагая

  • у вас есть List<WhereField> полей для включения в предложение WHERE
  • и что все предложения объединены И вместе
  • а WhereField выглядит примерно так

public class WhereField
{
   public string FieldName{get;set;}
   public object FieldValue{get;set;}
   public string ComparisonOperator{get;set;}
}

то у вас есть что-то вроде этого:

var whereClause = new StringBuilder();
    foreach (var field in WhereFields)
    {
     whereClause.Append(field.FieldName)
     .Append(field.ComparisonOperator)
     .Append("@")
     .Append(field.FieldName).Append("Value")
     .Append (" AND ");
//add the parameter as well:
    myCommand.Parameters.AddWithValue("",field.FieldName+"Value");
    }
 //cleanly close the where clause
whereClause.Append("1=1");

И теперь вы можете выполнить

myCommand.CommandText = "SELECT * " +
                        "FROM TABLE1 WHERE " + whereClause.ToString();
person Stephen Byrne    schedule 01.10.2013
comment
так как я всегда проверяю одно и то же поле, я не уверен, что это сработает. Проверьте редактирование моего вопроса, чтобы увидеть, как будет выглядеть предложение where. - person Rémi; 01.10.2013
comment
@im_a_noob, вы можете просто изменить приведенный выше пример кода, добавив OR вместо AND, и в этом случае каждый объект в List‹WhereField› (это всего лишь пример того, как вы могут представить эти данные) будет иметь одно и то же свойство FieldName — имейте в виду, что это не решение для копирования и вставки, а просто пример того, как вы можете создать предложение. Суть заключалась в том, чтобы не пытаться поместить все предложение WHERE в параметр - вам нужно иметь две отдельные части - SQL и сами фактические параметры... - person Stephen Byrne; 01.10.2013

Вы не можете использовать предложение (where) с параметрами, вам разрешено использовать параметры только с command.Parameters.

Чтобы построить динамическое предложение Where, вы должны построить свой запрос на основе условий и конкатенации строк, а затем добавить соответствующие параметры.

Что-то типа:

sb.Append("SELECT * FROM TABLE1 ");

if (someCondition)
{
    sb.Append("WHERE XColumn = @XColumn");
    myCommand.Parameters.AddWithValue("@XColumn", "SomeValue");
}
else
{
    sb.Append("WHERE YColumn = @YColumn");
    myCommand.Parameters.AddWithValue("@YColumn", "SomeOtherValue");
}
myCommand.CommandText = sb.ToString();
person Habib    schedule 01.10.2013

Может быть, вам нужно

myCommand.CommandText = "SELECT * " +
                        "FROM TABLE1 WHERE " + 
                        "@whereClause";
person Microsoft DN    schedule 01.10.2013
comment
Что если у @whereClause есть еще WHERE ? - person Soner Gönül; 01.10.2013
comment
Именно это мой вопрос, что возвращает theClause.ToString()!! - person Microsoft DN; 01.10.2013