【问题标题】:Procedure or function has too many arguments specified asp.net过程或函数有太多参数指定 asp.net
【发布时间】:2015-03-19 15:19:14
【问题描述】:

通过这个存储过程,我试图插入绑定到网格视图的动态创建的数据表。当我在数据表中有一行要插入时,没关系,该行已插入,但是当我在数据表中有更多行要插入时,它会给我一个错误:

过程或函数 insertMarkica 指定的参数过多。

还有我在存储过程中声明的参数@MarkicaID,当添加新行时,它会增加一个。我认为这是问题所在,当添加一行时,参数@Mar 会增加,但其余的可能不是。请帮我解决这个问题。

       ALTER PROCEDURE [dbo].[insertMarkica]
@FirmaID    tinyint,
 @Godina    smallint,
 @MarkicaID     int,
 @Datum     datetime,
 @Masa  smallint,



@Kasa tinyint
AS
   BEGIN

SET NOCOUNT ON;
DECLARE @Mar int

   Select @Mar = ISNULL(MAX(MarkicaID)+1,1)
    FROM Markici
      WHERE FirmaID = @FirmaID And Godina = @Godina and kasaid=@Kasa

     INSERT INTO Markici ( FirmaID, Godina, KasaID, Masa, MarkicaID,Datum)                
     VALUES (@FirmaID, @Godina,@Kasa,  @Masa, @Mar,@Datum)

    Select Markica = @Mar
   END

