2013-05-19 72 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);