Процедура или функция имеет слишком много аргументов - PullRequest
2 голосов
/ 12 ноября 2011

Я пытаюсь получить значение CategoryID, чтобы я мог вставить это значение в базу данных, когда администратор хочет обновить функции продукта.Написанная хранимая процедура предназначена для ListView, поэтому я надеялся, что смогу что-то спрятать, чтобы получить идентификатор.Когда я поместил скрытое поле на страницу и попытался получить идентификатор, я получил ошибку, о которой упоминал в заголовке.

 <ul id="categories">
        <asp:ListView ID="lvAncestorCategories" runat="server" DataSourceID="dsCategoryAncestors">
            <ItemTemplate>
            <li><%# Eval("CategoryName") %></li>
            <li>
                <asp:HiddenField ID="CategoryID" runat="server" Value='<%# Eval("CategoryID") %>' />
            </li>
            </ItemTemplate>
            <ItemSeparatorTemplate> > </ItemSeparatorTemplate>
        </asp:ListView>
    </ul>


<asp:SqlDataSource ID="dsCategoryAncestors" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>" 
    ProviderName="<%$ ConnectionStrings:ProductsConnectionString.ProviderName %>" 
    SelectCommand="getCategoryAncestorsByProductID" 
    SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:QueryStringParameter Name="ProductID" QueryStringField="id" 
            Type="Int32" />
    </SelectParameters>
    <SelectParameters>
        <asp:QueryStringParameter Name="CategoryID" QueryStringField="id" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

Я не написал хранимую процедуру, поэтому понятия не имею, что это такое.при этом я получил сообщение о том, что у моего списка нет значения @CategoryID, поэтому я добавил его в хранимую процедуру в инструкции SELECT.Не зная, как работает хранимая процедура, я получил ошибку «слишком много аргументов».

Dim featureSql As String = "INSERT INTO Marketing(ProductID, 
MarketingTypeID, MarketingTitle, MarketingData) 
VALUES ( @ProductID, 3, 'Feature', @MarketingData);
UPDATE Product SET ModifyDate = getdate(), 
ModifyUser = @ModifyUser 
WHERE ProductID = @ProductID; 
INSERT INTO Feature (FeatureTitle, CategoryID) 
VALUES (@FeatureTitle, @CategoryID)"

            Using cn As New SqlConnection
            (System.Configuration.ConfigurationManager.ConnectionStrings
            ("LocalSqlServer").ConnectionString)

                Using cmd As New SqlCommand(featureSql, cn)

                    cmd.Parameters.Add(New SqlParameter("@FeatureTitle", txtFeature.Text))
                    cmd.Parameters.Add(New SqlParameter("@CategoryID", CategoryID.Value))
                End Using
            End Using
<asp:SqlDataSource ID="dsCategoryAncestors" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>" 
    ProviderName="<%$ ConnectionStrings:ProductsConnectionString.ProviderName %>" 
    SelectCommand="getCategoryAncestorsByProductID" 
    SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:QueryStringParameter Name="ProductID" QueryStringField="id" 
            Type="Int32" />
    </SelectParameters>
    <SelectParameters>
        <asp:QueryStringParameter Name="CategoryID" QueryStringField="id" Type="Int32"  />
    </SelectParameters>
</asp:SqlDataSource>

Хранимая процедура:

USE [Products]
GO
/****** Object:  StoredProcedure [dbo].[getCategoryAncestorsByProductID]    
Script Date: 11/11/2011 13:28:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[getCategoryAncestorsByProductID]
-- Add the parameters for the stored procedure here
@ProductID int
AS
BEGIN
-- This stored procedure gets all the lineage of a particular category

-- Create a temp table to hold the lineage in order
CREATE TABLE #FamilyTree (
    OrderNumber int,
    CategoryID int,
    CategoryName nvarchar(max)
)

DECLARE @CategoryID nvarchar(max)
SET @CategoryID = 
   (SELECT CategoryID 
    FROM CategoryLink 
    WHERE ProductID = @ProductID)

DECLARE @CategoryName nvarchar(max)
SELECT @CategoryName = CategoryName FROM Category WHERE CategoryID = @CategoryID

-- Insert child category into table first giving it an OrderNumber of 1 
    -- the higher the number, the higher in the tree
INSERT INTO #FamilyTree VALUES (1,@CategoryID,@CategoryName)

-- Use this for the OrderNumber. Increment by 1 for each level.
DECLARE @OrderNumber int
SET     @OrderNumber = 2

-- Use this to hold the new CategoryID to add to the familytree table
DECLARE @AncestorID INT

WHILE (SELECT COUNT(*) FROM Category 
           WHERE CategoryID = 
          (SELECT ParentID FROM Category 
           WHERE CategoryID = @CategoryID)) > 0
BEGIN

    SELECT @AncestorID = CategoryID, @CategoryName = CategoryName 
            FROM Category WHERE CategoryID = 
            (SELECT ParentID FROM Category 
            WHERE CategoryID = @CategoryID)

    INSERT INTO #FamilyTree VALUES (@OrderNumber,@AncestorID,@CategoryName)
    SET @OrderNumber = @OrderNumber + 1
    SET @CategoryID = @AncestorID --Moves to the next CategoryID to see if it
                                            has any parents

END

--Returns Categories in order from Parents to Children
SELECT CategoryName FROM #FamilyTree ORDER BY OrderNumber DESC

DROP TABLE #FamilyTree

END

Это то, что я хочу работать:

Dim featureSql As String = "INSERT INTO Marketing
                            (ProductID, MarketingTypeID, MarketingTitle, MarketingData) 
                            VALUES ( @ProductID, 3, 'Feature', @MarketingData);
                            UPDATE Product 
                            SET ModifyDate = getdate(), ModifyUser = @ModifyUser 
                            WHERE ProductID = @ProductID; 
                            INSERT INTO Feature (FeatureTitle, CategoryID) 
                            VALUES (@FeatureTitle, @CategoryID)"
            Using cn As New SqlConnection
            (System.Configuration.ConfigurationManager.ConnectionStrings
            ("LocalSqlServer").ConnectionString)

                Using cmd As New SqlCommand(featureSql, cn)

                    cmd.Parameters.Add(New SqlParameter("@FeatureTitle", txtFeature.Text))
                    cmd.Parameters.Add(New SqlParameter("@CategoryID", CategoryID.Value))
                End Using
            End Using

1 Ответ

0 голосов
/ 12 ноября 2011

Вам необходимо удалить параметр CategoryID:

<SelectParameters>
    <asp:QueryStringParameter Name="CategoryID" QueryStringField="id" Type="Int32" />
</SelectParameters>

Еще одно примечание: ваша хранимая процедура возвращает только CategoryName, а не CategoryID.Вы сможете исправить это, изменив следующую строку в хранимой процедуре:

SELECT CategoryName FROM #FamilyTree ORDER BY OrderNumber DESC

на

SELECT CategoryName, AncestorID As CategoryID FROM #FamilyTree ORDER BY OrderNumber DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...