【问题标题】:Exception "Procedure or function expects parameter, which was not supplied." thrown even after supplying the parameter异常“程序或函数需要参数,但未提供。”即使在提供参数后也抛出
【发布时间】:2015-06-08 15:09:10
【问题描述】:

我正在尝试使用由 C# 方法调用的存储过程在数据库中插入一些条目,如下所示:

public int addProfile(UserProfile NewUserPro)
{
    DataSet ds = ExecuteStoredProcedure("AddNewPro", new SqlParameter[]{
                new SqlParameter("@UserID", NewUserPro.UsrId),
                new SqlParameter("@Type", NewUserPro.Type),
                new SqlParameter("@Phone", NewUserPro.Phone),
                new SqlParameter("@Name", NewUserPro.Name),
                new SqlParameter("@FatherName", NewUserPro.FatherName),
                new SqlParameter("@GroupID", NewUserPro.GroupID),
                new SqlParameter("@IsPublic", 0)});
            return int.Parse(ds.Tables[0].Rows[0][0].ToString());
}

ExecuteStoredProcedure() 是我创建的 C# 方法。它执行指定的存储过程并将输出作为DataSet 返回。这是该函数的定义:

public DataSet ExecuteStoredProcedure(string ProcedureName, SqlParameter[] Parameters)
{
    try
    {
         using (SqlCommand com = new SqlCommand("[dbo]." + ProcedureName))
         {
              com.CommandType = CommandType.StoredProcedure;
              foreach (SqlParameter sp in Parameters)
                   com.Parameters.Add(sp);
              return SelectDataSet(com);
         }
    }
    catch (Exception e)
    {
        throw e;
    }
}   

正如您在addProfile() 方法中看到的,我已经提供了@IsPublic 参数,但它仍然抛出以下异常:

过程或函数“AddNewPro”需要参数“@IsPublic”, 没有提供。

@IsPublic 参数是一个int 参数,它将值保存到[IsPublic] 字段,该字段是允许null 的表中的int 字段。

更新 1

我包括存储过程的输入参数。我认为这就足够了吗?如果你愿意,我可以包含完整的存储过程,但它是一个冗长的代码,并且由于某些保密原因,我不得不删减一些行。

ALTER PROCEDURE [dbo].[AddNewPro]
    @UserID int,
    @Name NVARCHAR(MAX),
    @Type int,
    @Phone VARCHAR(MAX),
    @GroupID int,
    @FatherName VARCHAR(MAX),
    @IsPublic int
AS

更新 2

好的,我找到了解决方案的一些提示。当我将断点放在ExecuteStoredProcedure 的第一行时,我发现它将@IsPublic 的值设为null。但是我在添加参数时提供了值。为什么会这样?

【问题讨论】:

  • 请在此处包含您的AddNewPro 存储过程
  • 与您的问题无关,我建议您在ExecuteStoredProcedure 中考虑一下您的try catch。它不仅没有真正的目的(它捕获并抛出所有异常),而且它没有正确地重新抛出它们。你最好去掉它。
  • @maku 我包含了输入参数声明部分。希望这就够了吗?
  • 小心使用零,阅读这篇文章stackoverflow.com/questions/8352260/…这应该是new SqlParameter("@IsPublic", Convert.ToInt32(0));
  • sql参数读取零作为对象

标签: c# .net sql-server stored-procedures sql-server-2012


【解决方案1】:

sqlparameter 读取零作为对象。

小心使用零,阅读这篇文章link

必须先将零转换为整数类型。 您的代码应如下所示。

new SqlParameter("@IsPublic", Convert.ToInt32(0));

【讨论】:

  • 高尔夫拍手!我猜它是抓住了错误的构造函数重载,但你先到了那里。
  • @EdPlunkett 你是什么意思?
  • 在我回答正确之前,我在称赞你回答正确。
  • 没问题!我猜可能是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2020-12-14
  • 2020-03-12
相关资源
最近更新 更多