Я пытаюсь получить значение 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