这里是数据表的参数代码

     dtCurrentTable = (DataTable)ViewState["Markici"];



            SqlCommand cmd = new SqlCommand("InsertMarkica",conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "InsertMarkica";
            foreach (DataRow dr in dtCurrentTable.Rows)
            {

                //SqlCommand cmd = new SqlCommand(cmdstr, conn);
                cmd.Parameters.AddWithValue("@FirmaID", dr["FirmaID"]);
                cmd.Parameters.AddWithValue("@Godina", dr["Godina"]);
                cmd.Parameters.AddWithValue("@Kasa", dr["KasaID"]);
                cmd.Parameters.AddWithValue("@Masa", dr["Masa"]);
                cmd.Parameters.AddWithValue("@MarkicaID", dr["MarkicaID"]);
                cmd.Parameters.AddWithValue("@Datum", dr["Datum"]);
                cmd.Parameters.AddWithValue("@VrabotenID", dr["VrabotenID"]);
                cmd.Parameters.AddWithValue("@Smena", dr["Smena"]);
                cmd.ExecuteNonQuery();
                cmd.Connection = conn;
            }

//创建dataColumns的方法表单:

private void AddDefaultFirstRecord()
    {

        //creating DataTable  
        DataTable dt = new DataTable();
        DataRow dr;
        dt.TableName = "Markici";
        //creating columns for DataTable  
        dt.Columns.Add(new DataColumn("FirmaID", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("Godina", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("KasaID", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("MarkicaID", typeof(System.Int64)));
        dt.Columns.Add(new DataColumn("Datum", typeof(System.DateTime)));
        dt.Columns.Add(new DataColumn("Masa", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("VrabotenID", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("Artikal", typeof(System.String)));
        dt.Columns.Add(new DataColumn("Cena1", typeof(System.String)));
        dt.Columns.Add(new DataColumn("Kolicina", typeof(System.Decimal)));
        dt.Columns.Add(new DataColumn("Smena", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("VkIznos", typeof(System.Decimal)));
        dt.Columns.Add(new DataColumn("VkDanok", typeof(System.Decimal)));
        dt.Columns.Add(new DataColumn("SysDatum", typeof(System.DateTime)));
        dt.Columns.Add(new DataColumn("Vid", typeof(System.String)));
        dt.Columns.Add(new DataColumn("EdMera", typeof(System.String)));
        dt.Columns.Add(new DataColumn("ArtikalID", typeof(System.String)));
        dr = dt.NewRow();
        dt.Rows.Add(dr);

        ViewState["Markici"] = dt;

        GridView2.DataSource = dt;
        GridView2.DataBind();
    }

【问题讨论】:

  • 存储过程访问的参数少于您在代码中传递的参数。
  • 已删除,但它给了我同样的错误。仅在添加一行时工作
  • 添加参数前需要调用cmd.Parameters.Clear();循环内
  • 非常感谢。这对我有帮助,现在我可以插入多行了!。

标签: mysql asp.net stored-procedures


【解决方案1】:

删除这两行:

cmd.Parameters.AddWithValue("@VrabotenID", dr["VrabotenID"]);
cmd.Parameters.AddWithValue("@Smena", dr["Smena"]); 

并且在存储过程中您已将参数定义为@MarkicaID int,因此在插入命令中通过@MarkicaID insted of @Mar

【讨论】:

  • 已删除,但它给了我同样的错误。仅在添加一行时工作
  • 如果有空值会发生。首先调用cmd.Parameters.Clear()清除所有参数值;
【解决方案2】:

您在存储过程中定义了 6 个参数,并在代码中为其提供了 8 个参数..

删除最后两个参数

ALTER PROCEDURE [dbo].[insertMarkica]
@FirmaID    tinyint,
@Godina    smallint,
@MarkicaID     int,
@Datum     datetime,
@Masa  smallint,
@Kasa tinyint

AS
   BEGIN

SET NOCOUNT ON;
DECLARE @Mar int

   Select @Mar = ISNULL(MAX(MarkicaID)+1,1)
    FROM Markici
      WHERE FirmaID = @FirmaID And Godina = @Godina and kasaid=@Kasa

     INSERT INTO Markici ( FirmaID, Godina, KasaID, Masa, MarkicaID,Datum)                
     VALUES (@FirmaID, @Godina,@Kasa,  @Masa, @Mar,@Datum)

    Select Markica = @Mar
END

代码隐藏

dtCurrentTable = (DataTable)ViewState["Markici"];



SqlCommand cmd = new SqlCommand("InsertMarkica",conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "InsertMarkica";
foreach (DataRow dr in dtCurrentTable.Rows)
{

    cmd.Parameters.Clear();
    //SqlCommand cmd = new SqlCommand(cmdstr, conn);
    cmd.Parameters.AddWithValue("@FirmaID", dr["FirmaID"]);
    cmd.Parameters.AddWithValue("@Godina", dr["Godina"]);
    cmd.Parameters.AddWithValue("@Kasa", dr["KasaID"]);
    cmd.Parameters.AddWithValue("@Masa", dr["Masa"]);
    cmd.Parameters.AddWithValue("@MarkicaID", dr["MarkicaID"]);
    cmd.Parameters.AddWithValue("@Datum", dr["Datum"]);

存储过程中未标记的额外参数(删除两者)

    //cmd.Parameters.AddWithValue("@VrabotenID", dr["VrabotenID"]); 
    //cmd.Parameters.AddWithValue("@Smena", dr["Smena"]);


    cmd.ExecuteNonQuery();
    cmd.Connection = conn;
}

或者定义 2 个参数并将其插入 [dbo].[insertMarkica] 存储过程,它不会再给你错误。

已编辑: 在分配参数之前,您还需要在每次循环执行时在循环内使用cmd.Parameters.Clear(); 清除参数。

确保提供存储过程所需的正确数量的参数以避免任何麻烦。

【讨论】:

  • 已删除,但它给了我同样的错误。仅在添加一行数据表时工作
  • 确保以正确的格式提供所有值,并且当您添加多于 1 行时,任何参数都不应为空才能正常工作。如果有任何值可能为空,那么您将需要声明一个可为空的参数
  • 因为你有动态数据,但你需要确保没有参数为空,否则它将不起作用。您的网格中有哪些值需要插入到 db 中?
  • 我已经编辑了问题,把创建列的方法放在那里,值是转换成适当格式的标签,如列。
【解决方案3】:

删除下面一行中的@sing:

cmd.Parameters.AddWithValue("@FirmaID", dr["FirmaID"]);

以及所有其他您添加的参数超过存储过程所需的参数。 并检查存储过程所需的参数。你发送的参数比需要的多

【讨论】:

  • 已删除,但它给了我同样的错误。仅在 dataTable 中添加一行时工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2019-05-28
相关资源
最近更新 更多