【问题标题】:Procedure or function has too many arguments specified winform c#过程或函数有太多参数指定winform c#
【发布时间】:2015-01-12 10:00:26
【问题描述】:
SqlCommand cmmd = new SqlCommand("INSERT into Vows(MemberID, VowAmount, VowDate, Description) Values (@MemberID, @vowAmount, @vowDate, @vowDesc)", con);

SqlCommand storedprocedure = new SqlCommand("UPDATEINCOME", con);
storedprocedure.CommandType = CommandType.StoredProcedure;
storedprocedure.Parameters.Add(new SqlParameter("@IncomeDate", SqlDbType.Date)).Value = vowdateTime.Text;

SqlCommand insertStoredProcedure = new SqlCommand("InsertIncomeDate", con);
insertStoredProcedure.CommandType = CommandType.StoredProcedure;

insertStoredProcedure.Parameters.Add(new SqlParameter("@IncomeDate", SqlDbType.Date)).Value = vowdateTime.Text;
insertStoredProcedure.Parameters.Add("@IncomeDate", SqlDbType.Date).Direction = ParameterDirection.Input;
insertStoredProcedure.Parameters.Add("@IncomeDate", SqlDbType.Date).Direction = ParameterDirection.Input;

这是我的代码,我收到以下错误:

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

cmmd.Parameters.AddWithValue("@MemberID", vowMemID.Text);
cmmd.Parameters.AddWithValue("@vowAmount", vowAmount.Text);
cmmd.Parameters.AddWithValue("@vowDate", vowdateTime.Text);
cmmd.Parameters.AddWithValue("@vowDesc", vowDescBox.Text);
cmmd.ExecuteNonQuery();                   

insertStoredProcedure.ExecuteNonQuery();  // error occurs here
insertStoredProcedure.Parameters.Clear();

storedprocedure.ExecuteNonQuery();    // and here
storedprocedure.Parameters.Clear();

这些是存储过程:

ALTER PROCEDURE [dbo].[UPDATEINCOME] 
    (@IncomeDate date, @VowAmount money) 
AS
    Declare @TitheAmount money
    Declare @OfferingAmount money
    Declare @IncomeTotal money

    IF NOT EXISTS (Select VowDate from Vows where VowDate = @IncomeDate)
    BEGIN
        set @VowAmount = '0'
    END
    ELSE 
    BEGIN
        set @VowAmount = (Select VowAmount from Vows where VowDate = @IncomeDate)
    END

    IF NOT EXISTS (Select OfferingDate from Offering where OfferingDate = @IncomeDate)
    BEGIN
        set @OfferingAmount = '0'
    END
    ELSE 
    BEGIN
       set @OfferingAmount = (Select OfferingAmount from Offering where OfferingDate = @IncomeDate)
    END

    IF NOT EXISTS (Select TitheDate from Tithe where TitheDate = @IncomeDate)
    BEGIN
        set @TitheAmount = '0'
    END
    ELSE
    BEGIN
       Set @TitheAmount = (Select TitheAmount from Tithe where TitheDate = @IncomeDate)
    END

    Set @IncomeTotal = @TitheAmount + @VowAmount + @OfferingAmount

    UPDATE IncomeReport 
    SET Amount = @IncomeTotal 
    WHERE IncDATE = @IncomeDate

UPDATEINCOME 存储过程更新IncomeReport 表。它将此处指定为IncomeDate 的特定日期的所有金额相加,并将总数插入IncomeReports

同时INsertDate 存储过程检查IncomeReport 表是否有'cmmd' 命令打算在其下插入金额的日期。如果没有,它还会插入从IncomeDate 获得的日期。然后,这允许UPDATEINCOME 在日期为@IncomeDate 的表中插入一个金额。

【问题讨论】:

  • 你实际上并没有显示InsertIncomeDate,所以我们无法评论参数是否合适

标签: c# sql-server winforms stored-procedures


【解决方案1】:

您正在添加两个 @IncomeDate 参数。不要那样做;p

storeproc.Parameters.Add(new SqlParameter("@IncomeDate", SqlDbType.Date)).Value = vowdateTime.Text;
...
storeproc.Parameters.Add("@IncomeDate", SqlDbType.Date).Direction = ParameterDirection.Input;

并且(正如 Sriram 在 cmets 中指出的那样):

storedprocedure.Parameters.Add(new SqlParameter("@IncomeDate", SqlDbType.Date)).Value = vowdateTime.Text;
...
storedprocedure.Parameters.Add("@IncomeDate", SqlDbType.Date).Direction = ParameterDirection.Input;

如果你愿意,你可以捕获Parameters.Add的结果:

var p = storeproc.Parameters.Add(new SqlParameter("@IncomeDate", SqlDbType.Date));
p.Value = vowdateTime.Text;
p.Direction = ParameterDirection.Input;

但是Input 是默认的无论如何

不过,坦率地说,你让这件事变得困难重重。我在这里强烈推荐一个像“dapper”这样的工具:

DateTime when = ...
decimal amount = ...
connection.Execute("UPDATEINCOME",
    new { IncomeDate = when, VowAmount = amount },
    commandType: CommandType.StoredProcedure);

工作完成

【讨论】:

  • 我对此感到非常困惑。您注意到storeprocstoredprocedure 是不同的变量了吗?两者都指向不同的命令:(
  • @SriramSakthivel 再看一遍...(我已经在编辑中澄清了)
  • 是的,我忽略了它。 OP 对 storedprocedure 变量也犯了同样的错误。
  • 引用第 4 行和第 8 行都将@IncomeDate 添加到storedprocedure
  • 简单地说:这段代码一团糟。 OP真的应该重构它。至少用换行符分隔不相关的代码块会使其更具可读性。
猜你喜欢
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2019-05-28
相关资源
最近更新 更多