2012-02-22 58 views
0

目前,我有:過濾事件 - SQL

 
public static IList getFilteredEvents( DateTime Start, DateTime End, string env, string req) { 
    string QueryString; 
    if(env == "all") { 
     QueryString = "SELECT * FROM table WHERE date BETWEEN '" + Start + "' AND '" + END + "'"; 
    } else { 
     QueryString = "SELECT * FROM table WHERE date BETWEEN '" + Start + "' AND '" + END + "' AND env='" + env + "'"; 
    } 
} 

我做傳遞一個數據對象從視圖獲取請求字符串。在我的控制器中,我這樣得到它: string env = Request.QueryString["filter"];

是否有更好的方法來篩選我的結果,而不必在if-elseif鏈中編寫多個查詢?我將如何實現這個多個過濾器,例如在查詢AND req = '" + req + "';

感謝您的幫助!

+4

無關,但它聽起來像我只是在這裏要求一個SQL注入攻擊。 – 2012-02-22 17:40:07

+0

這只是一個簡單的例子,但是,我知道這很容易受到SQL攻擊:]。 – 2012-02-22 17:52:15

+0

(在我看來)關於這個的權威性文章是Erland Sommarskog的[T-SQL中的動態搜索條件](http://www.sommarskog.se/dyn-search.html) – 2012-02-22 18:13:11

回答

1

您可以在if-else附加AND s。例如,

QueryString = "SELECT * FROM table WHERE date BETWEEN '" + Start + "' AND '" + END + "'"; 
if (env == "all") 
{   
    QueryString += " AND (env IS NULL OR env=env)"; 
    //if env cannot be null, than you just need " AND env=env" 
} 
else 
{ 
    QueryString += "' AND (env='" + env + "')"; 
} 

而且最好使用StringBuilder來構建動態字符串;

1

你真的打開自己的SQL注入按照評論。希望你會改變這個參數化的proc /對所使用的值做一些驗證。

內SQL然後你可以這樣做:

AND (@env = 'all' OR env = @env) 

如果你堅持使用動態SQL住:

string envWhere = (env == "all") ? "" : " AND env = '" + env + "'"; 

然後串連這主要SQL字符串