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