2013-04-11 4 views
2

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

У меня есть некоторые проблемы для управления дополнительными параметрами.

Ex.

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

string query = "SELECT * FROM Table WHERE [email protected] AND [email protected]"; 

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 ,

Вы можете мне помочь?

* UPDATE * Я не могу отредактировать запрос, который я получаю, потому что он содержит очень сложные операторы SQL.

ответ

5

Изменить запрос к минимуму:

string query="SELECT * FROM Table WHERE [email protected] 

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

if(P2.Text != "") 
{ 
    cmd.Parameters.AddWithValue("@P2",P2.Text); 
    query += " AND [email protected]"; 
} 
+0

Спасибо, что это очень хорошая идея, но я не могу изменить запрос, а затем добавить, потому что запрос получен через XML-файл, который я читаю, и часто его очень сложно разложить из-за сложности инструкции SQL. – Teo

+0

Вы должны обновить свой вопрос, чтобы показать это. Единственное решение, которое я вижу тогда, - это компонент, который анализирует полученный запрос и реконструирует его. –

2

Вы можете попробовать использовать случай заявление:

SELECT * FROM Table WHERE [email protected] AND CASE WHEN field2= null OR field2= '' THEN field2 ELSE @P2 END 

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

+0

Спасибо, очень отличный метод, но я не могу изменить запрос, который я получаю, потому что оператор часто очень сложный, и я не могу с точностью точно определить места, где нужно вставлять детали CASE STATEMENT ... – Teo

+0

Можете ли вы запустить запрос после его получения? Удерживайте текущие значения в памяти, а затем, если значение не равно null в текстовом поле, замените его новым. Если текстовое поле пуст, поместите ранее выведенное значение. –

Смежные вопросы