2015-01-05 4 views
0

У меня есть база данных доступных товаров, но доступность зависит от компании. Есть около 10 компаний, каждая из которых имеет свой собственный столбец и имеет битовую ценность, если она доступна для них.ASP.NET SqlDataSource имя столбца переменной поиска

Это выполняется на сайте SharePoint в Designer, и у меня нет доступа к коду.

| 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 Injection, это может быть опасно.

Так что SQL-запрос был бы лучше всего с параметром, если это возможно.

+0

Как насчет запроса, предложенного моим ответом? –

+0

@GiorgosBetsos, если он может заставить его работать, значит, вы гораздо лучше, чем мое. Я просто не уверен, что DataSource примет его, не дав той же самой ошибки, с которой он уже сталкивается. – prospector

Смежные вопросы