【问题标题】:Must declare scalar variable, vb.net必须声明标量变量,vb.net
【发布时间】:2011-10-26 03:09:34
【问题描述】:

一段时间以来,我一直在调试我的代码并查看其他论坛的帖子,但似乎每个人的问题都与我不同,对他们有用的方法对我不起作用。

我的下拉列表应该通过选择与特定产品关联的所有公司来过滤网格视图。我在网上找到的解决方案是大多数人没有在他们的 gridview 中设置 DataKeyNames。

我确实有这个设置,但没有到 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"

【问题讨论】:

    标签: asp.net vb.net declaration scalar


    【解决方案1】:

    不要在代码隐藏中设置参数,而是在数据源控件的标记中添加ControlParameter

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

    根据您的描述,我认为以上内容应该可以解决您的问题,但如果没有,您也不应该因为添加 CompanyID 作为数据键而气馁。请记住在dsProductLookup 的选择语句中包含CompanyID 作为一列。

    编辑

    看起来我在上一个答案中省略了参数名称。试试这样的:

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

    【讨论】:

    • 我尝试将其添加到 dsCompanyFilter 数据源中,但出现错误提示 Input string was not in a correct format.
    • 我在我的另一个页面上添加了一个下拉列表并且再次遇到标量问题,但是这次我添加了 CompanyID 作为数据键并将 CompanyID 包含在 select 语句中。我尝试使用您拥有的 SelectParameters 代码,但它给出了与上述相同的错误。输入字符串....我不想启动一个新线程,因为它或多或少是相同的错误。你能帮忙吗?
    • 两者有什么不同,您收到的错误是什么?
    • 我用第二页的代码编辑了原始帖子,错误为Must declare the scalar variable @CompanyID
    • 为什么选择的索引发生变化时要更新select语句?你不应该这样做。我不使用数据源控件,但您应该可以在 GridView 上调用 Databind()
    【解决方案2】:

    我能够在适用于我的网站的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多