2013-04-11 75 views
2

我正在處理一個Web表單,該表單接收一個包含帶有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中消失。

你能幫我嗎?

*更新* 我無法編輯我收到的查詢,因爲它包含非常複雜的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 2013-04-11 12:53:59

+0

你應該更新你的問題來顯示這個。我看到的唯一解決方案就是分析收到的查詢並重構它的組件。 – 2013-04-11 13:00:41

2

您可以嘗試使用case語句:

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

你仍然發送參數,但如果它爲空或空,它將被忽略。

+0

謝謝你,非常好的方法,但我不能修改我收到的查詢,因爲這個陳述通常非常複雜,我無法精確地找到每個插入CASE STATEMENT部分的地方...... – Teo 2013-04-11 12:58:06

+0

你可以運行收到後查詢?保持內存中的當前值,然後如果文本框中的值不爲空,則替換爲新的值。如果文本框爲空,請將您之前提取的值。 – 2013-04-15 09:55:46