Управление необязательными параметрами в предложении WHERE

Я работаю над веб-формой, которая получает строку, содержащую инструкцию SQL-запроса с параметрами SQL. Он генерирует элемент управления ASP.NET для каждого параметра, а затем назначает значение каждого элемента управления параметрам строки запроса SQL, которая будет использоваться SqlCommand для заполнения DataAdapter.

У меня проблемы с настройкой необязательных параметров.

Ex.

1) Передайте строку на страницу:

string query = "SELECT * FROM Table WHERE Field1=@P1 AND field2=@P2";

2) Создайте веб-элемент управления для каждого параметра

TextBox P1 = new TextBox();
P1.ID = "P1";
...
TextBox P2 = new TextBox();
P2.ID = "P2";
...
PanelParameters.Controls.Add(P1);
PanelParameters.Controls.Add(P1);

3) При нажатии передайте значение каждого параметра в SqlCommand как параметры:

SqlCommand cmd = new SqlCommand(query, conn);

cmd.Parameters.AddWithValue("@P1", P1.Text);

cmd.Parameters.AddWithValue("@P2", P2.Text);

4) Вот тут все нормально!

Но если параметр является ДОПОЛНИТЕЛЬНЫМ, как я могу им управлять?

Если P2 был необязательным, пользователь не смог бы его скомпилировать, и в этом случае я не хочу устанавливать P2 = NULL (устанавливая значение параметра DbNull.Value), но я бы хотел, чтобы P2 исчез из запроса SQL.

Можешь мне помочь?

* ОБНОВЛЕНИЕ * Я не могу редактировать полученный запрос, потому что он содержит очень сложные операторы SQL.


person Teo    schedule 11.04.2013    source источник


Ответы (2)


Измените свой запрос на минимум:

string query="SELECT * FROM Table WHERE Field1=@P1

Затем добавьте остальное с условием:

if(P2.Text != "")
{
    cmd.Parameters.AddWithValue("@P2",P2.Text);
    query += " AND field2=@P2";
}
person Luke Marlin    schedule 11.04.2013
comment
Спасибо, это очень хорошая идея, но я не могу изменить запрос, а затем добавить, потому что запрос получен через XML-файл, который я читал, и часто его очень сложно разложить из-за сложности оператора SQL. - person Teo; 11.04.2013
comment
Вы должны обновить свой вопрос, чтобы показать это. Единственное решение, которое я вижу, - это компонент, который анализирует полученный запрос и восстанавливает его. - person Luke Marlin; 11.04.2013

Вы можете попробовать использовать оператор case:

SELECT * FROM Table WHERE Field1=@P1 AND CASE WHEN field2= null OR field2= '' THEN field2 ELSE @P2 END

Вы все равно отправите параметр, но если он пустой или пустой, он будет проигнорирован.

person Arijus Gilbrantas    schedule 11.04.2013
comment
Спасибо, отличный метод, но я не могу изменить получаемый запрос, потому что оператор часто бывает очень сложным, и я не могу с точностью найти все места, где можно вставить части CASE STATEMENT ... - person Teo; 11.04.2013
comment
Можете ли вы запустить запрос после его получения? Сохраните текущие значения в памяти, а затем, если значение не равно нулю в текстовом поле, замените новым. Если текстовое поле пусто, введите значение, которое вы вытащили ранее. - person Arijus Gilbrantas; 15.04.2013