ASP.NET SqlDataSource 查找变量列名

ASP.NET SqlDataSource lookup variable column name

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

在我的网页上,我有一个 select 贵公司的下拉菜单。然后我希望它 select 下一级过滤(即制造商)

<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>

我需要获取此下拉列表的 selection 并将其作为要在我的 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>

改为使用以下 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 子句中的第三个谓词:

 ([CompanyB] = (CASE @Company WHEN 'CompanyB' THEN 1 ELSE [CompanyB] END))

变成:

([CompanyB] = [CompanyB])

因此被忽略。剩下的正是需要的条件:

 ([PhoneMake] IS NOT NULL) AND ([CompanyA] = 1)

如果其他人知道更好的方法,请补充。

但是没有访问到背后的代码我只能想到这样的事情:

 <% 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 查询最好带有参数。