Динамическое предложение 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 В конце концов это произошло из-за глупой ошибки опечатки... после того, как я перестал не использовать запрос параметризации. Я буду одобрять те ответы, которые помогли мне. Я отмечу как ответ, что было ближе, чтобы исправить мою ситуацию, даже если это не исправило мою (глупую) ошибку
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();
Вы не можете использовать предложение (где) с параметрами, вам разрешено использовать только параметры с 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();
Может быть вам нужно
myCommand.CommandText = "SELECT * " +
"FROM TABLE1 WHERE " +
"@whereClause";