我有一个可用的项目数据库,但可用性因公司而异。大约有10家公司,每家公司都有自己的专栏,如果有可用的话,还有一些比特价值。
这是在Designer中的SharePoint网站上完成的,我无法访问后面的代码。
| PhoneMake | PhoneModel | CompanyA | CompanyB |
|--------------|---------------|-------------|-------------|
| Apple | iPhone 5c | True | False |
| Apple | iphone 5s | True | True |
| Android | Note 3 | False | False |
| Android | Note 4 | False | True |
在我的网页上,我有一个下拉列表来选择您的公司。然后我想让它选择下一级别的过滤(即制造商)
<asp:DropDownList runat="server" id="Company" AutoPostBack="True" EnableViewState="False">
<asp:ListItem></asp:ListItem>
<asp:ListItem Value="CompanyA">Choose A Company</asp:ListItem>
<asp:ListItem Value="CompanyB">Choose B Company</asp:ListItem>
</asp:DropDownList>
我需要选择此下拉列表并将其作为列输入以在我的SqlDataSource中进行过滤。
<asp:SqlDataSource id="SqlDataSource_PhoneMake" runat="server" __designer:commandsync="true" ProviderName="System.Data.SqlClient" ConnectionString="--yada yada--"
SelectCommand="SELECT DISTINCT [PhoneMake] FROM [table] WHERE (([PhoneMake] IS NOT NULL) AND ([@Company] = 'True'))">
<SelectParameters>
<asp:controlparameter ControlID="Company" PropertyName="SelectedValue" Name="Company" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
答案 0 :(得分:1)
请改用以下SelectCommand
:
SELECT DISTINCT [PhoneMake]
FROM [table]
WHERE ([PhoneMake] IS NOT NULL) AND
([CompanyA] = (CASE @Company WHEN 'CompanyA' THEN 1 ELSE [CompanyA] END)) AND
([CompanyB] = (CASE @Company WHEN 'CompanyB' THEN 1 ELSE [CompanyB] END))
要解释上述内容,如果,例如, @Company = 'CompanyA'
然后是WHERE子句中的第3个谓词:
([CompanyB] = (CASE @Company WHEN 'CompanyB' THEN 1 ELSE [CompanyB] END))
成为:
([CompanyB] = [CompanyB])
并因此被忽略。剩下的就是所需的条件:
([PhoneMake] IS NOT NULL) AND ([CompanyA] = 1)
答案 1 :(得分:0)
如果其他人知道更好的方法,那么请加入。
但是如果无法访问后面的代码,我只能想到这样的事情:
<% SqlDataSource_PhoneMake.SelectCommand = String.Format("SELECT DISTINCT [PhoneMake] FROM [table] WHERE (([PhoneMake] IS NOT NULL) AND ({0} = 'True'))", Company.SelectedValue); %>
<asp:SqlDataSource id="SqlDataSource_PhoneMake" runat="server" __designer:commandsync="true" ProviderName="System.Data.SqlClient" ConnectionString="--yada yada--"
SelectCommand="">
</asp:SqlDataSource>
我认为有人可以从技术上改变你在Firebug中的下拉值,并且你可能会对SQL注入开放是一个可能的问题。
因此,如果可能,SQL查询最好使用参数。