【问题标题】:After my connection to SQL Server using stored procedure, I am getting an error on 'ExecuteNonQuery' why?使用存储过程连接到 SQL Server 后,我在“ExecuteNonQuery”上收到错误,为什么?
【发布时间】:2018-07-12 19:35:00
【问题描述】:

我打开我的SqlConnection,然后使用 foreach 循环和我的存储过程来收集数据。我使用Parameters.AddWithValue 将数据发送到我的存储过程中,但我一直收到错误

System.Data.SqlClient.SqlException: '过程或函数 spInsertLeafPickup 指定的参数过多。

有什么理由吗?

存储过程:

CREATE TYPE Templeafpickup AS TABLE 
   (
       ID INT PRIMARY KEY,
       Address NVARCHAR(50),
       SeasonType NVARCHAR(50),
       NextPickupdate NVARCHAR(10)
   )

CREATE PROCEDURE spInsertLeafPickup
     @Templeafpickup Templeafpickup READONLY
AS
BEGIN
    INSERT INTO LeafPickup([ID], [Address], [SeasonType], [NextPickupdate])
        SELECT
            [ID], [Address], [SeasonType], [NextPickupdate]  
        FROM
            @Templeafpickup
END

C#类:

string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

using (SqlConnection con1 = new SqlConnection(cs))
{
    con1.Open();

    foreach (DataRow dr1 in dt.Rows)
    {
        SqlCommand cmd = new SqlCommand("spInsertLeafPickup", con1);
        cmd.CommandType = CommandType.StoredProcedure;

        //Insert stored procedure
        cmd.Parameters.AddWithValue("@Address", dr1["PCOMBINED"]);
        cmd.Parameters.AddWithValue("@SeasonType", dr1["PSSSTREET"]);
        cmd.Parameters.AddWithValue("@NextPickupdate", dr1["ZST"]);

        cmd.ExecuteNonQuery(); <= Error System.Data.SqlClient.SqlException: 'Procedure or function spInsertLeafPickup has too many arguments specified.'
    }

    con1.Close();
}

【问题讨论】:

  • 可以在foreach循环之外定义命令和参数。然后只需设置循环中每个参数的值即可。
  • 错误并没有更清楚。我们还想怎么向你解释???在您的 sp 定义中,您只有 1 个参数。但是您在代码中传递了 3。

标签: sql-server stored-procedures parameters sqlconnection


【解决方案1】:

您正在通过 c# 代码发送 3 个参数,但您仅在存储过程中声明了 1 个参数。请检查一下存储过程是如何定义的。 https://www.mssqltips.com/sqlservertutorial/160/sql-server-stored-procedure-tutorial/

   create proc spInsertLeafPickup
   @Address varchar, 
@SeasonType int,
@NextPickupdate date
   As 
   Begin 
   insert into LeafPickup([ID],[Address],[SeasonType],[NextPickupdate])
   Values(NEWID(),@Address,@SeasonType,@NextPickupdate]
   End

【讨论】:

  • gaurav mujhi lagha 所有三个都宣布 kerne hai?
  • 所以如果它只是一个被声明的将它只是地址?
  • 您必须在存储过程中定义所有 3 个参数,如果您根据 TempLeafPickup 表中的这 3 个值获取 ID 值,则获取它并在插入查询中使用所有这些值,或者如果您可以共享TempLeafPickup的结构解开ID之谜,那就更清楚了。
  • 让我分享一下
  • Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何 varchar 变量和参数提供长度 - 作为参数,默认为 1 个字符 长度.....
【解决方案2】:

如果 LeafPickup 的表定义具有作为 INT 和 IDENTITY 的 ID,类似于:

Create Table dbo.LeafPickup 
   (
   ID int IDENTITY(1,1) NOT NULL primary key,
   Address nvarchar(50),
   SeasonType nvarchar(50),
   NextPickupdate nvarchar(10)
   )

那么您的存储过程将不会插入 ID - 它会为您自动生成。所以存储过程是:

create proc dbo.spInsertLeafPickup
   @Address nvarchar(50), 
   @SeasonType nvarchar(50),
   @NextPickupdate nvarchar(10)
   As 
   Begin 
      insert into LeafPickup(Address, SeasonType, NextPickupdate)
      Values(@Address, @SeasonType, @NextPickupdate]
   End

【讨论】:

  • 这里要小心。您已将 varchar 定义为未定义大小的参数,默认值为 1。
  • @SeanLange 你是对的,我已经更新了我的答案。
猜你喜欢
  • 2011-04-22
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2010-09-13
相关资源
最近更新 更多