2015-01-05 20 views
0

我有一个可用项目的数据库,但可用性因公司而异。大约有10家公司,每个公司都有自己的专栏,如果可以提供给他们,这些公司有一定的价值。ASP.NET SqlDataSource查找变量列名

这是在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

您所做的尝试面临的问题是什么? –

+0

它不起作用。当你做出选择时会抛出错误。 – user3320324

+0

原因是您无法使用参数来定义查询中使用的列。参数只能用于在where子句的谓词中定义列值。 –

回答

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子句中的第三谓词:

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

变为:

([CompanyB] = [CompanyB]) 

并因此忽略。什么是左正好需要的条件是:

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

这正是我想要的。谢谢!! – user3320324

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

+0

我的回答提出的查询怎么样? –

+0

@GiorgosBetsos如果他可以得到它的工作,那么你的解决方案比我的要好得多。我只是不确定数据源是否会接受它,而不会给出他已经面临的同样的错误。 – prospector