ASP.NET SqlDataSource查找变量列名

时间:2015-01-05 22:22:16

标签: sql asp.net

我有一个可用的项目数据库,但可用性因公司而异。大约有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>

2 个答案:

答案 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查询最好使用参数。