2014-01-16 155 views
0

我有6个下拉列表,2个文本框和一个按钮在我的asp.net网页表单应用程序的搜索页面。点击按钮后,我需要将过滤的数据选择到中继器组件。我可以在用户使用SQL Select Command在所有下拉列表中选择一些值时执行此操作。使用下拉列表筛选从数据库中选择

SELECT * FROM Profiles WHERE (Sport = @Sport, Region = @Region, Name LIKE @Name,...) 

但是,当用户留下了一些下拉列表或文本框为空SQL命令不显示任何内容。有谁可以帮助我,如何解决这个问题?

编辑: 我修改了查询,但它仍然不起作用。

SELECT Profiles.ProfileId,Profiles.ProPicUrl, Profiles.Name, Profiles.Specialization, UsersSports.Rating " + _ 
          "FROM Profiles " + _ 
           "JOIN UsersSports ON Profiles.ProfileId = UsersSports.ProfileId " + _ 
           "WHERE (UsersSports.SportId = CASE WHEN @SportId != '' THEN @Sport ELSE UsersSports.SportId END) AND (Region = CASE WHEN @Region != '' THEN @Region ELSE Region END) AND (Specialization = CASE WHEN @Specialization != '' THEN @Specialization ELSE Specialization END)" + _ 
             "AND (Sex = CASE WHEN @Sex != '' THEN @Sex ELSE Sex END) AND ((@AgeFrom IS NOT NULL AND @AgeTo IS NOT NULL AND Age BETWEEN @AgeFrom AND @AgeTo) OR (@AgeFrom IS NULL AND @AgeTo IS NULL AND Age)) " + _ 
             "AND ((@PractiseFrom IS NOT NULL AND @PractiseTo IS NOT NULL AND Practise BETWEEN @PractiseFrom AND @PractiseTo) OR (@PractiseFrom IS NULL AND @PractiseTo IS NULL AND Practise))" + _ 
             "AND ((@Name IS NOT NULL AND Name LIKE '%@Name%') OR (@Name IS NULL AND Name)) AND ((@City IS NOT NULL AND City LIKE '%@City%') OR (@City IS NULL AND City))" + _ 
           "ORDER BY UsersSports.Rating ASC 
+0

另外'LIKE'应该像''%@ Name%''一样使用,否则它就像'='一样工作。 – user2989408

回答

0
SELECT * FROM Profiles WHERE (Sport = ISNULL(@Sport, Sport), Region = ISNULL(@Region, Region), Name LIKE ISNULL(@Name, Name),... 

如果“空”不为空(但说空字符串),那么你必须用例的选项,这样

SELECT * FROM Profiles WHERE (Sport = CASE WHEN @Sport != '' THEN @Sport ELSE Sport END, ... 
+0

在WHERE子句中使用'ISNULL()'函数是不好的做法。 –

2

它应该是如下 - 只是确保当没有选择下拉列表中,该参数设置为NULL

SELECT * FROM Profiles 
WHERE (@Sport IS NULL OR Sport = @Sport) 
    AND (@Region IS NULL OR Region = @Region) 
    AND (@Name IS NULL OR Name LIKE @Name) 
-1

尝试类似如下:

String query = "SELECT * FROM Profiles WHERE"; 

if(ddlSports.SelectedIndex>0) 
    query +=" Sports='"+ddlSports.SelectedValue+"' &"; 

if(!String.IsNullOrEmpty(txtRegion.Text)) 
    query +=" Region='"+txtRegion.Text+"' &" 
.. 
.. 
.. 
and so on 

query = query.TrimEnd('&'); 
+0

你好SQL注入 – Fredou

+0

没有必要使用动态SQL - 这是可能的正则SQL。 –

相关问题