2013-05-19 80 views
0

我想使用下拉列表中的值從SQL Server數據庫中提取數據。SQL Server中的可選查詢參數

我的查詢是

select Age,City,State,Caste,IncomeMin,IncomeMax from Ruser 
where (Age between '" + drplistagemin.SelectedItem + "' and '" + drplistagemax.SelectedItem + "') 
and (Religion= '" + drplistreligion.SelectedItem + "') "); 

我需要了解的是如何構建這個查詢,如果宗教下拉的值是可選的,而不是強制性的?

+1

[SQL注入警報](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 您應該**不**將您的SQL語句連接在一起 - 使用**參數化查詢**來代替以避免SQL注入 –

回答

0

我從來不推薦使用直接指揮方法,但你可以下面的查詢給予嘗試:

SELECT Age,City,State,Caste,IncomeMin,IncomeMax 
FROM Ruser 
WHERE age BETWEEN @minAge AND @maxAge 
AND religion LIKE CASE WHEN @religonVal IS NULL THEN '%' ELSE @religonVal END; 

請注意:您可以使用適當的值從存儲過程的變量。讓我知道它是否按你的意圖工作。

+0

如果我只是從年齡下拉列表中選擇年齡,那麼它不起作用, –

+0

它只有當我選擇下拉列表年齡和宗教 –

+0

時,您需要調整前面的參數選擇結束c#,asp.net其中使用if else條件的選擇。在你的情況下,將'NULL'作爲宗教的默認值。 – Pratik

0

這樣做的一種方法是對宗教使用NULL值,並將其轉換爲%,以便在SQL Server中進行LIKE比較。

另外 - 我會永遠將UI代碼(事件處理程序等)從實際的數據庫訪問代碼中分離出來 - 所以在單獨的DataAccess類中做這樣的事情(而不是直接將代碼隱藏到頁面代碼隱藏中):

public List<RuserResults> GetRuserResults(int minAge, int maxAge, string religion) 
{ 
    string selectStmt = "SELECT Age, City, State, Caste, IncomeMin, IncomeMax FROM Ruser " + 
         "WHERE Age BETWEEN @MinAge AND @MaxAge " + 
         "AND Religion LIKE @religion"; 

    // set up your connection and command objects 
    using(SqlConnection conn = new SqlConnection("--your-connection-string-here--")) 
    using(SqlCommand cmd = new SqlCommand(selectStmt, conn)) 
    { 
     // define the parameters 
     cmd.Parameters.Add("@MinAge", SqlDbType.Int).Value = minAge; 
     cmd.Parameters.Add("@MaxAge", SqlDbType.Int).Value = maxAge; 
     cmd.Parameters.Add("@Religion", SqlDbType.VarChar, 100); 

     // if you passed a value for the method parameter - use that value 
     if(!string.IsNullOrEmpty(religion)) 
     { 
      cmd.Parameters["@Religion"].Value = religion + "%"; 
     } 
     else // if no value was passed - just search for all religions 
     { 
      cmd.Parameters["@Religion"].Value = "%"; 
     } 

     List<RuserResult> results = new List<RuserResult>(); 

     // open connection, run query, close connection 
     conn.Open(); 

     using(SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      while(reader.Read()) 
      { 
       // read the values, convert to a "RuserResults", and pass it back 
       results.Add(ConvertReaderToRuserResult(reader)); 
      } 
     } 

     conn.Close(); 

     // return the results 
     return results; 
    } 
} 

然後從你的ASP.NET頁面,你可以調用這個

int minAge = Convert.ToInt32(drplistagemin.SelectedItem); 
int maxAge = Convert.ToInt32(drplistagemax.SelectedItem); 
string religion = drplistreligion.SelectedItem; 

List<RuserResult> results = GetRuserResults(minAge, maxAge, religion); 

// do something with the results returned here.... 
1

在@Pratik的符號:

SELECT Age,City,State,Caste,IncomeMin,IncomeMax 
FROM Ruser 
WHERE age BETWEEN @minAge AND @maxAge 
AND religion = coalesce(@religion, religion);