【问题标题】:SQLDataSource = "Procedure or function [Name] has too many arguments specified."" SQLDataSource = "过程或函数 [Name] 指定的参数过多。"
【发布时间】:2017-02-08 13:50:56
【问题描述】:

我不确定它是 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,它会工作的......

任何人有任何想法或任何替代方案,以便我可以使用存储过程?

谢谢

【问题讨论】:

  • 感谢您的警告,当我更改名称时仍然会出现同样的错误,但以后要考虑一下。
  • 发生这种情况时,TagList_NodeInserting 是否被第二次调用?如果是这样,它是相同的参数集合对象吗?如果是这样,您是否在通话前清除集合?即使您正在清除集合,也要实例化一个新集合。
  • 不,存储过程实际上会触发,但 AspxTreelist 返回说“过程或函数 sp_InsertTag 指定了太多参数”。一直都是。

标签: c# sql-server devexpress sqldatasource treelist


【解决方案1】:

假设您有 ID 为 SqlDataTaggingSqlDataSource 来填充树节点,如果 TagList_NodeInserting 方法多次触发,则会发生错误,因此在某个点 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");
...

相关问题:

ASPxTreeList - The 'Procedure or function [name] has too many arguments specified' exception is raised when a node is deleted(类似方法)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2014-02-08
    • 2015-12-10
    相关资源
    最近更新 更多