Должен объявить скалярную переменную, vb.net - PullRequest
0 голосов
/ 22 октября 2011

Я некоторое время отлаживал свой код и просматривал посты на других форумах, но похоже, что у всех есть проблемы, отличные от моей, и то, что работает для них, не будет работать для меня.

Мой выпадающий список должен фильтровать сетку, выбирая все компании, связанные с определенным продуктом. Решение, которое я нашел в Интернете, состоит в том, что у большинства людей не было DataKeyNames, установленного в их gridview.

У меня есть этот набор, но не для CompanyID. Это не имеет никакого смысла. Так что я понятия не имею, что я должен делать, так как это единственный ответ, который я нашел.

<asp:DropDownList ID="ddlCompany" runat="server" DataSourceID="dsCompanyFilter"  
DataTextField="CompanyName" DataValueField="CompanyID" AppendDataBoundItems="true" 
AutoPostBack="true">

Protected Sub ddlCompany_SelectedIndexChanged(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles ddlCompany.SelectedIndexChanged
    Dim CompanyID As Integer = ddlCompany.SelectedValue
    dsProductLookup.SelectCommand = "SELECT ProductName, CompanyID, CompanyName 
                                    FROM Product, Company 
                                    WHERE CompanyID = @CompanyID 
                                    ORDER BY ProductName"
    dsProductLookup.SelectParameters.Add("@CompanyID", ddlCompany.SelectedValue)
End Sub

<asp:gridview id="gvProducts" runat="server" AutoGenerateColumns="false" 
datakeynames="ProductID" datasourceid="dsProductLookup" style="margin-top: 12px;">

<asp:sqldatasource id="dsProductLookup" runat="server" 
Connectionstring="<%$ ConnectionStrings:ProductsConnectionString %>"
SelectCommand="SELECT ProductID, ProductName FROM [Product] ORDER BY [ProductName]">
</asp:sqldatasource>

<asp:SqlDataSource ID="dsCompanyFilter" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>" 
    SelectCommand="SELECT [CompanyName], [CompanyID] FROM [Company] ORDER BY CompanyName">
</asp:SqlDataSource>

ОБНОВЛЕНИЕ : Я попытался добавить это на другую страницу моего сайта, и у меня возникла та же ошибка объявления. Must declare the scalar variable "@CompanyID".

Choose Company: <asp:DropDownList ID="ddlCompany" runat="server" DataSourceID="dsCompanyFilter"  DataTextField="CompanyName" DataValueField="CompanyID" AppendDataBoundItems="true" AutoPostBack="true">
<asp:ListItem Enabled="true" Text="Select an option"></asp:ListItem>
</asp:DropDownList>


<asp:gridview id="gvCategories" runat="server" AutoGenerateColumns="False"
 datakeynames="CategoryID,CompanyID" datasourceid="dsCategoryLookup" emptydatatext="No 
 categories/products found." style="margin-top: 12px;">
<Columns>
    <asp:BoundField HeaderText="Category Name" DataField="CategoryName" />
    <asp:HyperLinkField DataNavigateUrlFields="ProductID" 
    DataNavigateUrlFormatString="Product/Default.aspx?ID={0}"
    DataTextField="ProductName" 
    HeaderText="Product Name" />
</Columns>
</asp:gridview>

<asp:SqlDataSource ID="dsCategoryLookup" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>" 
    SelectCommand="SELECT DISTINCT c.CategoryName, c.CategoryID, p.ProductName, 
                   p.ProductID, cl.CompanyID, cl.ProductID, co.CompanyID 
                   FROM Category AS c 
                   INNER JOIN CategoryLink AS l ON l.CategoryID = c.CategoryID 
                   INNER JOIN Product AS p ON p.ProductID = l.ProductID 
                   LEFT JOIN CompanyLink AS cl ON cl.ProductID = p.ProductID">
</asp:SqlDataSource>
<asp:SqlDataSource ID="dsCompanyFilter" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>" 
    SelectCommand="SELECT [CompanyName], [CompanyID] 
                   FROM [Company] 
                   ORDER BY CompanyName">
</asp:SqlDataSource>



 Protected Sub ddlCompany_SelectedIndexChanged(ByVal sender As Object, ByVal e As 
 System.EventArgs) Handles ddlCompany.SelectedIndexChanged
    dsCategoryLookup.SelectCommand = "SELECT Category.CategoryName, 
                                     CategoryLink.ProductID, Company.CompanyName, 
                                     Company.CompanyID, CompanyLink.CompanyID AS Expr1,
                                     Product.ProductName, Product.ProductID, 
                                     CompanyLink.ProductID AS Expr2 
                                     FROM Company 
                                     LEFT JOIN CompanyLink 
                                     ON Company.CompanyID = CompanyLink.CompanyID 
                                     LEFT JOIN Product 
                                     ON CompanyLink.ProductID = Product.ProductID 
                                     LEFT JOIN CategoryLink 
                                     ON CategoryLink.ProductID = Product.ProductID 
                                     LEFT JOIN Category  
                                     ON CategoryLink.CategoryID = Category.CategoryID
                                     WHERE Company.CompanyID = @CompanyID 
                                     ORDER BY Product.ProductName"

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Мне удалось найти ответ на форуме ASP.net, который работает с моим сайтом. (Пока ...)

Protected Sub ddlCompany_SelectedIndexChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles ddlCompany.SelectedIndexChanged
    dsProductLookup.SelectCommand = "SELECT Company.CompanyName, Company.CompanyID,
                                     CompanyLink.CompanyID AS Expr1,
                                     Product.ProductName, Product.ProductID,
                                     CompanyLink.ProductID AS Expr2 
                                     FROM Company 
                                     INNER JOIN CompanyLink ON Company.CompanyID = CompanyLink.CompanyID 
                                     INNER JOIN Product ON CompanyLink.ProductID =                               Product.ProductID 
                                     WHERE Company.CompanyID = @CompanyID 
                                     ORDER BY Product.ProductName"

dsProductLookup.SelectParameters.Clear()

    Dim controlParam As ControlParameter = New ControlParameter
    controlParam.ControlID = "ddlCompany"
    controlParam.DefaultValue = "-1"
    controlParam.Name = "CompanyID"
    controlParam.PropertyName = "SelectedValue"
    controlParam.Type = TypeCode.Decimal

    dsProductLookup.SelectParameters.Add(controlParam)
End Sub
0 голосов
/ 22 октября 2011

Вместо установки параметра в выделенном фрагменте кода добавьте ControlParameter в разметку для элемента управления источником данных.

<SelectParameters>
    <asp:ControlParameter ControlID="ddlCompany" PropertyName="SelectedValue" DbType="Int32" DefaultValue="0" />
</SelectParameters>

Учитывая ваше описание, я думаю, что вышеизложенное должно решить вашу проблему, но если нет, то не стоит отчаиваться от добавления CompanyID в качестве ключа данных.Просто не забудьте включить CompanyID в качестве столбца в операторе выбора dsProductLookup.

РЕДАКТИРОВАТЬ

Похоже, я пропустил имя параметра в предыдущем ответе,Вместо этого попробуйте что-то вроде этого:

<SelectParameters>
    <asp:ControlParameter Name="CompanyID" ControlID="ddlCompany" PropertyName="SelectedValue" Type="Int32" DefaultValue="0" />
</SelectParameters>

Как я уже сказал, я не использую элементы управления источниками данных, поэтому я не уверен, нужно ли добавлять префикс имени параметра к @ или нет, но есливы делаете:

<SelectParameters>
    <asp:ControlParameter Name="@CompanyID" ControlID="ddlCompany" PropertyName="SelectedValue" Type="Int32" DefaultValue="0" />
</SelectParameters>
...