C# SQLDataSource=“过程或函数[Name]指定的参数太多。”

C# SQLDataSource=“过程或函数[Name]指定的参数太多。”,c#,sql-server,devexpress,sqldatasource,treelist,C#,Sql Server,Devexpress,Sqldatasource,Treelist,我不确定是它的asp:SqlDataSource控件还是我正在使用的DevExpress中的ASPxTreeList,但在尝试使用Insert方法启动存储过程时,我遇到了一个奇怪的错误 添加节点时,我尝试将节点插入数据库 protected void TagList_NodeInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { SqlDataTagging.Inser

我不确定是它的asp:SqlDataSource控件还是我正在使用的DevExpress中的ASPxTreeList,但在尝试使用Insert方法启动存储过程时,我遇到了一个奇怪的错误

添加节点时,我尝试将节点插入数据库

   protected void TagList_NodeInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e)
    {
        SqlDataTagging.InsertCommandType = SqlDataSourceCommandType.StoredProcedure;
        SqlDataTagging.InsertParameters.Add("ParentID", e.NewValues["ParentTag_ID"].ToString());
        SqlDataTagging.InsertParameters.Add("TagName", e.NewValues["TagName_VC"].ToString());
        SqlDataTagging.InsertParameters.Add("UserID", "1");

        SqlDataTagging.InsertCommand = "sp_InsertTag";

        SqlDataTagging.Insert();
    }
然而,当我触发上面的代码时,我得到了这个错误

过程或函数sp_InsertTag指定的参数太多

我的SP头

ALTER PROCEDURE [dbo].[sp_InsertTag] (@ParentID INT, @TagName VARCHAR(100), @UserID int)
但是正如您所看到的,SP中有3个参数,C代码中有3个参数

奇怪的是,如果我真的通过文本运行SQL,例如

SqlDataTagging.InsertCommandType = SqlDataSourceCommandType.Text; 
然后用C写SQL,它会工作的

有没有人有什么想法或其他选择让我可以使用存储过程

感谢

假设您有ID为SqlDataTagging的SqlDataSource来填充树节点,如果方法多次激发,则会发生错误,因此在某一点上,InsertParameters集合会填充存储过程中指定的3个以上的参数

为了缓解这种行为,我建议您在添加以下参数之前清除InsertParameters集合:

...
SqlDataTagging.InsertCommandType = SqlDataSourceCommandType.StoredProcedure;
SqlDataTagging.InsertParameters.Clear(); // add this line to clear InsertParameters collection before adding parameters
SqlDataTagging.InsertParameters.Add("ParentID", e.NewValues["ParentTag_ID"].ToString());
SqlDataTagging.InsertParameters.Add("TagName", e.NewValues["TagName_VC"].ToString());
SqlDataTagging.InsertParameters.Add("UserID", "1");
...
相关问题:


类似的方法

小心sp_uuuuu前缀:感谢您的警告,当我更改名称时仍然会出现相同的错误,但需要在将来考虑。发生这种情况时是否会再次调用标记列表_uuuuuunodeinserting?如果是,它是同一个参数集合对象吗?如果是这样,您是否在通话前清理收款?即使您正在清除集合,也要实例化一个新的集合。否,存储过程实际上会触发,但AspxTreelist返回时说,过程或函数sp_InsertTag指定的参数太多。总是